2016-11-25 11 views
3

(0x40 0x00 0x00 0x00 0x00 0x95)であるCMD0コマンドを送信したときにSTM32F303でSPIを使用してSDCardを初期化しようとしましたが、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); 

    } 

からこの出力をテストするために使用していたコードの一部です。しかし、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); 
+0

あなたは答えを持っている可能性があり、今までこの問題を解決しようとしたことを含む人のために何が起こったのか説明できますか? – mike510a

+0

申し訳ありませんが、私はあなたが意味するものを理解していません。 –

答えて

5

次のSPI転送を開始する前に、SPI転送の終了を待つ必要はありません。また、バイトごとにバッファを送信すべきではありません。バッファ全体を1回の呼び出しで送信できます。

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

2番目のパラメータはDataBufferをへのポインタです。あなたのコードは0xffを送信しませんが、0xffのメモリアドレスにあるごみを送信します。また、このような行

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

が同様にゴミデータを送信

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

アップデート:次の手順を実行し0xffを送信するために

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

私は上に示したように、1回の呼び出しで配列全体を送信するように再度提案します。

+0

_あなたのコードは0xffを送信しませんが、0xffのメモリアドレス_にあるごみは - この主な問題です。 – imbearr

+0

ありがとうBence Kaulics。私はそれを働かせるために集中的に努力しましたが、成功しませんでした。私は "HAL_SPI_Transmit"がバイトが完全に送信されていることを確認することを考慮していると思いました。あなたはstm32ファミリーで作業するための良いリファレンスをお勧めしますか?再度、感謝します。 –

+0

STM32F3のHALの例を保持しているページの最下部にダウンロード可能なzipがあります。http://www.st.com/en/embedded-software/stm32cubef3.html –

関連する問題