C语言 在正确的字节出现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

我说,好吧,让我从 SPI.h 库中删除printf("received: %xn", data); 行。但后来我什么也没打印出来(除了Hello World(。另一个应该只打印"version 2.0"返回 92h 的函数不会这样做,为什么 - 因为返回的v变量是9f而不是92,并且之前的所有变量都不同。

#define SPI_READ(data) 
do { 
SPI_TXBUF = 0; 
SPI_WAITFOREORx(); 
data = SPI_RXBUF; 
printf("received: %xn", 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("%xn", 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.0n");     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("456n");
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;
}

最新更新