I2C与RFID技术:STM32固件库修改解析

需积分: 5 11 下载量 72 浏览量 更新于2024-08-06 收藏 198KB PDF 举报
"I2C方面的说明-射频识别 iso-iec_cd-18000-6c中文版详细简析" 本文主要探讨了在使用I2C通信协议时的一些注意事项,特别是在针对射频识别(RFID)系统ISO/IEC CD 18000-6C的实现中,以及在GD32国产芯片上的软件移植问题。 在I2C方面,主要涉及了两个关键知识点: 1. **I2C寻址和事件检查的修改**: 在描述中提到,当使用I2C编程时,需要修改固件库`stm32f10x_i2c.h`中的两个宏定义,将原本的`I2C_EVENT_SLAVE_TRANSMITTER_ADDRESS_MATCHED`和`I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED`的值更改为去掉高位字节的值。这是因为在某些情况下,原有的宏定义可能与特定硬件配置不符,导致I2C通信中的地址匹配和主发送模式选择事件检测出现问题。修改这两个宏可以更准确地检测到I2C事件,确保通信的正确性。 2. **I2C事件检查函数`I2C_CheckEvent`的更新**: 文档指出,在使用旧版本V3.5.0之前的固件库时,需要更新`I2C_CheckEvent`函数,以适应新的I2C状态检查需求。函数的主要作用是检查I2C控制器的状态寄存器,判断是否发生了指定的I2C事件。通过对状态寄存器的读取和比较,决定是否返回成功状态。在更新后的函数中,会更加精确地检测到I2C事件,避免因错误检查导致的通信故障。 在软件移植到GD32芯片时,有以下几点需要注意: 1. **HSE启动时间宏定义的调整**: GD32与STM32在外部高速晶振(HSE)的启动时间设置上存在差异。在V3.x库中,HSE启动超时时间宏`HSE_STARTUP_TIMEOUT`被定义在`xxx32f10x.h`头文件中,而在早期版本中,它位于`xxx32f10x_rcc.c`。由于GD32与STM32的晶振电路设计不同,需要调整这个宏的值,例如将超时时间设为`0xFFFF`,以确保HSE在GD32上能正常启动。虽然在某些情况下不修改也能运行,但为了保证系统的稳定性和兼容性,建议还是进行修改。 2. **代码执行速度的差异**: GD32芯片采用了专利技术,提高了相同工作频率下的代码执行效率。因此,从STM32移植过来的代码,如包含循环延迟的函数,其实际延迟时间会缩短。比如,一个简单的`For`循环延迟函数在GD32上执行速度更快,可能导致延时时间不足。对于对时间精度有要求的应用,需要重新评估并调整这些延时函数。 3. **I2C响应检测的适配**: 在某些情况下,如使用GPIO模拟I2C通信,检查应答信号的函数可能在GD32上无法正常工作,因为代码执行速度的差异可能导致应答检测的时机不准确。例如,客户反馈的`CheckACK`函数可能在GD32上未能正确检测到应答,这需要根据GD32的执行速度调整相关逻辑,确保I2C通信的可靠性。 移植I2C相关的代码到GD32芯片时,不仅要关注硬件层面的兼容性,还需要考虑软件执行效率的影响,适当调整代码以适应新平台的特性。同时,对晶振配置、事件检测函数和时间延迟计算等细节进行修正,以确保在GD32芯片上的功能正确性和稳定性。