目录
1、引言
最近做了一个温湿度传感器,选用温湿度传感器与原来传统用的电阻采样不同,厂家对采样进行了集成(真的只有三分之一小拇指指甲盖大小),并且以I2C的形式将温湿度信号传出。并且公司为了统一平台,选用了TI公司的280025C的芯片,以便所有产品统一化管理,没有办法,自己搞吧,先自己搭建了个简易测试板(芯片太小焊接的时候费死劲了,如果再选我肯定推荐大家不使这种太小的),现在就把整个学习IIC的经验跟各位博友做一个简单分析,希望能帮助大家。
2、IIC介绍
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。只需要两根线就能实现正常的收发数据,一根是数据线SDA,另一根是时钟线SCL。但是不适合长距离数据传输。
IIC总线模块的主要特征如下:
1)与飞利浦半导体的I2C母线标准兼容
2)支持8位格式数据传输
3)7位和10位可设地址模式
4)通用的播叫功能
5)START字节模式
6)支持多个主发送器和从接收器(此处还有人跟我抬杠,多发送器是一个竞争仲裁模式,换句话说就是看谁跑的快谁就可以当主)
7)支持多个从发送器和主接收器
8)具有主发送/接收和接收/发送模式
9)数据传输速率从10kbps到400kbps(根据所需时钟自行配置)
10)一个16位接收FIFO和一个16位传输FIFO
11)一个专用的IIC中断,中断源如下:发送数据准备好,接收数据准备好,寄存器访问准备好,没有响应接收,仲裁丢失,检测到停止条件,作为从设备寻址
12)当工作在FIFO模式,CPU可以使用另一个附件中断
13)可以使能/禁止I2C模块
14)自由数据格式模式
3、IIC原理及功能介绍
3.1IIC工作原理
SDA和SCL引脚都可以双向传出信号,在使用时都必须通过一个上拉电阻给其加正电压。当总线空闲时,两引脚均为高电平,且都采用漏极开路(经常说的“开漏”,但是TI官方给的例程配置为上拉输出模式,一直想不明白)配置以实现线与操作。在时钟信号为高电平的过程中,SDA数据必须保持稳定。只有在SCL的时钟信号为低电平时才能改变SDA数据信号的高/低电平状态,即只有时钟SCL高电平时, 数据SDA读取才有效。这样实现了SDA数据在什么时候是0什么时候是1,什么时候有效什么时候无效。
3.2 IIC模块启动和停止条件
如下所示,当模块配置为I2C总线的主模块时,由I2C模块产生启动(START)与停止(STOP)信号。START条件定义为当SCL为高电平时,SDA信号由高电平换为低电平的过程。主模块输出START条件表示数据传输开始。STOP条件定义为当SCL为高电平时,SDA信号由低电平转换为高电平的过程。主模块输出STOP条件表示数据传输结束。
如下图所示为IIC总线的7位地址数据传输格式,数据线SDA上每一位与SCL上的一个脉冲对应,且发送过程总是先发送最高有效位。传输或接收数据个数没有限制。
7位数据格式中,START信号之后的第一个字节包含7位从地址和1位R/W位,R/W位=0,主模块写数据到从地址模块。R/W位=1主模块由从模块读取数据。 第一个字节后为一个ACK位(响应信号),如果主模块发送完第一个字节后从模块发送一个响应信号,则根据R/W位状态,决定是主模块写数据到从模块还是从模块发送数据到主模块。数据位数可自由设置,发送完成再有一个接收器ACK位。
3.3时钟与仲裁
在通常情况下,只有一个主设备产生时钟信号SCL,而仲裁时可以有2个或多个主设备。为了使输出数据具有比较性,时钟必须保持同步。SCL的线与功能决定着一旦有一个设备在SCL产生低电平信号,则总线就被强制为低电平(我理解这也是为什么用开漏输出的原因)。在这个由高电平到低电平的过程中,其他设备包括总线产生的时钟强制被拉成低电平,并且只要有设备的时钟信号位低则SCL一直保持低电平。只有总线的SCL低电平状态结束,其他设备时钟的低电平状态才能结束。
如果两个或多个主发送器要同时向同一个总线发送数据,就需要启动仲裁程序。进而决定如何选取串行数据总线上的数据。如下图所示,一个主发送器将SDA置高电平,被另一个将SDA置低电平的主发送器控制。也就是说,传输得二进制数据流值小,该设备就具有优先权,如果两个或多个设备发送的数据首字节相等,则仲裁结果根据后面的数据字节决定。
4、例程与总结
程序就不再上传了,官网例程可自行研究,至于想用GPIO模拟IIC的,想借鉴IIC温度传感器采样及SCI串口通信的,可留言或私信,一并发给各位。
自学CCS及TI的TMS28系列芯片有意思也有苦恼,过程比较坎坷,最好自己搭建一个最小系统板,然后再增加外设一点点搞起,多看书,多动手,多思考,多做笔记。相信明天会更好