【发布时间】:2017-07-19 12:23:38
【问题描述】:
我尝试从 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: %x\n", data); \
行。但后来我什么也没打印(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");
}
【问题讨论】:
-
永远不要使用函数也可以使用的宏!而且我们甚至不知道硬件是否正确,更不用说设备预期传输的内容。使用调试器和范围或逻辑分析器。
-
@Olaf 你能给我一个调试器吗?
-
询问工具显然是题外话。但是您应该使用工具链附带的调试器或适合它的调试器。有关范围/LA,请参阅 google。