在正确的字节到来之前得到通知 SPI RFID

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

我说,好吧,让我从 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");
}

在这里我分享了使用 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;
}