[英]Getting noice before the right byte comes SPI RFID
我嘗試從代表設備版本號的 RFID 讀取字節。 使用 SPI 協議我得到 0x92 字節(RC522 2.0 版),請求字節是 0x37。 除了字節的位置外,一切正常。 在我按計划獲得正確的(0x92)之前,我不知道為什么要打印它。 輸出:
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
我說,好吧,讓我刪除printf("received: %x\\n", data); \\
printf("received: %x\\n", data); \\
來自 SPI.h 庫的 line。 但是后來我什么也沒打印(除了Hello World)。 另一個應該在返回 92h 時只打印"version 2.0"
函數不會這樣做,為什么 - 因為返回的v
變量是9f
而不是92
並且所有以前的都是不同的。
#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");
}
在這里,我分享了使用 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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.