I2C串行总线(精选6篇)
I2C串行总线 第1篇
本文介绍一种采用MAX7348的串行I2C总线的键盘电路以及驱动程序的设计。
I2C需要连线少, 仅需一条串行时钟线和一条串行数据线。允许多主机控制, 具有裁决和同步功能, 可随意添加或摘除总线上的子器件等诸多优点, 所以已经被广泛应用。
二、MAX7348
MAX7348是美国MAXIM公司生产的2线接口、低EMI键盘开关和发声控制器, 可监控多达40个按键, 可对按键去抖并保存在FIFO中, 去抖时间用户可在9~40ms之间任意设置, MAX7348自带的音调发生器在控制器的作用下可自动发出按键声和报警声, 在发声期间, 输出还可以设置为高电平或低电平, 以驱动电子发声器、继电器或指示灯。芯片采用400Kps, 5.5V容限2线串行接口, 工作电压2.4~3.6V, 4个I2C地址选择。与MAX7348同系列的还有MAX7347和MAX7349等。
1.引脚图
如图1所示, SDA、SCL分别是兼容I2C串行总线的数据、时钟接口, 使用时通常需要接一个典型值为4.7kΩ的上拉电阻;ROW0~ROW8为键盘矩阵行输入端口, 不用时开路;COL0~COL4为键盘矩阵列输出端口;SOUNDER为发声器输出端口, 该输出为推挽结构, 通常与地之间接一个压电陶瓷片或其他发声设备;INT为中断输出端口;ADO为地址输入端口, 用来设置器件的从地址, 该引脚接GND、V+、SDA、SCL可形成4种逻辑组合构成MAX7348的4个可选的I2C地址, 如表1;GND为接地端, V+接电源 (2.4~3.6V) 。
2.主要内部寄存器
(1) 按键FIFO寄存器 (00H) 该寄存器包含与按键FIFO状态有关的信息, 以及那些经过去抖的事件信息, 该寄存器的D0~D5位表示按键中的那些键已去抖, D6指明当前去抖按键是否是FIFO中的最后一个;D7位是溢出标志, 它表示按键FIFO是否溢出。读按键扫描FIFO将清除中断信号, 但是只有通过执行足够次数的读操作清空FIFO后才能再次产生中断 (INT) 信号。
(2) 去抖寄存器 (01H) 该寄存器用来设置每一个去抖周期的时间, 以及使能和禁用GPO端口, 其中D0~D4位用来在9~40ms范围内设置去抖时间, 步长1ms, D5~D7用来设置使能那一个GPO端口 (表2) 。
(3) 自动重复寄存器 (02H) 该寄存器用来设置自动重复频率及其延时。当按键按下且没有释放时, 自动重复功能允许连续触发按键事件。自动重复延时规定了第一次按下按键与开始重复之间的时间 (如果按键没有释放) 。自动重复频率规定了自动重复开始后按键事件连续触发的速度。D0~D3设定自动重复延时, 范围从8个去抖周期到128个去抖周期。D4~D6位规定重复频率, 范围是4到32个去抖周期, D7位是自动重复功能使能位 (如表3所示) 。
(4) 中断寄存器 (03H) 该寄存器包含与中断请求功能设置有关的信息, 以及INT输出的状态, INT输出也可配置为GPO。中断寄存器是只读寄存器, 向该寄存器写入数据无效。
(5) 配置寄存器 (04H) 该寄存器反映发声器的状态、控制I2C总线超时、使能报警输入中断、使能发声器对报警输入和按键去抖时间做出响应, 以及控制器件关断等。该寄存器结构如表4所示, 除D1、D2设定发声器输出状态外, 其余每一位对应一个控制状态, 用户可根据需要使能 (置“1”) 或禁止 (置“0”) 。
(6) 按键发声寄存器 (06H) 如果配置寄存器 (04H) 中使能按键发声, 那么当一个键或一组键去抖后, 发声控制器将发出声音, 并由按键发声寄存器设定发声的时间和频率。
除以上几个主要寄存器外还有端口寄存器、报警声寄存器、发声器寄存器等多个寄存器, 这些寄存器主要用于控制发声器和扩展GPO端口, 在此不做详细叙述, 感兴趣的读者可以自行查阅有关MAX7348的技术资料。
三、电路设计
图2是笔者设计的MAX7348应用电路, 该电路以凌阳 (SPCE061A) 单片机为主控制器, 结合MAX7348构成了一个具有40个按键的键盘电路, 通过程序可以设置按键发声、自动连续按键、中断输出等功能。MAX7348的SDA、SCL、INT分别与SPCE061A单片机的IOB0、IOB1、IOB2 (注:SPCE061A单片机的IOB2为外部中断1的输入口) 连接, 由于I2C总线允许挂接多个从机, 所以在实际使用中, 可以将多个不同从机地址的设备挂接在同一总线上, 为单片机节约大量的硬件资源。
四、软件编写
在图2所示的键盘电路中, 由于MAX7348只具有兼容的I2C接口, 而SPCE061A单片机本身不具备I2C接口, 要实现二者之间的数据传输, 通常采用通用IO口软件模拟I2C的方式来实现。图3是MAX7348的总线时序。
由图3所示的时序图可以看出, 用软件模拟I2C总线的传输时序, 大致要经历构造开始条件、发送从机地址 (含读写标志位) 、等待从机响应、发送 (或读取) 1个字节数据 (或命令) 、
源程序请从www.ele169.com下载。
笔者编写的模拟I2C总线驱动程序, 经过多次调试, 程序符合I2C总线传输时序要求, 与I2C总线设备通讯可靠, 但需要注意的一点是:以上代码是在SPCE061A单片机默认时钟频率 (24M) 的情况下编写的, 如果采用较高的系统时钟, 需要在部分代码中间添加一些延时程序, 否则会出现数据丢失, 造成通讯错误。
五、小结
I2C串行总线 第2篇
基于以上情况, 该文提出了一种基于单片机为核心挂接两个带有I2C接口的温度传感器组建温度采集系统, 并通过液晶显示器显示出来。
系统设计分为硬件电路设计和软件及仿真设计两大部分。
1系统硬件电路设计
硬件电路的设计包括了温度传感器的选型、单片机的选型、液晶显示器的选型及其部件之间的电连接。
温度传感器选用DS1621温度传感器, DS1621是由DALLAS公司生产的一种功能非常强的数字式温度传感器。通过读取内部的计数值和用于温度补偿的每摄氏度计数值, 利用公式计算还可提高温度值的精度。DS1621无需外围元件即可测量温度, 将结果以9位数字量 (两字节传输) 输出, 测温范围为-55 ℃~+155 ℃, 精度为0.5 ℃, 转换时间为1 s, 数据的写入和读出通过一个2线I2C串行接口完成。
I2C总线 (Inter Integrated Circuit BUS, 内部集成电路总线) 是由PHILIPS公司开发的一种两线式串行总线, 用于连接微控制器及其外围设备。I2C总线由数据线SDA与时钟SCL构成串行总线, 可用于发送与接收数据。数据可以在CPU与被控IC芯片之间、IC芯片与IC芯片之间进行双向传送, 最高传送速率可100 kb/s。
该设计选择M C S - 5 1系列的一款通用M C U芯片 — STC89C52, 其本身并没有I2C接口电路, 但可以通过软件来模拟I2C接口。采用2片DS1621采集温度, 将第一片地址连接成000 (A2A1A0均接低电平) , 将第二片地址连接成001 (A2A1接低电平, A0接高电平) 。STC89C52芯片的并行引脚P2.6和P2.7连接到温度传感器DS1621的SDL和SCL总线。
液晶显示器选用了LCD1602, 温度采集的结果通过LCD1602切换轮流显示出来, LCD1602的数据线连接至MCU的P3口。
该系统总体结构如图1所示, 以单片机STC89C52为核心, 由电源电路、时钟电路、复位电路、温度传感器 (2个) 和LCD1602液晶显示构成。
2软件设计及仿真
熟悉LCD1602的命令集及编程思路后, 在keil软件上进行软件设计, 软件分为多个文件, 包含LCD1602和DS1621芯片的驱动程序和主程序。将程序按其逻辑划分为多个模块, 这样可以使软件结构看起来更清晰, 且容易维护。
主程序设计如下所示。
unsigned char s[10], i, a[2];//数组s存放显示的字符串, a存放DS1621的地址
a[1]=‘ ’;//用于显示
Lcd1602_Initialize () ;
Lcd1602_Write (1, 0, "th temp (c) :") ;
for (i=0;i<2;++i) //初始化2个DS1621
{
Ds1621_Set Device Address (i) ;
Ds1621_Write Config (0x03) ;
Ds1621_Set Temperature Limit (40, 35) ;
}
同时在Proteus软件绘制系统硬件电路图, 并与Keil软件实现联调, 仿真结果如图2和图3所示, 图2为第一片温度传感器的温度实时值, 图3为第二片温度传感器的温度实时值。
3结语
该设计实现了两点温度的测量系统, 传感器DS1621集成度高, 直接输出数字信号, 通过I2C总线实现信号传输, DS1621的选用简化了电路设计、方便了程序设计。以STC89C52单片机为系统核心, 使系统结构简单、且易于实现。系统带有的液晶显示器LCD1602使人机交互更加友好。 该系统可应用于诸多温度采集的场合使用。
摘要:温度是工农业生产中一个普遍而又重要的参数。因此, 对于温度这个参数的测量与控制就显得尤为重要。该文设计了基于I2C串行总线的两点温度测量系统, 阐述了I2C总线的特点及基本原理, 选用了STC89C52单片机为系统的核心, 并设计了单片机的时钟电路、复位电路和电源电路, 选用了DS1621温度传感器采集环境温度, 选用了液晶显示器LCD1602显示采集到的温度值, 并进行了单片机端口的选择和各器件之间的连接, 进行了LCD1602和DS1621芯片的驱动程序和主程序的编写, 并进行了仿真。
关键词:STC89C52,I2C,DS1621,液晶显示器
参考文献
[1]彭芬.单片机C语言技术应用技术[M].西安:西安电子科技大学出版社, 2012.
[2]梁森.自动检测与转换技术[M].北京:机械工业出版社, 2012.
[3]乌云高娃.C语言程序设计[M].北京:高等教育出版社, 2012.
利用GPIO模拟I2C总线协议 第3篇
1.1 I2C总线介绍
I2C是由Philips公司发明的一种串行数据通信协议。由于其通信方式具有很多优秀的特点, 比如只使用2跟信号线, Serial Clock (简称SCL) 和Serial Data (简称SDA) 。并且采用了总线结构, 一条总线可以连接一主和多从器件或者多主跟多个从器件。
I2C总线结构中有1或多个Mas te r, 可以有1个或多个Slave。一般来说经常使用的是一个Masetr和多个Slave构成。各个Slave设备以可以以7位地址或10位地址区分, 经常使用的是7位地址, 后面再跟1位读写位, 表示读 (=1) 或者写 (=0) , 所以我们有时也可看到8位形式的设备地址。一般来说, 从设备 (s lave) 地址的高4位都在出厂时就确定了, 不同类型的设备, 高4位是绝对不同的。而低3位一般由器件管脚A0, A1, A2的电平来确定。I2C通信的数据传输有着严格并且固定的格式。
1.2 利用普通I/O模拟I2C
I2C总线传输有严格的数据定义, 一个7为地址传输方式的传输过程如下图 (1) 所示:
对于传输过程中的状态对应的电平信号, 分为几种。
1) 无数据:SCL=1, SDA=1;
2) 开始位 (Start) :当SCL=1时, SDA由1向0跳变;
3) 停止位 (Stop) :当SCL=1时, SDA由0向1跳变;
4) 数据位:当SCL由0向1跳变时, 由发送方控制SDA, 此时SDA为有效数据, 不可随意改变SDA, 当SCL保持为0时, SDA上的数据可随意改变;
5) 地址位:定义同数据位, 但只由Mas te r发给Slave;
6) 应答位 (ACK) :当发送方传送完8位时, 发送方释放SDA, 由接收方控制SDA, 且SDA=0;
7) 否应答位 (NACK) :当发送方传送完8位时, 发送方释放SDA, 由接收方控制SDA, 且SDA=1。
一般来说, 上述总线的控制由I2C总线控制器来完成。但由于有些器件具备的I2C接口没有或者很少, 这就需要普通I/O口扮演时钟线和数据线的角色, 由软件模拟I2C协议来完成通信的需求。
2 操作过程及分析
2.1 模拟方法如下
首先定义时钟数据电平宏, 后面可以添加自己的I/O电平函数, 这样便于移植各种系统。
在此需要注意的是:由于I2C传输数据很快, 每bit只需要几个ns就行, 所以延时函数可以采用一个简单的for循环就行了, 不需要采用定时器的方式。
2.2 发送数据
首先编写好发送一个字节的时序。
bool GPIO_Se nd Byte (uns igne d charuc Data)
{
uns igne d chari;
uns igne d char Mas k[]= {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
for (i= 0;i< 8;i+ +)
{
GPIO_SCL_LOW;/* 拉低时钟 */
if (uc Data&Mas k[i]) /* 发送数据 */
{
GPIO_SDA_HIGH;
}
e ls e
{
GPIO_SDA_LOW;
}
I2C_DELAY; /* 延时以保证数据线稳定 */
GPIO_SCL_HIGH;
}
GPIO_SCL_LOW; /* 开始准备接受 ACK*/
I2C_DELAY;
GPIO_SCL_HIGH;
if (GPIO_GET_SDA)
{
re turn fals e;// 收到 NACK
}
e ls e
{
re turn true;// 收到 ACK
}
}
其次再编写发送字节序的函数
GPIO模拟I2C发送数据的函数就完成了, 当然接收数据的函数, 只要在时钟电平由低变高的时候检查数据电平就行了。
3 注意事项
1) SCL一直由Mas te r控制, SDA依照数据传送的方向, 读数据时由Slave控制SDA, 写数据时由Master控制SDA。当8位数据传送完毕之后, 应答位或者否应答位的SDA控制权与数据位传送时相反。
2) 开始位“Start”和停止位“Stop”, 只能由Mas te r来发出。
3) 地址的8位传送完毕后, 成功配置地址的Slave设备必须发送“ACK”。否则否则一定时间之后Master视为超时, 将放弃数据传送, 发送“Stop”。
4) 当写数据的时候, Mas te r每发送完8个数据位, Slave设备如果还有空间接受下一个字节应该回答“ACK”, Slave设备如果没有空间接受更多的字节应该回答“NACK”, Master当收到“NACK”或者一定时间之后没收到任何数据将视为超时, 此时Master放弃数据传送, 发送“Stop”。
5) 当读数据的时候, Slave设备每发送完8个数据位, 如果Master希望继续读下一个字节, Master应该回答“ACK”以提示Slave准备下一个数据, 如果Master不希望读取更多字节, Mas te r应该回答“NACK”以提示Slave设备准备接收Stop信号。
6) 当Mas te r速度过快Slave端来不及处理时, Slave设备可以拉低SCL不放 (SCL=0将发生“线与”) 以阻止Master发送更多的数据。此时Master将视情况减慢或结束数据传送。
在实际应用中, 并没有强制规定数据接收方必须对于发送的8位数据做出回应, 尤其是在Master和Slave端都是用GPIO软件模拟的方法来实现的情况下, 编程者可以事先约定数据传送的长度, slave不检查NACK, 有时可以起到减少系统开销的效果。但是如果slave方是硬件I2C要求一定要标准的NACK, master方是GPIO软件模拟I2C并没有正确的发送NACK, 就会出现“slave收不到stop”导致I2C挂死。
4 总结
在当今工业市场, 具有I2C接口的器件越来越多, 采用的I2C协议通信方式也有许多种, 所以采用GPIO模拟I2C, 反而可以灵活的配置各种器件, 使各种设备兼容, 这样就给人们提供了许多方便。
摘要:随着工业技术的发展, I2C总线协议在工业现场中运用的很广泛, 而具有I2C接口的器件也越来越多, 大家开始通过利用普通I/O来模拟I2C的技术, 从而就解决了主控单元I2C缺少的问题。
关键词:GPIO,I2C,MASTER,SLAVE
参考文献
[1]Philips Semiconductors, THE I2C-BUS SPECIFICATION VERSION2.1, JANUARY, 2000.
I2C总线接口的设计及验证 第4篇
常规的图像采集处理系统利用图像采集卡采集图像到硬盘, 再利用计算机以软件方式完成图像处理分析的任务。由于目前计算机自身性能的限制, 完成数字图像处理的速度有限, 不能达到实时处理的目标。如果采用FPGA处理, 将会大大提高处理速度, 同时达到实时处理的目标;由于在摄像机端实现了图像信息的数字化, 因此图像抗干扰能力强, 图像的传输距离进一步增加。这里所做的工作是数据采集的一部分, 是后续图像处理的基础, 因此具有十分重要的意义。
1 I2C总线
图1为模拟I2C接口程序的基本框架[1]。程序接口用于与应用程序连接, 将应用程序的数据按照I2C协议的方式通过SDA传递给外部器件;时钟设置寄存器用于设置时钟信号;时钟产生模块产生4倍SCL频率的时钟信号, 它为位传输控制模块中所有同步动作提供触发信号;命令寄存器决定是否在总线上产生各种时序信号等;状态寄存器用来显示当前总线的状态;数据传输寄存器用于保存等待的数据;数据接收寄存器用于I2C总线接收到的最后一个字节内容;数据移位寄存器保存的数据总是与当前的数据传输相关的;字节传输控制模块以字节为单位控制数据传输;位传输控制模块以位为单位进行数据传输和产生各个I 2C协议命令。图2为I2C总线接口设计及程序流程图。I2C总线为双向同步串行总线, 分SDA (串行数据线) 和SCL (串行时钟线) 两种。
1.1 I2C总线接口设计的具体实现
I2C总线接口设计所需的编程模块有:位传输控制模块和字节传输控制模块[1]。编写以上2个模块时还要编写程序主体部分。程序主体部分完成与外部程序的接口;完成与总线上外部节点的连线;完成程序内部各个 ( I2C总线接口程序框架图中) 寄存器的构建;控制字节传输控制模块等功能[2]。
1.2 波形仿真测试图
在ModelSim中可以看到仿真的结果。I2C在SCL高电平期间发送单比特数据, 低电平期间允许总线上改变信号。图3~图5分别在SCL为高位“1”时, 读SDA上的数据, 在第9个SCL高电平期间发出应答信号。图中相关数据 (A0H, 01H, A5H, 5AH) 是编程时预先输入的地址数据, 仿真图验证了本设计程序的正确性。进一步说明I2C程序符合I2C协议的时序和数据格式, 可以实现模拟I2C协议的任务。进而完成了总线的接口设计。
2 SAA7113配置
2.1 SAA7113初始化配置值
在用FPGA来实现对SAA7113配置之前, 首先必须确定其内部各寄存器的配置值。SAA7113H有256个内部寄存器 (Subaddress:00~FFH) , 其中00H芯片版本信息寄存器是只读的。01H~05H是前端配置状态寄存器。06H~13H, 15H~17H是解码部分的工作方式配置寄存器。11H~13H是输出控制寄存器, 1FH是只读的解码状态寄存器。40H~60H, 60H~62H是行/场图像控制、状态寄存器, 用于设置VPO的数据格式等。内部寄存器14H, 18H~1EH, 20H~3FH及63H~FFH保留使用。在设计时SAA7113大部分寄存器的值采用其默认值“00H”, 以“01H”和“40H”为起始地址从SAA7113_ROM取出配置数据分两组对SAA7113进行配置, 两组配置数据结束地址分别“17H”和“5FH”。
图6为i2c_w_7113模块原理图, 其主要接口信号定义如表1所示。
图7是i2c_w_7113模块功能仿真波形图。从图7中可以看出, 当发出总线启动命令cmd_start (对应1个高电平脉冲) 时, 在SCL高电平期间, SDA线上产生1个从高电平到低电平的跳变以启动总线。随后立即发送器件寻址字节, SAA7113的器件地址是4AH, 每个I2C器件都有1个惟一的器件地址号, 当总线上有多个I2C器件连接时, I2C接口控制器根据这个惟一的地址号来寻址相应的器件。I2C在SCL高电平期间发送单比特数据, 低电平期间允许在总线上改变信号。它先发送字节数据的最高位, 从图中可以看出, 4AH在总线上的比特流为0100_1010, 当发送完8位数据且SAA7113正确接收后, 在第9个SCL高电平期间SAA7113发出应答信号将总线拉低, 即在SDA线上呈现低电平。
2.2 下载验证
整个设计功能仿真通过后就可以下载到FPGA进行实际验证了。对SAA7113的读写操作是通过saa7113_write和saa7113_read两个控制钮实现的, 它们对应开发板上的2个微动开关。先使能写操作, 完成配置后i2c_write_fine引脚对应的LED被点亮;然后使能读操作, 从SAA7113 E2PROM中读取的数据被存入SAA7113_RAM中完成读操作i2c_read_fine引脚对应的LED被点亮;最后在JTAG模式下利用Quartus的In-System Memory Content Editor来查看SAA7113_RAM中的数据。
3 结 语
在进行基于FPGA的硬件图像采集处理系统的视频采集部分的研究时, 摄像机输出的模拟信号需转换成数字信号, 而SAA7113芯片可以实现转换功能, 在此通过I2C总线的接口设计并在实现对SAA7113配置的基础上实现该功能。在设计i2c_w_7113模块状态机时, 有意缩小SAA7113寄存器的配置范围, 从而节省配置时间。这里所做的工作是数据采集的一部分, 是后续图像处理的基础。
摘要:在视频采集时, 摄像机输出的模拟信号需要转换为数字信号, SAA7113芯片可以实现这种模/数转换功能。介绍在开发FPGA图像采集功能时, I2C总线模块的设计思路, 并利用Verilog HDL语言实现I2C总线接口的功能;同时利用I2C总线对SAA7113芯片进行配置, 为实现视频图像的模/数转换和图像采集搭建环境, 在设计SAA7113模块状态机时有意缩小SAA7113寄存器的配置范围, 从而节省配置时间。
关键词:I2C总线,Verilog HDL,FPGA,SAA7113
参考文献
[1]刘韬, 楼兴华.FPGA数字电子系统设计与开发实例导航[M].北京:人民邮电出版社, 2005.
[2]何立民.I2C总线应用系统设计[M].北京:北京航空航天大学出版社, 1995.
[3]杜慧敏.基于Verilog HDL的FPGA设计基础[M].西安:西安电子科技大学出版社, 2006.
[4]袁本荣.用Verilog HDL进行FPGA设计的一些基本方法[J].微计算机信息, 2004, 20 (6) :93-95.
[5]应芳琴.基于I2C总线的视频信息采集系统的IP核设计[D].杭州:浙江工业大学, 2005.
[6]Bruce J W.Personal Digital Assistant (PDA) Based I2C BusAnalysis[J].IEEE Transactions on Consumer Electronics, 2003 (11) :1 482-1 485.
[7]马向前.基于FPGA的实时图像采集和去噪系统的研究与设计[D].长春:吉林大学, 2006.
[8]常晓明.Verilog-HDL工程入门[M].北京:北京航空航天大学出版社, 2005.
[9]林灶生.Verilog FPGA芯片设计[M].北京:北京航空航天大学出版社, 2006.
I2C串行总线 第5篇
制作的基本特性:
●简单而紧凑的设计
●适用于WINDOWS的XP和Vista
●软件支持labview 7或更新版本 (需有.Net支持)
●使用USB电源供电
●所有的芯片都可以从美芯 (Maxim) 公司获得
有时候, 如需要PC能够简单地直接通过I2C总线接口来通讯, 为做到这一点, 有几种方案:其中一种方案是使用并行口来仿真I2C总线管理器。问题是有些新的计算机常常没有并行打印口;另一个问题是现代的视窗系统如XP和Vista都不允许你很简单的访问RS232串行口和LPT并行口。即使事先配置好了接口, 操作起来也很不灵活。
一、进入USB
一种很有希望的近于面向未来的方法是使用USB口。然而往往需要复杂的驱动程序, 很可能还需要深入到电脑芯片的固件。这些都不是能够在一个下午能够建立起来的。当然可以购买一些现成的版本, 但都不便宜。而这里介绍的方法能够很快地做出, 并且提供了在多种编程语言 (labview, Visual, Basic等) 环境中使用它的可能。这种解决方案使用了美芯公司的电路。
二、硬件
电路的硬件结构见图1。这个电路通过USB连接器K1接到PC上。USB供电要通过L1和L2来滤波。当然没有这些电感可能也能工作, 笔者喜欢稳固的设计, 避免任何潜在的电源问题。USB的数据线借助于R2和R3被接到IC2, 即DS2490S的D+和D-上。这个IC内包含有一个完整的USB“从设备”电路, 并能处理USB的算法过程。R1上拉D+线, 表示IC2是一个全速 (即12Mbit/s) “从设备”。IC2还包含有一个1-wire总线“主设备”。因此外接1-wire总线的“从设备”都可以通过IC2由PC来寻址。电路中只有一个的1-wire总线“从设备”是IC3 (Maxim公司的DS2413) 。这是一个I/O扩展器, 能够提供两个双向漏极开路型端口 (PIOA和PIOB) 。R4和R5是这两个漏极开路型端口的上拉电阻。这些恰恰是增加一个I2C总线所需要的全部硬件。这个电路的PCB布局图 (见图2) 可以从www.elektor.com/080655上免费下载。当然也可以画图定制PCB板。
三、软件
如果微控制器没有硬件的I2C总线“主设备”, 往往用软件实现I2C总线“主设备”。业界称之为“bit banging” (译者注:Bit-banging是一种用软件替代专职硬件的串行通信的技术) 。软件直接对微处理器的管脚的状态进行设置和采样, 其功能涵盖诸如:时钟、电平、同步等所有参数。与此不同的是 (传统的串行通信技术中) , 专职硬件诸如modem、UART或者位移寄存器等一般是用来处理这些参数, 并且提供一个 (缓存) 的数据接口。软件在这种情况下同信号处理无关。实现Bitbanging技术的成本可以很低, 常用于嵌入式系统。
这时, 需要用软件控制两个管脚的逻辑电平以产生I2C总线信号。例如:为了产生一个所谓的“启动”条件, SCL需要变为高电平, 同时SDA要从高电平降为低电平。为了产生这个条件, 首先SCL (PIOA) 和SDA (PIOB) 都需要变为高电平, 然后SDA再被拉为低电平。因此, 如果软件能够控制PIOA和PIOB, 则I2C总线“主设备”就是一个软件的实体。
为了改变PIO的输出, 这个端口首先要能够寻址 (ROM功能) 。在本设计只有一个1-Wire总线“从设备”。因此使用了“跳过ROM”的命令 (‘CC’) 。全部1-Wire总线命令表见表1。
可以用来跳过复杂的寻址过程。接着传送‘5A’命令, 允许写入到PIO输出锁存器 (这是对DS2413的命令组, 其PIO函数流程图可以从http://datasheets.maxim-ic/en/an/AN155.pdf查到) 。这里有一个8位寄存器, 其两个LSB (最低有效位) 被接到PIOA和PIOB (其他6位不必管它) 。为了改变其逻辑状态, 新的数据必须发送两次:一次为正的, 一次为求反的。DS2413通过返回‘AA’到主设备, 表示接收无误并且结束, 同时也开始输出新的起始状态。
现在, 整个过程可以周而复始, 或者被从1-Wire总线的“主设备”来的复位命令RESET所取消。这样每次输出状态变化时要传送4个字节 (如果‘跳过ROM’和‘5A’命令不计算在内的话) 。
为了产生I2C总线开始命令, 执行表1中显示的命令序列。对于其他情况, 则实施用类似的命令序列如停止STOP, 等待SEND BYTE, 应答ACKNOWLEDGE等。
Maxim公司提供了用于DS2490 (DS9490) 的软件驱动器和用于WINDOWS的1-Wire总线软件开发套件 (SDK) 。这个SDK提供了对于WINDOWS的.net平台的支持。作为实例, 我们将显示使用其.net的支持, 在LabVIEW中一个I2C总线主设备是怎样实现的。这个例子只有当1-Wire总线驱动器安装并带有.net支持时才能工作。而且需要“Visual J#Redistributable”软件包详情见http://datasheets.maxim-ic/en/an/AN155.pdf
四、虚拟设备
LabVIEW虚拟设备 (VI) 的所谓‘I2C initialize’, 图3显示了其方框图。初始化DS2490, 并且给出LabVIEW对于1-Wire网络的独占的处理。这是为了防止其他应用程序存取1-Wire网络。此后, 1-Wire复位命令发布, 接着是跳过 (skip) 命令 (CC) , 最后以PIO写入命令 (5A) 结束。
现在, DS2413已经准备好从PIO口接收数据。VI (虚拟设备) ‘I2C CLOCK’SCL线从低变高翻转 (见图4) 。SDA可以置为高电平或低电平, 而VI返回SDA的状态。通过在一行中调用这个函数8次可以写入一个完整的字节 (每传输一位一次) 。如果这个从设备返回数据, SDA就被主设备拉高。在从设备希望传输“0”时就可以拉低SDA (这是可以的, 因为PIOA是漏极开路型输出端) 。由于DS2413会自动返回被更新的输出状态, 所以不需要专门的读出操作。关于字节操作, 可以参见补充软件下载www.elektor.com/080655中的“send I2C byte”和“get I2C byte”命令。此外, 还可以下载VI虚拟设备“I2Cstart”, “I2C stop”和“I2C acknowledge”, 使用相同的结构来产生SDA和SCL信号。通过组合这些虚拟设备, 就可以实现完整的I2C读或写任务的编程。
图5中我们可以看到一个通讯编程任务的实例。其中DS1337中的寄存器0 (I2C实时钟) 内容被读出。DS1337以0x39回答, 这是以秒来计数的寄存器的内容。这个寄存器的地址设置为0x00。设从设备寻址为0x00, 要读出的字节数设置为1。图6中是使用这些设置时示波器中的图像, 显示出由电路所产生的信号。
I2C串行总线 第6篇
I2C总线 (inter integrated circuit bus) 由飞利浦公司于 20世纪 80年代研究开发。I2C总线接口电路其简单性和有效性而被广泛用于连接微处理器及外围设备。在电视中频解调电路中, 二线制的I2C总线接口电路使得主控制器只需要2个引脚便可实现对解调电路所有功能的控制, 且总线接口集成在器件中, 各电路单元之间只需要最简单的连接, 大大简化了电路板上的走线, 减少了电路板面积, 提高了其可靠性, 降低了成本。
在该中频解调的接口电路中, 基于I2C总线传输协议[1], 通过对状态机与控制逻辑的优化设置, 只需要1个3位的状态机便可实现电路的使能、启动、终止、应答、复位、选址等功能, 电路得到了最优化, 且通过地址选择位的增加, 防止了芯片地址冲突, 极大地改善了电路的可靠性及稳定性。
1I2C总线的特点及数据传输
1.1 总线特点
I2C总线是由数据线SDA和时钟线SCL构成的双向串行总线, I2C总线上的所有节点, 如主控器、外围器件、接口模块都连接到SDA, SCL上, 在总线备用时, SDA 和SCL都保持高电平, I2C不工作时SCL嵌位在低电平。为了使总线上所有电路的输出都能实现“线与”功能, I2C总线接口电路的输出端必须是漏极开路结构, 输出端要接上拉电阻[2,3]。
1.2 总线的数据传输格式
I2C总线数据传送格式按图1 进行。首先由主控设备发出起始信号 (S) , 即SDA 在SCL 高电平期间由高电平跳变为低电平, 然后主控器发送1个字节的数据, 首先传送的是最高位 (MSB) 。在传输了每个字节之后, 必须要有接收设备发出1位应答信号。
起始信号后的第1个字节是寻址字节, 寻址字节的高7位是接收设备的地址, 第8位是方向位, “0”发送数据 (写状态) , “1”接收数据 (读状态) 。寻址字节后面可以有很多数据字节, 每个字节后都要有一位发自接收设备的应答信号。在结束与该接收设备通信时, 主控设备必须发出终止信号 (P) , 即在时钟线SCL为高电平期间, SDA由低电平跳变为高电平。
2中频解调电路I2C总线接口的实现
电视中频解调电路中的I2C总线接口主要由输入滤波器、地址寄存器、移位寄存器、控制寄存器、状态机与控制逻辑、读状态寄存器、输出模式寄存器等构成, 如图2所示。其中, 输入滤波器具有I2C总线逻辑兼容电平, 输入时钟与内部时钟同步, 可滤除部分干扰信号[4]。控制逻辑作为控制核心控制着每一部分的状态。地址寄存器存放着自己的7位地址, 用来与接收到的地址比较。移位寄存器、输出模式寄存器与读状态寄存器端口并行相接, 各存储着8位数据字节。
(1) 起始信号与结束信号检测。
起始信号与结束信号的检测由2个下降沿D触发器和1个反相器构成, 如图3所示。D1在SDA从高电平跳变到低电平时触发, 此时只有当SCL保持高电平时, Start才为1, 即检测到起始信号。同理, D2在SDA从低电平跳变到高电平时触发, 此时只有当SCL保持高电平时, Stop才为1, 即检测到结束信号。
(2) 地址检测。
根据设计要求, I2C总线每次通信输入 8位地址数据和控制数据, 电路进行地址比较以后, 如果地址正确, 则接收控制数据。为了防止地址冲突, 增加了地址选择位, 具体实现如图4所示。D7~D1为发送的数据地址, 由于S1, S2是可设置端口, 有4种组合, 即总线接口有4个地址, 分别为1000010, 1000011, 1001010, 1001011, 只有当D7~D1为100S101S2时, 选址成功, 即可以有效解决地址冲突。
(3) 数据串并与并串的转换。
电路中, 串行数据转换为并行数据、并行数据转换为串行数据主要由移位寄存器完成。它以并行方式与输出模式寄存器和读状态寄存器相连;以串行方式与数据线SDA相连。发送的数据由读状态寄存器装载到数据寄存器中。发送后数据又从串行通道返回数据寄存器中, 接收数据时, 数据寄存器装入SDA线上的数据[5]。
(4) 内部总线状态的检测。
读状态寄存器连接着内部总线的8位状态位S0~S7, 在读状态时, 该寄存器将内部总线的状态读进去, 再以并行方式传给移位寄存器, 移位寄存器以串行的方式传给数据线, 即内部总线状态被主控器读取, 如图5所示。
(5) 并行端口的扩展。
根据芯片功能的需要, 设置了4组输出模式寄存器, 分别为调整模式寄存器、备用寄存器、开关模式寄存器、数据模式寄存器。寄存器个数可根据芯片功能的需要进行并行扩展[4,6], 由于每一组寄存器都对应着相应的子地址, 所以每一组寄存器对应相应的时钟CP1, CP2, CP3, CP4和控制端C1, C2, C3, C4。这些时钟和控制端由1个带控制端的2/4译码器输出, 所以每次只有1组寄存器工作, 如图5所示。
(6) 状态机与控制逻辑的设置与优化。
状态机与控制逻辑作为I2C接口的控制中心, 主要用于控制I2C接口电路的使能、启动、终止。 图5给出寄存器组图的应答、复位、选址及中断请求等。通过对状态机与控制逻辑的优化设置, 仅使用3位状态作为状态机的状态端, 在满足更多功能的基础上, 电路更易于实现[7,8,9]。如图6所示, 3个触发器的输出QI8, QI5, QI6为状态机的状态, Qd0~Qd8为移位寄存器的输出, HL91为移位寄存器的可控复位端, G111为地址检测位, HL22为应答位, C5, C6为移位寄存器与读状态寄存器的控制端。
上电后, 状态机的初始值被置位为全0。HL91作为移位寄存器输入端的置位端将移位寄存器的输入端置0。当初始信号到来时, start信号变为1, 此时状态机的状态变为100, 开始传送寻址字节;当8位地址传送完毕后, 假设为写状态, 此时Qd8变为高电平, 应答位HL22由高电平变为低点平, 状态机的状态变为110。HL91变高将移位寄存器的输入置0, 响应结束后, 应答位由低电平变为高电平, 状态机的状态变为010, 此时开始传输数据。
I2C总线开始工作后, 主控器便发送寻址字节给移位寄存器, 在移位寄存器将7位串行地址并行移出, 且与地址寄存器的从地址进行比较, 当地址相同时, G111变为1, 寻址成功, 此时应答信号HL22变为0, 并告知主控制器。在寻址成功后, 如果为读状态, 则在传完该字节之后, 产生应答信号, 状态机变为100, 移位寄存器控制端C5变为低电平, 读状态寄存器的控制端C6变为高电平, 读状态寄存器读入内部总线状态。其中, QI20是与读/写有关的控制端, 响应结束后, 状态机状态变为110, 此时, C5变为高电平, C6变为低电平, 读状态寄存器将存储的8位状态位并行传给移位寄存器;移位寄存器将状态串行移出, 发送给主控制器;主控制器接收到8位状态位后, 发送非应答信号给接收器, 使它释放数据线;响应结束后, 主控制器产生结束信号, 结束数据传送。
如果为写状态, 在接收器产生应答信号后, 主控器将发送子地址给移位寄存器。根据输出模式寄存器功能的不同, 分别对应3组不同的子地址。
在状态机与控制逻辑的作用下, 子地址具有自动加1功能, 所以在读写多字节时, 可以实现自动操作, 加上后面的2/4译码器, 每次只选通1路输出模式寄存器, 如图7所示。
在所有数据发送完毕后, 接收器发送应答信号给主控制器, 响应结束后, 主控制器发送停止信号 (P) , 结束数据传送。
3仿真结果
通过VHDL的程序编写[10], 对I2C模块进行了分析综合, 得到如图8、图9的仿真结果。
在写状态时, 寻址位后的读/写位为0, C6一直为低电平, 即读状态寄存器不工作, 在开始后的第8个时钟, 移位寄存器将SDA的数据并行移出, 第9个时钟时, 应答位HL22变为低电平。在读状态时, 当传完7位寻址位和“1”方向位时, C5变为低电平, C6变为高电平, 读状态寄存器工作, 可将内部总线状态读进来。
在读/写2种状态下, I2C控制模块都能很好地实现I2C总线的开始、停止、读、写、响应等功能, 仿真结果正确, 完全符合I2C总线标准和电路预期的要求。
4结语
目前, I2C总线已作为一种标准广为人们接受, 除了带有I2C总线的单片机和一些常用的外围设备器件, 在电信、电视、音像等产品中都有成套的I2C总线器件。随着大量串行数据的传输, I2C总线的传输速率已提升为高速模式, 可达到3.4 Mb/s, 寻址范围也由原来的7位扩展为10位, 这样被控器的地址数量约增加了10倍。
摘要:为了简化中频解调电路的外围接口电路, 缩小芯片面积, 提高芯片的通用性和可靠性, 在I2C总线数据传输协议的基础上, 设计一个兼容I2C协议的中频解调接口电路。为了防止芯片地址冲突, 增加了4位地址选择位, 并重点对接口电路的状态机与控制逻辑进行优化设置。仿真结果表明, 该电路功能正确, 可靠性高, 可广泛用于TV, VTR, PC, STB等方面。
关键词:中频解调,I2C总线,接口电路,状态机,控制逻辑
参考文献
[1]Philips.The I2C-bus specification[M/OL][2007-04-18].http:www.chinadz.com.
[2]Philips Semiconductors.The I2C-bus and how to use it[M].[S.l.]:Philips Semiconductors.1995.
[3]何立民.I2C总线应用系统设计[M].北京:北京航空航天大学出版社, 1995.
[4]尤一鸣, 傅景义, 王俊省.单片机总线扩展技术[M].北京:北京航空航天大学出版社, 1993.
[5]阎石.数字电子基础[M].北京:高等教育出版社, 2001.
[6]马维华.基于虚拟I2C总线的多并行口扩展技术[J].微电子学与计算机, 2008, 19 (9) :31-33.
[7]WEI Chao-Huang, LIN Yun-Chung.Implementation of lo-cal area digital audio broadcasting system upon I2C network[C].The 47th Midwest Symposium on IEEE Circuits andSystems.[S.l.]:IEEE, 2004.
[8]谭昭禹, 颜永红, 马勋.音频子系统中的I2C接口电路设计[J].微计算机信息, 2008, 24 (26) :252-254.
[9]ALASSIR M, DENOULET J, ROMAIN O.A system CAMS model of an I2C-bus controller[M].[S.l.]:IEEE, 2006.
【I2C串行总线】相关文章:
基于FPGA的串行总线设计09-11
高速光纤串行总线光纤通信论文04-12
浅谈几种串行通信总线接口技术09-12
I2C总线07-27
串行通讯05-20
串行设计07-11
串行优化算法07-19
串行通信协议08-13
高速串行通道08-24
异步串行传输09-06