在代码移植时主要问题在SPI读取TF时TI卡初始化问题:
管脚初始化,片选信号拉高拉低定义,在将spi模块初始化好之后,将spi速度设为低速模式。
********************************* 引脚定义 ************************************
* PA12 <===========> CS
* PA13 <===========> SCK
* PA14 <===========> DI/MOSI
* PA15 <===========> DO/MISO
*******************************************************************************/
#define SD_CS_PIN_LOW() GPIOA_ResetBits( GPIO_Pin_12 )
#define SD_CS_PIN_HIGH() GPIOA_SetBits( GPIO_Pin_12 )
GPIOA_SetBits( GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14 );
GPIOA_ModeCfg( GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14, GPIO_ModeOut_PP_5mA ); // MOSI/SCK/CS
GPIOA_SetBits( GPIO_Pin_15 );
GPIOA_ModeCfg( GPIO_Pin_15, GPIO_ModeIN_PU ); // MISO
SPI0_MasterDefInit();
SPI0_DataMode( Mode3_HighBitINFront ); //582m 只支持0、3模式
SPI0_CLKCfg( 60 ); //先降低SPI速率
初始化完成后,保持select脚为高电平,并向SD卡发送不低于74个时钟脉冲,此时sd卡将进入它的native operation mode(翻译为本地操作模式了),并做好接收本地指令的准备。
_card_disable(); //CS拉高
/* Power on and delay some times */
for(retry=0; retry<0x100; retry++)
{
_card_power_on();
}
/* Satrt send 74 clocks at least */
for(retry=0; retry<10; retry++)
{
_spi_read_write(DUMMY_BYTE); //DUMMY_BYTE无效字节发送最少74个脉冲,实际发送80个脉冲,SPI是按位发送。
}
/* Start send CMD0 till return 0x01 means in IDLE state */
for(retry=0; retry<0xFFF; retry++)
{
r1 = _send_command(CMD0, 0, 0x95);
if(r1 == 0x01)
{
retry = 0;
break;
}
}
发送本地指令CMD1初始化TF卡,返回值为0x01为初始化完成。发送指令时要在cs拉低后要在发送8个空闲时钟,cmd命令发送结束后(即最后标志位结束),cs拉高后要再发送8个空闲时钟。
int _send_command(uint8_t cmd, uint32_t arg, uint8_t crc)
{
uint8_t r1;
uint8_t retry;
/* Dummy byte and chip enable */
_card_enable();//取消选择,释放SPI总线
_spi_read_write(DUMMY_BYTE); //提供额外的8个时钟
/* Command, argument and crc */
_spi_read_write(cmd | 0x40);
_spi_read_write(arg >> 24);
_spi_read_write(arg >> 16);
_spi_read_write(arg >> 8);
_spi_read_write(arg);
_spi_read_write(crc);
/* Wait response, quit till timeout */
for(retry=0; retry<200; retry++)
{
r1 = _spi_read_write(DUMMY_BYTE);
if(r1 != 0xFF)
{
break;
}
}
/* Chip disable and dummy byte */
_card_disable();
_spi_read_write(DUMMY_BYTE);
return r1;
}
参考文章:
https://blog.csdn.net/xinjitmzy/article/details/53670634
沁恒用MounRiver 的库函数打印时要用跟\n否则打印不出来