通信双方本质上是通过时序在工作,但是时序会比较复杂不利于SoC软件完成,于是解决方案就是SoC内置了硬件控制器来产生通信时序。这样我们写软件时只需要向控制器的寄存器中写入配置值即可,控制器会产生适当的时序在通信线上和对方通信。
10.3.1结构框图
(1)时钟部分,时钟来源是PCLK_PSYS,经过内部分频最终得到I2C控制器的CLK,通信中这个CLK会通过SCL线传给从设备。
(2)I2C总线控制逻辑(前台代表是I2CCON、I2CSTAT这两个寄存器),主要负责产生I2C通信时钟。实际编程中药发送起始位、停止位、接收ACK等都是通过这两个寄存器(背后所代表的电路模块)实现的。
(3)移位寄存器(shift register),将代码中要发送的字节数据,通过移位寄存器变成1个位一个位的丢给SDA线上去发送/接收。
(4)地址寄存器+比较器。本I2C控制器做从设备的时候用。
10.3.2系统分析I2C的时钟
(1)I2C时钟源来源于PCLK(PCLK_PSYS,等于65MHz),经过了2级分频后得到的。
(2)第一级分频是I2CCON的bit6,可以得到一个中间时钟I2CCLK(等于PCLK/16或PCLK/512)
(3)第二级分频是得到最终I2C控制器工作的时钟,以I2CCLK这个中间时钟为来源,分频系数为[1,16]。
(4)最终要得到的时钟是2级分频后的时钟,譬如一个可用的设置是:65000KHz/512/4=31KHz
10.3.3主要寄存器I2CCON、I2CSTAT、I2CADD、I2CDS
(1)I2CCON + I2CSTAT:主要用来产生通信时序和I2C接口配置。
(2)I2CADD:用来写自己的slave address。
(3)I2CDS:发送/接收的数据都放在这里。
嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。在评论区私信“嵌入式”0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦!