デバイスのバージョン番号を表す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を除く)。返される変数がv
92
ではなく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");
}
マクロを使用しないでください。また、ハードウェアが正確で、デバイスが送信すると予想されるものが少ないことはわかりません。デバッガとスコープまたはロジックアナライザを使用します。 – Olaf
@Olafはあなたにそれについてのデバッガをアドバイスできますか? –
ツールについての質問は、明示的にオフトピックです。しかし、あなたのツールチェインに付属のデバッガを使うか、魅力的なものを使うべきです。スコープ/ LAについてはgoogleを参照してください。 – Olaf