C STM32F303上使用SPI的SD卡初始化问题

C STM32F303上使用SPI的SD卡初始化问题,c,microcontroller,stm32,spi,hal,C,Microcontroller,Stm32,Spi,Hal,当我发送CMD0命令(0x40 0x00 0x00 0x00 0x00 0x00 0x95)并试图在示波器上查看来自MOSI的信号时,我尝试在STM32F303上使用SPI初始化SD卡。我看到了不同的信号,如下所示。请注意,SPI速度为281.25kBits/s。任何帮助都将不胜感激 下面是我用来测试MOSI输出的部分代码 uint8_t cmd0[6]={0x40,0x00,0x00,0x00,0x00,0x95}; FATFS_CS_HIGH; HAL_SPI_Transmit(&

当我发送CMD0命令(0x40 0x00 0x00 0x00 0x00 0x00 0x95)并试图在示波器上查看来自MOSI的信号时,我尝试在STM32F303上使用SPI初始化SD卡。我看到了不同的信号,如下所示。请注意,SPI速度为281.25kBits/s。任何帮助都将不胜感激

下面是我用来测试MOSI输出的部分代码

uint8_t cmd0[6]={0x40,0x00,0x00,0x00,0x00,0x95};
FATFS_CS_HIGH;
HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
    for(int i=0;i<10;i++)
  {
    HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
   }

  FATFS_CS_LOW;

while(1){

      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[0], 1, 10);

      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[1], 1, 10);
      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[2], 1, 10);
      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[3], 1,10);
      HAL_SPI_Transmit(&hspi1,(uint8_t *) cmd0[4], 1, 10);
      HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[5], 1, 10);

    }
uint8_t cmd0[6]={0x40,0x00,0x00,0x00,0x00,0x95};
特别组织成员数目偏高;
HAL_SPI_传输(&hspi1,(uint8_t*)0xff,1,10);

对于(int i=0;i在启动下一个SPI传输之前,您不应该等待SPI传输结束。您也不应该逐字节发送缓冲区,您可以在一次调用中发送整个缓冲区

HAL_-SPI_传输(&hspi1,cmd0,6,10);
while(HAL_SPI_GetState(&hspi1)!=HAL_SPI_STATE_READY);

这部分代码只是发送垃圾,除了发送下一个字节之前不等待的问题:

HAL_SPI_传输(&hspi1,(uint8_t*)0xff,1,10);

对于(int i=0;我能解释一下,对于任何可能有答案的人,应该发生什么,并包括你迄今为止试图解决这个问题的方法吗?对不起,我不明白你的意思。你的代码不会发送0xff,但会在0xff内存地址发送一些垃圾-这是一个主要问题。非常感谢Bence Kaulics。我已经尝试过了我很想让它工作,但没有成功。我想“哈尔-斯皮-斯皮”注意确保一个字节被完全发送。您能推荐一些好的参考资料来使用stm32系列吗?再次感谢。页面底部有一个可下载的zip:其中包含STM32F3 HAL示例。请查看我编辑的问题Bence Kaulics。谢谢。@Abdelraheemalkour我会在某个时候查看它。
FATFS_CS_HIGH;
for (int i = 0; i < 10; i++) {
    HAL_SPI_Transmit(&hspi1, &dumb, 1, 10);
    while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
}

FATFS_CS_LOW;

HAL_SPI_Transmit(&hspi1, cmd0, 6, 10);
while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);

for (int i = 0; i < 10; i++) {
    HAL_SPI_Transmit(&hspi1, &dumb, 1, 10);
    while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
}
HAL_SPI_Receive(&hspi1, &c, 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[0], 1, 10);
HAL_SPI_Transmit(&hspi1, &cmd0[0], 1, 10);
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);