本帖最后由 stm1024 于 2025-1-19 22:45 编辑
OK,今日抽空测试了一下I2C接口的功能。
关于I2C接口,或者有时候被IIC接口,其通讯原理的硬件及协议的时序等,这里就不再重复了,相信很多单片机爱好者或者行业大佬在各种类型的MCU入门阶段就已经了然于胸了,这里直接切入正题。
1. 基本硬件环境
首先是可以使用i2c-tools查看咱们这个ELF2-RK3588开发板的I2C接口,i2c-tools这个工具包中提供了好几个工具,用于探测I2C总线,以及RK3588作为主控制器,向总线上的其他从设备之间交换数据。关于这个工具包的具体使用方法,我在前面RK3568、ELF-1等的评测中也有介绍到,这里不再重复凑字数,这里是传送门:I2C通讯测试:https://www.eefocus.com/forum/forum.php?mod=viewthread&tid=231513
I2C测试:https://www.eefocus.com/forum/forum.php?mod=viewthread&tid=229700
这里先试用i2cdetect检测一下有哪些I2C总线:
可以看到有很多路I2C总线,包括了i2c-0、 i2c-1、 i2c-2、 i2c-3、 i2c-4、 i2c-5、 i2c-7、 i2c-9、 i2c-10这9路(没有6和8)。
根据手册,RTC挂在I2C-5总线上,因此,我们看看第5路的总线上的设备:
可以看到0x32处具有UU的标识,也就是RTC的地址,表明此地址上既有设备也有驱动,如果只有数字,则表示检测到了设备但是没有对应驱动,出现--当然是表示没检测到设备或者驱动。
然后看看这个RTC设备的寄存器内容:
我们可以通过i2c-set或者i2c-get来修改寄存器的地址,不过之前都演示过,这里就不再重复了。
2. C语言编程
参考ELF提供的手册《系统应用编程》中的相关章节,以及所提供I2C驱动代码,我整理了一个C语言程序:
这个程序只是单纯的将设备的寄存器地址0x20中写入一个命令行传递的数据,然后回读。为什么是0x20呢?因为通过手册我们可以发现,这段地址是用户数据区域: 所以可以放心使用。
然后接着使用开发板的自带的gcc,编译,并运行看看:
因为十进制170就是十六进制的0xaa,因此认为显示数据写入及回读成功,我们使用i2cdump再看一下:
可以看到这个地址中的数据已经被得到了更新。
OK,今日测试到此为止,下次我把一些I2C的传感器翻出来以后,再整一两篇应用的测评。
|