在GD32F450上实现GPIO-I2C-SLAVE,要求2个支持双边沿中断的GPIO。
| 测试平台 | CPU主频 | I2C速率 | 状态 |
|---|---|---|---|
| GD32F450 | 200M | 100K | OK |
| GD32F150 | 72M | 10K | OK |
核心接口和板级代码已经做分离,一个单片机可以支持n个I2C从设备。
具体见i2c_slave_0.c的有关实现,以快速拓展n个从设备处理。
提供接口支持主机写入寄存器时,对值进行检查,具体见i2c0_reg_will_changed的实现。
提供接口支持从机主动更新寄存器(参考i2c0_reg_update_poll的实现和调用方式)
修改i2c_slave_0.h中的SW_SLAVE_ADDR_7BIT即可。
支持连续写、连续读;在Linux平台验证i2c访问从机结果如下:
# i2ctransfer -f -y 0 w4@0x51 0x00 0xa1 0xa2 0xa3
# i2ctransfer -f -y 0 w1@0x51 0x00 r1
0xa1
# i2ctransfer -f -y 0 w1@0x51 0x00 r3
0xa1 0xa2 0xa3
# i2ctransfer -f -y 0 w1@0x51 0x01 r2
0xa2 0xa31、目前demo中,SDA、SCL都使用同一个ISR,请在你的实际项目中,在对应的ISR响应SDA与SCL。
2、在移植时,请修改i2c_slave.c中所有带CHECK_PORTING的函数接口。
3、可以在systick中添加i2c_tick_inc来做异常处理。实测,可以不调用i2c_sw_check_timeout;如果需要调用,需要确保i2c_sw_check_timeout的执行间隔大于10ms。
4、通讯速率建议不超过100K左右;不支持SCL展频(Spread Spectrum Clocking)。
参考的解决方法:
- 尝试降低I2C主机的速率
- 主动降低I2C主机读写的间隔,确保在完整的I2C通信结束以后再发起下次通信
- 调整从机端的编译优化选项,以从编译层面优化代码效率