控制/MCU
通信双方本质上是通过时序在工作,但是时序会比较复杂不利于SoC软件完成,于是乎解决方案是SoC内部内置了硬件的控制器来产生通信时序。这样我们写软件时只需要向控制器的寄存器中写入配置值即可,控制器会产生适当的时序在通信线上和对方通信。
1.结构
(1)时钟部分,时钟来源是PCLK_PSYS,经过内部分频最终得到I2C控制器的CLK,通信中这个CLK会通过SCL线传给从设备。
(2)I2C总线控制逻辑(前台代表是I2CCON、I2CSTAT这两个寄存器),主要负责产生I2C通信时序。实际编程中要发送起始位、停止位、接收ACK等都是通过这两个寄存器(背后所代表的电路模块)实现的。
(3)移位寄存器(shift register),将代码中要发送的字节数据,通过移位寄存器变成1个位一个位的丢给SDA线上去发送/接收。学过数字电路的同学应该对移位寄存器不陌生。
(4)地址寄存器+比较器。本I2C控制器做从设备的时候用。(没用过,理论分析)
2.系统分析I2C的时钟
(1)I2C时钟源头来源于PCLK(PCLK_PSYS,等于66MHz),经过了2级分频后得到的。
(2)第一级分频是I2CCON的bit6,可以得到一个中间时钟I2CCLK(等于PCLK/16或者PCLK/512)
(3)第二级分频是得到最终I2C控制器工作的时钟,以I2CCLK这个中间时钟为来源,分频系数为[1,16]
(4)最终要得到时钟是2级分频后的时钟,譬如一个可用的设置是:66000KHz/512/4=32KHz
3.主要寄存器I2CCON、I2CSTAT、I2CADD、I2CDS
I2CCON + I2CSTAT:主要用来产生通信时序和I2C接口配置。
I2CADD:用来写自己的slave address
I2CDS:发送/接收的数据都放在这里
4.I2C从设备的设备地址
(1)KXTE9的I2C地址固定为0b0001111(0x0f)
(2)I2C从设备地址本身是7位的,但是在I2C通信中发送I2C从设备地址时实际发送的是8位,这8位中高7位(bit7-bit1)对应I2C从设备的7位地址,最低一位(LSB)存放的是R/W信息(就是说下一个数据是主设备写从设备读(对应0),还是主设备读从设备写(对应1))
(3)基于上面讲的,对于KXTE9来说,主设备(SoC)发给gsensor信息时,SAD应该是:0b00011110(0x1E)
如果是主设备读取gsensor信息时,SAD应该是:0b00011111(0x1F)
5.I2C从设备的通信速率
(1)I2C协议本身属于低速协议,通信速率不能太高。
(2)实际上通信的主设备和从设备本身都有最高的通信速率限制(属于各个芯片本身的参数),实际编程时怎么确定最终的通信速率?只要小于两个即可。
(3)一般来说只能做从设备的sensor芯片本身i2c通信速率偏低,像KXTE9最高支持400KHz的频率。
全部0条评论
快来发表一下你的评论吧 !