还剩4页未读,继续阅读
文本内容:
I2C通信协议简介 2013-01-1710:48:03转载▼标签 杂谈分类 通讯协议ACK是acknowledge的意思确认.摒弃复杂的情况,这里只对I2C做简单的介绍
一、I2C总线的一些特征•只要求两条总线线路一条串行数据线SDA 一条串行时钟线SCL•每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机___•它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏•串行的8位双向数据传输位速率在标准模式下可达100kbit/s快速模式下可达400kbit/s高速模式下可达
3.4Mbit/s•片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整•连接到相同总线的IC数量只受到总线的最大电容400pF限制
二、I2C总线在传送数据过程__有三种类型__开始__、结束__和应答__开始__SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据结束__SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据 应答__接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据 起始和结束HYPERLINKhttp://photo.blog.sina.com.cn/showpic.html\lblogid=8240cbef01018hovurl=http://s
11.sinaimg.cn/orignal/8240cbefgd373280eeefa\t_blankINCLUDEPICTUREhttp://s
11.sinaimg.cn/mw690/8240cbefgd373280eeefa690\*MERGEFORMATboolI2C_Startvoid{ SDA_H; SCL_H; I2C_delay; if!SDA_readreturnFALSE; //SDA线为低电平则总线忙退出 SDA_L; //拉低SDA线当SCL为高电平时,SDA由高电平向低电平跳变表示开始__ I2C_delay; ifSDA_readreturnFALSE; //SDA线为高电平则总线出错退出 SDA_L; //数据为准备好时,拉低SCL线 I2C_delay; returnTRUE;} 发出开始__之后,设备在数据未准备好时,拉低SCL线,这样主设备可知从设备未发送数据,从设备在数据准备好,可以发送的时候,停止拉低SCL线,这时候才开始真正的数据传输 voidI2C_Stopvoid{ SCL_L; I2C_delay; SDA_L; I2C_delay; SCL_H; //SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据 I2C_delay; SDA_H; I2C_delay;} STOP在单主环境下非必要,但在多主环境就非常必要,主控总线的设备发送STOP后,通知总线其他设备总线已经闲置. voidI2C_Ackvoid{ SCL_L; I2C_delay; SDA_L; I2C_delay; SCL_H; I2C_delay; SCL_L; I2C_delay;} 当主机作为接收设备时,主机对最后一个字节不应答,以向发送设备从设备标识数据传送结束这是因为每次传输都应得到应答__后再进行下一个字节传送如果此时接收机应答了,那它就接收的不是最后一个字节了如果是最后一个字节,第9个时钟周期发送的是非应答__此时发送的不是应答__就是非应答__,最后发送停止__ 1主发从收主START-主发地址-从ACK-主发数据-从ACK循环-主STOP或主START启动下一次传输 这一过程中,主控SCL线,从只在ACK时控SDA线,其他时刻主控SDA线 2主收从发主START-从发地址-主ACK-从发数据-主ACK循环-接受至最后一个字节时,主NACK-主STOP或主START启动下一次传输 并非每传输8位数据之后,都会有ACK__,有以下3中例外
1.当从机不能响应从机地址时例如它正忙于其他事而无法响应IIC总线的操作,或者这个地址没有对应的从机,在第9个SCL周期内SDA线没有拉低,即没有ACK__这时,主机发出一个P__终止传输或者重新发出一个S__开始新的传输
2.如果从机___在传输过程中不能接收更多的数据时,它不会发出ACK__这样,主机就可以意识到这点,从而发出一个P__终止传输或者重新发出一个S__开始新的传输
3.主机___在接收到最后一个字节后,也不会发出ACK__于是,从机发送器释放SDA线,以允许主机发出P__结束传输 位传输HYPERLINKhttp://photo.blog.sina.com.cn/showpic.html\lblogid=8240cbef01018hovurl=http://s
5.sinaimg.cn/orignal/8240cbefgd3734b4eaab4\t_blankINCLUDEPICTUREhttp://s
5.sinaimg.cn/mw690/8240cbefgd3734b4eaab4690\*MERGEFORMAT 主机向从机发送一字节数据voidI2C_SendByteu8SendByte//数据从高位到低位{ u8i=8; whilei-- { SCL_L; I2C_delay; ifSendByte0x80 SDA_H; else SDA_L; SendByte=1; I2C_delay; SCL_H; I2C_delay; } SCL_L;}
三、7位寻址 HYPERLINKhttp://photo.blog.sina.com.cn/showpic.html\lblogid=8240cbef01018hovurl=http://s
5.sinaimg.cn/orignal/8240cbefgd3738d95eb54\t_blankINCLUDEPICTUREhttp://s
5.sinaimg.cn/mw690/8240cbefgd3738d95eb54690\*MERGEFORMAT 在起始条件S后发送了一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位R/W,0表示发送写、1表示请求数据读HYPERLINKhttp://photo.blog.sina.com.cn/showpic.html\lblogid=8240cbef01018hovurl=http://s
5.sinaimg.cn/orignal/8240cbefgd373837436d4\t_blankINCLUDEPICTUREhttp://s
5.sinaimg.cn/mw690/8240cbefgd373837436d4690\*MERGEFORMAT 数据传输一般由主机产生的停止位P终止,但是如果主机仍希望在总线上通讯它可以产生重复起始条件Sr和寻址另一个从机,而不是首先产生一个停止条件 完整的数据传输HYPERLINKhttp://photo.blog.sina.com.cn/showpic.html\lblogid=8240cbef01018hovurl=http://s
7.sinaimg.cn/orignal/8240cbefgd37522cf25c6\t_blankINCLUDEPICTUREhttp://s
7.sinaimg.cn/mw690/8240cbefgd37522cf25c6690\*MERGEFORMATstm32如何建立与EEPROM的通讯
1、配置I/O端口,确定并配置I2C的模式,使能GPIO和I2C时钟
2、写检测SDA是否空闲;-按I2C协议发出起始讯号;-发出7位器件地址和写模式;-要写入的存储区首地址;-用页写入方式或字节写入方式写入数据;
3、读检测SDA是否空闲;-按I2C协议发出起始讯号;-发出7位器件地址和写模式(伪写);-发出要读取的存储区首地址;-重发起始讯号;-发出7位器件地址和读模式;-接收数据;。