CH582m-读取TF卡

在代码移植时主要问题在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

 STM32利用SPI读写SD卡的一些程序详解 - 知乎

沁恒用MounRiver 的库函数打印时要用跟\n否则打印不出来

 

猜你喜欢

转载自blog.csdn.net/qq_45803449/article/details/126274895