2016-11-25 213 views
3

當我發送CMD0命令是(0x40 0x00 0x00 0x00 0x00 0x95),我試圖初始化STM32F303上使用SPI SD卡,我試圖看看來自MOSI在示波器上,我看到了不同的信號,如下所示。請注意SPI的速度是281.25kBits/s。任何幫助,將不勝感激。在STM32F303上使用SPI SD卡初始化問題

這裏是我使用從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); 

    } 

現在我發送正確命令,我可以看到它的範圍測試這個輸出的代碼的一部分。然而,我沒有得到SDcard(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); 
+0

你能解釋什麼應該發生的人誰可能有一個答案,也包括你試圖解決這個問題到目前爲止 – mike510a

+0

對不起,我不明白你的意思。 –

回答

5

在啓動下一個之前,您不要等待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); 
} 

第二個參數是指向的DataBuffer。您的代碼將不會發送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); 

所以我建議再次發送整個數組在一次調用,因爲我上面顯示它。

+0

_您的代碼不會發送0xff,而是位於0xff內存地址處的一些垃圾 - 這是主要問題。 – imbearr

+0

非常感謝Bence Kaulics。我已經努力嘗試,但沒有成功。我認爲「HAL_SPI_Transmit」負責確保一個字節完整發送。你會推薦任何與stm32家族合作的好參考嗎?再次感謝。 –

+0

頁面底部有一個可下載的zip文件:http://www.st.com/en/embedded-software/stm32cubef3.html,其中包含STM32F3 HAL示例。 –