微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

对 STM32

如何解决对 STM32

我有 MFRC522 (datasheet here) RFID 模块和 Nucleo 板 (F411RE)。我试图为这个模块找到一个为 STM32 制作的库,但我没有成功。我发现很少,但它们都不起作用。 (它甚至没有编译和修复错误只会让它变得更糟......)所以我决定将标准的 Arduino 库 (source code here) 移植到 STM32 上,我知道它可以正常工作。我删除了对串行函数的所有调用,并重写了 SPI 写入和读取方法以使用 HAL 而不是 Arduino 的 SPI 类。

void MFRC522::PCD_WriteRegister(PCD_Register reg,uint8_t value) {
        HAL_GPIO_WritePin(csPort,csPin,GPIO_PIN_RESET);
        HAL_SPI_Transmit(readers[reader],(uint8_t*)&reg,1,100);
        HAL_SPI_Transmit(readers[reader],&value,100);
        HAL_GPIO_WritePin(csPort,GPIO_PIN_SET);
}

uint8_t MFRC522::PCD_ReadRegister(PCD_Register reg) {
        uint8_t data;
        uint8_t zero = 0x00;
        uint8_t addr = 0x80 | reg;
        HAL_GPIO_WritePin(csPort,&addr,100);
        HAL_SPI_TransmitReceive(readers[reader],&zero,&data,GPIO_PIN_SET);
        return data;
}

我正在使用此代码读取卡片:

bool readID() {
  if (!rfid.PICC_IsNewCardPresent()) {
    return false;
  }
  if (!rfid.PICC_ReadCardSerial()) {
    return false;
  }
  for (int i = 0; i < 4; i++) {
    lastId[i] = rfid.uid.uidByte[i];
  }
  rfid.PICC_HaltA();
  return true;
}

但问题是,PICC_IsNewCardPresent() 方法总是返回 false。使用调试器我设法发现问题是 PCD_CommunicateWithPICC 方法

uint16_t i;
for (i = 2000; i > 0; i--) {
        uint8_t n = PCD_ReadRegister(ComIrqReg);        // ComIrqReg[7..0] bits are: Set1 TxIRq RxIRq IdleIRq HiAlertIRq LoAlertIRq ErrIRq TimerIRq
        if (n & waitIRq/*constant 0x30*/) {                                    // One of the interrupts that signal success has been set.
                break;
        }
        if (n & 0x01) {                                         // Timer interrupt - nothing received in 25ms
                return STATUS_TIMEOUT;
        }
}

结束于

return STATUS_TIMEOUT;

循环甚至没有第二次运行......我在我的示波器上捕获了读取 ComIrqReg 寄存器的情况,STM32 发送了 0x88,它与读取的 ComIrqReg 请求相对应,IC 以 0x45 响应。我在调试器中检查了 n 变量值,它也读取了 0x45,所以我的读取方法可能不是问题。

Picture of the captured communication

我还查看了模块的初始化,并检查了几个字节是否与应该发送的字节相对应,对我来说也很好。

Picture of the captured initialization

0x45 的读取值为 0b01000101,即 n&0x01 为 0b1 例如。 true 并返回 STATUS_TIMEOUT ... 我需要让第 5 个或第 6 个 LSB 为真。

您知道为什么模块总是返回 0x45 值吗?我什么也想不出来……模块 100% 工作(用 Arduino 确认)所以问题必须出在 STM32 部分。你会尝试什么?

感谢您的帮助!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。