rxAlign参数在MFRC522库中的PCD_ReadRegister函数中的功能

我正在尝试将MFRC522 arduino库(从 github )移植到ARM MCU。 我的问题是在PCD_ReadRegister函数中:

/**
 * Reads a number of bytes from the specified register in the MFRC522 chip.
 * The interface is described in the datasheet section 8.1.2.
 */
void MFRC522::PCD_ReadRegister( byte reg,       ///< The register to read from. One of the PCD_Register enums.
                                byte count,     ///< The number of bytes to read
                                byte *values,   ///< Byte array to store the values in.
                                byte rxAlign    ///< Only bit positions rxAlign..7 in values[0] are updated.
                                ) {

    if (count == 0) {
        return;
    }
    //Serial.print(F("Reading "));  Serial.print(count); Serial.println(F(" bytes from register."));
    byte address = 0x80 | (reg & 0x7E);    //MSB == 1 is for reading. LSB is not used in address. Datasheet section 8.1.2.3.
    byte index = 0;                        //Index in values array.
    SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV4, MSBFIRST, SPI_MODE0));//Set the settings to work with SPI bus
    digitalWrite(_chipSelectPin, LOW);     //Select slave
    count--;                               //One read is performed outside of the loop
    SPI.transfer(address);                 //Tell MFRC522 which address we want to read
    while (index < count) {
        if (index == 0 && rxAlign) {       //Only update bit positions rxAlign..7 in values[0]
           //Create bit mask for bit positions rxAlign..7
            byte mask = 0;
            for (byte i = rxAlign; i <= 7; i++) {
                mask |= (1 << i);
            }
           //Read value and tell that we want to read the same address again.
            byte value = SPI.transfer(address);
           //Apply mask to both current value of values[0] and the new data in value.
            values[0] = (values[index] & ~mask) | (value & mask);
        }
        else {//Normal case
            values[index] = SPI.transfer(address); //Read value and tell that we want to read the same address again.
        }
        index++;
    }
    values[index] = SPI.transfer(0);           //Read the final byte. Send 0 to stop reading.
    digitalWrite(_chipSelectPin, HIGH);        //Release slave again
    SPI.endTransaction();//Stop using the SPI bus

}//End PCD_ReadRegister()

I Read Datasheet several times & can't understand whats function of his parameter! Based on datasheet for reading a register from rc522 : enter image description here

1

1 答案

关于你关于'SPI读取数据'的帖子中的图像,简单地说是通过MISO接收的第一个字节被丢弃,这在 PCD_ReadRegister()中直到 for 之前完成循环,然后读取 n 字节,最后一次调用0以停止读取。

快速查看库和数据表显示 rxAlign 参数用于标识第一个接收字节中的第一个有效位。 txLastBits 用于类似目的,仅用于传输最终字节。两者都写入MFRC522的 BitFramingReg ,并且是MFRC522和卡/标签之间的面向位的帧所必需的。

例如,在上面的函数中,如果 rxAlign = 3 ,则表示只有第7位到第3位在第一个接收字节中有效,用位掩码 11111000 </代码>。因此,第一个有效'字节'包括第一个接收字节的第7到3位,与下一个接收字节的第2-0位连接。类似地,在传输中, txLastBits 指示要发送到卡/标签的最后一个字节的位数。在这两种情况下,通过RF字段发送或接收的内容可能不是8的倍数,因此需要这些参数和 BitFramingReg

无论如何,这不应该干扰移植库。只需替换特定于Arduino的函数/接口,并允许库的现有逻辑保持原样。


修改

我会尽力回答你的问题:

  • 在此上下文中,106kBd表示RC522与卡之间的数据速率,而不是RC522与MCU之间的数据速率。我认为,最大值约为848kBd。有关详细信息,请查看数据表。
  • 防冲突过程的位强化帧必要。曼彻斯特编码中的叠加比特,当多个卡一次尝试与RC522通信时,需要处理各个比特而不是通常的字节大小的单元。查找防碰撞技术。
  • 如果同一个阅读器可能在其范围内有多个标签,则必须进行防冲击。来自IEEE文章:

标签冲突会对RFID系统造成严重的低效率,导致识别率低,读取范围短,资源利用效率低下。由于功率和功能的限制,它们在无源标签中存在问题。

因此,如果您一次只展示一张卡片,那么您应该安全无需在代码中实施防冲突。否则,我担心你别无选择,除非你想让读者迷惑。

如果您只想读取UID并读取/写入卡上的块(一次一个),您可能想尝试移植这个直接 MFRC522 UART库,顺便说一下,它没有实现anitcollision。

如果您仍想要移植基于SPI的库,那么,请提出一些建议:

您想用UART替换SPI接口。这是一个低级的东西,都包含在一些函数中,如 PCD_ReadRegister()PCD_WriteRegister()等等。这些函数提供更高级别的函数,这些函数没有内部实现的线索,但期望它们具有某些行为。只要您了解如何通过UART与读卡器通信,就可以将SPI功能换成其UART等效功能。一旦您的ARM UART功能与SPI功能完全相同,您的工作即将完成;没有必要在高级函数中学习所有东西的原因,因为它们与任何特定于接口的东西都没有关系。这包括与 rxAlign 等有关的所有内容。祝好运 :)。

0
额外
@MahmoudHD我编辑了我的答案。
额外 作者 TisteAndii,
@MahmoudHD这有帮助吗?你有没有过去?
额外 作者 TisteAndii,
@MahmoudHD你不再移植到UART了吗?
额外 作者 TisteAndii,
亲爱的Tiste,非常感谢您的精彩描述。问题是我必须更改库使用的连接外设从SPI到UART.3新问题:1 - 基于数据表第46页 - 表48:这些位仅用于按位防冲突在106 kBd,对于所有其他模式,它们被设置为0.然后在uart默认9600波特率我可以避免这种情况吗?2秒问题是我明白做了什么,但我不知道为什么我们这样做呢?为什么字节不像往常那样形成并且从第一位开始无效?为什么在数据流的开头有可避免的位?3 - 这在UART模式下是否也是必要的?
额外 作者 asti,
亲爱的Tiste,非常感谢您的出色指导,我正在努力将这个芯片的官方SPI arduino库移植到我的目标MCU,我将在这里提出新的问题,WBR。
额外 作者 asti,
其实我的意思是,我正在尝试移植SPI版本( github.com/miguelbalboa/rfid )用UART初始化。现在我们正处于新年假期之后,我将继续为LPC ARM MCU,WBR移植它。
额外 作者 asti,