gpt4 book ai didi

c - 在 STM32F303 上使用 SPI 的 SD 卡初始化问题

转载 作者:太空狗 更新时间:2023-10-29 16:10:43 26 4
gpt4 key购买 nike

当我发送 CMD0 命令(0x40 0x00 0x00 0x00 0x00 0x95)时,我试图在 STM32F303 上使用 SPI 初始化 SDCard,我试图在示波器上查看来自 MOSI 的信号,我看到了不同的信号如下所示。请注意 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);

}

现在我正在发送正确的命令,我可以在示波器上看到它。但是,我没有从我正在使用的 SD 卡(SanDisk Ultra 40MB/s ...16GB)收到 0x01 响应(我一直收到 0xff)以下代码:

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);

最佳答案

您无需等待 SPI 传输结束即可开始下一个传输。您也不应该逐字节发送缓冲区,您可以在一次调用中发送整个缓冲区。

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

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

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);
}

第二个参数是指向数据缓冲区的指针。您的代码不会发送 0xff,而是发送一些位于 0xff 内存地址的垃圾。

要发送 0xff,请执行以下操作:

uint8_t value = 0xff
HAL_SPI_Transmit(&hspi1, &value, 1, 10);
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);

更新:

还有这样的行:

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

也发送垃圾数​​据。

cmd0[0] 将返回数组的第一个元素(数据),即 0x40,然后将其转换为 uint8_t*,并将其作为指向数据缓冲区的指针传递给HAL_SPI_Transmit函数。因此,将要发送的实际数据是 0x40 内存位置的一些随机值。

例如,数组中某个字节的地址是&cmd[0]。请注意返回地址的 & 运算符。正确的调用是:

HAL_SPI_Transmit(&hspi1, &cmd0[0], 1, 10);
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);

所以我再次建议如上所示在一次调用中发送整个数组。

关于c - 在 STM32F303 上使用 SPI 的 SD 卡初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40797299/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com