IIC介绍(三)之主机介绍
来源:互联网 发布:拜占庭东罗马知乎 编辑:程序博客网 时间:2024/06/06 11:40
IIC可以分为三个部分,分别是IIC总线、IIC主机和IIC从机。这里对IIC主机进行简要介绍。
本文以STM32F40X和S3C2440的IIC控制器为例来介绍。
首先简要介绍STM32F40X的IIC框图。
由上图可知,在STM32F40X中,IIC的SCL线的时钟信号是由IIC接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率。CCR寄存器中12位的配置因子CCR与IIC外设的输入时钟源(PCLK1)共同作用来产生SCL时钟。
IIC的SDA信号来源于数据移位寄存器,而数据移位寄存器的数据来源于数据寄存器(DR)、地址寄存器(OAR)以及PEC寄存器。
最终,IIC的工作模式是根据配置的控制寄存器(CR1/CR2)的参数而改变。而当IIC工作时,“状态寄存器(SR1和SR2)”会根据IIC的工作状态而被控制逻辑所改变。因此,IIC的工作状态便可通过读取状态寄存器相关的寄存器位而获得。
由上图可知,在芯片发出对应信号后,如果IIC总线上发生了对应的响应,则状态寄存器的对应位会被改变,比如:
当STM32芯片产生起始信号后,事件“EV5”便会发生,也就是说SR1寄存器的“SB”会被置1来表示起始信号已发送;
当从机对主机所发送的信号产生响应时,事件“EV6”和事件“EV8”便会发生,也就是说SR1寄存器的“ADDR”位和“TXE”位会被置1;
往IIC的“数据寄存器DR”写入要发送的数据,则TXE位会被重置为0,而在IIC将DR中的数据通过SDA信号线发送出去后,“EV8”事件便会发生,也就是说TXE位会被置1,如果此时ITEVFEN和ITBUFEN这两位均置1,则STM32芯片便会产生一个中断。重复上述过程便可实现多字节数据的发送;
如果在上次数据传输结束前TXE已置1但数据尚未写入DR寄存器中,则BTF位会被置1,而接口会延长SCL的低电平,直到IIC_DR寄存器被写入,从而将BTF位清零。
在发送数据完成后,当IIC总线发生了上述的”EV8_2“事件后,软件会将STOP位 置1 从而生成一个停止位。
与之类似的,当stm32芯片作为主接收器时,它的示意图如下:
其中,EV5、EV6、EV7和EV9都可在软件未完成时保持SCL为低电平来等待软件完成对应的事件。
然后介绍一些S3C2440的IIC框图
上面两幅图分别为S3C2440作为主机时发送模式下和接收模式下的两个流程图,可以发现其数据之间的衔接是通过中断来判断。
而S3C2440的数据传输与接收的格式如下:
可以发现其与STM32的传输格式基本一致。
小结:
在裸机的情况下,S3C2440的IIC与STM32的IIC传输机制基本一致,不过是S3C2440偏向于通过中断来进行数据传输过程中状态的判断,而STM32是直接通过一定的事件来进行判断,但实质两者的区别不大。
- IIC介绍(三)之主机介绍
- IIC介绍(一)之物理层介绍
- IIC介绍(二)之协议层介绍
- IIC介绍(四)之从机介绍
- IIC介绍
- IIC 简单操作介绍
- IIC设备驱动程序介绍
- iic总线介绍
- IIC总线介绍
- IIC总线介绍
- Linux-IIC驱动(1)-IIC总线介绍
- crc介绍之三
- crc介绍之三
- 【协议】IIC总线协议介绍
- GREENPLUM介绍之数据库管理(三)
- Zookeeper之Zab协议介绍(三)
- stm8s开发(八) IIC的使用:IIC主机通信!
- Linux-IIC驱动(2)-Linux下IIC子系统的介绍
- Python 乱码,系统默认编码
- 001-第一个C程序,hello
- Java后台框架篇--使用SpringSocial 连接社交网络
- 一些爱不释手的 Chrome 插件
- Mysql安装步骤(1)源码编译
- IIC介绍(三)之主机介绍
- itk中创建一个图像数据
- oracle数据结构
- 洛谷 P3383 【模板】线性筛素数
- 使用VS2013编写Python程序时出现编码问题的解决办法
- 欢迎使用CSDN-markdown编辑器
- OpenStack 存储服务 Cinder存储节点部署NFS
- 利用Qt进行接口间通信
- Java移动框架篇--Spring mobile简单试用