2017-07-19 7 views
-1

デバイスのバージョン番号を表すRFIDからバイトを読み取ろうとしています。 SPIプロトコルを使用して私は0x92バイト(RC522バージョン2.0)を取得し、要求バイトは0x37です。バイトの位置以外はすべてうまく動作します。私が正しいもの(0x92)を得る前に、なぜそれが印刷されているのかわからない。出力:正しいバイトが来る前にガーベッジデータを取得するSPI RFID

 Hello, world 
received: 1 
received: 92 
= v2.0 
received: 0 
received: 92 
= v2.0 
received: 0 
received: 92 
= v2.0 
received: 0 
received: 92 
= v2.0 
received: 0 
received: 92 
= v2.0 

は、私にはよく[OK]を、私はちょうど​​linefromにSPI.hライブラリを削除してみましょう、と述べました。しかし、私は何も印刷されません(Hello Worldを除く)。返される変数がv92ではなく9fであり、前の値がすべて異なるため、92hが返されたときにのみ"version 2.0"を出力しなければならない別の関数です。

#define SPI_READ(data) \ 
    do { \ 
    SPI_TXBUF = 0; \ 
    SPI_WAITFOREORx(); \ 
    data = SPI_RXBUF; \ 
    printf("received: %x\n", data); \ 
    } while(0) 

RC522にコマンドを実行させるには、機能のような待ち時間や遅延が必要なのでしょうか?そしてそれを印刷させた直後。しかし、それが起こったとしても、なぜprintfの削除が出力全体を破壊するのでしょうか?ここでSPI_READから呼び出されているコードは次のとおりです。

static uint8_t 
read_register_rfid(uint8_t dev_cmd) 
{ 
    uint8_t ret = 0; 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    SPI_WRITE(((dev_cmd << 1) & 0x7e) | 0x80); 
    SPI_READ(ret); 
    GPIO_SET_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    return ret; 
} 

とバージョンをチェックする機能:

ここ
void 
test_ver() 
{ 
    uint8_t reg=1; 
    // Get the MFRC522 firmware version 
    uint8_t v = 0; 
    while(reg!=0xa){ 
    v = read_register_rfid(0x37); 
    //printf("%x\n", v); 
    // Lookup which version 
    switch(v) { 
     case 0x88: printf(" = (clone)"); break; 
     case 0x90: printf(" = v0.0");  break; 
     case 0x91: printf(" = v1.0");  break; 
     case 0x92: printf(" = v2.0\n");  break; 
     // default: printf(" = (unknown)\n"); 
    } 
    reg++; 
    //When 0x00 or 0xFF is returned, communication probably failed 
    } 
    if ((v == 0x00) || (v == 0xFF)) 
    printf("WARNING: Communication failure?\n"); 
} 
+0

マクロを使用しないでください。また、ハードウェアが正確で、デバイスが送信すると予想されるものが少ないことはわかりません。デバッガとスコープまたはロジックアナライザを使用します。 – Olaf

+0

@Olafはあなたにそれについてのデバッガをアドバイスできますか? –

+0

ツールについての質問は、明示的にオフトピックです。しかし、あなたのツールチェインに付属のデバッガを使うか、魅力的なものを使うべきです。スコープ/ LAについてはgoogleを参照してください。 – Olaf

答えて

0

私は、SPIライブラリを使用してRC522に読み書きするために更新された機能を共有:

void 
writeMFRC522(uint8_t adr, uint8_t val) 
{ 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    SPI_WRITE((adr << 1) & 0x7e); 
    SPI_WRITE(val); 
    SPI_FLUSH(); 
    //printf("456\n"); 
    GPIO_SET_PIN(GPIO_C_BASE, GPIO_PIN_1); 
} 


static uint8_t 
readMFRC522(uint8_t dev_cmd) 
{ 
    uint8_t ret = 0x0; 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    GPIO_CLR_PIN(GPIO_C_BASE, GPIO_PIN_1); 

    SPI_WRITE(((dev_cmd << 1) & 0x7e) | 0x80); 
    SPI_READ(ret); 

    ret = 0; 
    SPI_WRITE(0x00); 
    SPI_READ(ret); 

    GPIO_SET_PIN(GPIO_C_BASE, GPIO_PIN_1); 
    return ret; 
} 
+0

マクロのすべての 'printf();'変更を削除しました –

関連する問題