I2C总线及其驱动程序ppt课件.ppt

上传人:牧羊曲112 文档编号:1968253 上传时间:2022-12-28 格式:PPT 页数:54 大小:2.89MB
返回 下载 相关 举报
I2C总线及其驱动程序ppt课件.ppt_第1页
第1页 / 共54页
I2C总线及其驱动程序ppt课件.ppt_第2页
第2页 / 共54页
I2C总线及其驱动程序ppt课件.ppt_第3页
第3页 / 共54页
I2C总线及其驱动程序ppt课件.ppt_第4页
第4页 / 共54页
I2C总线及其驱动程序ppt课件.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《I2C总线及其驱动程序ppt课件.ppt》由会员分享,可在线阅读,更多相关《I2C总线及其驱动程序ppt课件.ppt(54页珍藏版)》请在三一办公上搜索。

1、2.4 I2C总线及其驱动程序,目 录,I2C简介,I,I2C总线,2,C,I2C总线特点,I2C总线,目 录,I2C驱动决策,标准80C51单片机无硬件I2C接口,使用I/O模拟I2C总线时序难以实现完整协议,仅实现主机功能仅支持一条I2C总线,只有一个主机80C51删除I2C主机总线仲裁,仅支持7位地址模式,通信速率在软件编译前确定不支持高速模式,目 录,I2C软件接口,I2C总线,从机具有I2C地址,内部寄存器均对应具体地址,主机对从机的操作即对寄存器的读写操作,I2C软件接口,/* Function name: char zyI2cInit (void)* Descriptions:

2、初始化I2C为主模式* input parameters: 无* output parameters: 无* Returned value: 0:成功-1:失败*/,I2C软件接口,/* Function name: unsigned char zyI2cWrite (unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen, unsigned char *pucData, unsigned char ucDataLen)* Descriptions: 将数据写入I2C从器件* input paramete

3、rs: ucAddr:从机地址* uiRegAddr:寄存器地址* ucRegAddrLen:寄存器地址长度(单位为字节)* pucData:要写入的数据* ucDataLen:要写入的数据长度* output parameters: 无* Returned value: 已写入的数据字节数*/,I2C软件接口,/* Function name: unsigned char zyI2cRead (unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen, unsigned char *pucData, un

4、signed char ucDataLen)* Descriptions: 从I2C器件读数据* input parameters: ucAddr:从机地址* uiRegAddr:寄存器地址* ucRegAddrLen:寄存器地址长度(单位为字节)* ucDataLen:要写入的数据长度* output parameters: pucData:读到的数据* Returned value: 已读到的数据字节数*/,配置接口,#define _ZY_I2C_DELAY( ) ACC=ACC; /等待1/2个I2C周期#define _ZY_I2C_SDA P1_1; /SDA引脚配置#define

5、 _ZY_I2C_SCL P1_0; /SSL引脚配置,NOP,内部协议层函数接口,内部协议层函数一览表,目 录,发送一位数据的时序,SCL高电平期间 采样SDA信号,SDA,SCL,此时序禁止在发送数据时出现,总线起始或结束控制,发送一位数据函数,static void _zyI2cBitSend(unsigned char ucData) if (ucData ,接收一位数据函数,static unsigned char _zyI2cBitReceive(void) unsigned char ucRt; /返回值 _ZY_I2C_DELAY(); _ZY_I2C_SCL = 1; _ZY

6、_I2C_DELAY(); ucRt = _ZY_I2C_SDA; _ZY_I2C_SCL = 0; return ucRt; ,发送起始信号,static void _zyI2cStartSend (void) _ZY_I2C_DELAY(); _ZY_I2C_SDA = 0; _ZY_I2C_DELAY(); _ZY_I2C_SCL = 0;,忙,在SCL处于高电平期间,SDA从高电平向低电平跳变,空闲时两线均为高电平,发送停止信号,static void _zyI2cStartSend (void) _ZY_I2C_SDA = 0; _ZY_I2C_DELAY(); _ZY_I2C_SC

7、L = 1; _ZY_I2C_DELAY(); _ZY_I2C_SDA = 1;,在SCL处于高电平期间,SDA从低电平向高电平跳变,空闲时SDA状态未知,需手动拉低,闲,发送重复起始信号,static void _zyI2cStartSend (void) _ZY_I2C_SDA = 1; _ZY_I2C_DELAY(); _ZY_I2C_SCL = 1; _ZY_I2C_DELAY(); _ZY_I2C_SDA = 0; _ZY_I2C_DELAY(); _ZY_I2C_SCL = 0;,重复起始信号主要用于I2C总线总线在读写方向切换。起始信号产生时总线处于空闲状态,而重复起始信号产生时

8、总线处于忙状态。,在I2C总线忙时,产生起始条件,以改变数据收发方向。,忙状态,起始信号,应答和非应答,每个字节的传输,都紧跟一个应答状态位,来反映接收端的情况,谁接收谁应答,应答:ACK(A),应答位为0;非应答:NAK(/A),应答位为1,产生非应答后应终止数据的发送,发送应答和非应答信号,static void _zyI2cAckSend (void)_ZY_I2C_SDA = 0;_ZY_I2C_DELAY();_ZY_I2C_SCL = 1;_ZY_I2C_DELAY();_ZY_I2C_SCL = 0;,static void _zyI2cNakSend(void)_ZY_I2C_

9、SDA = 1;_ZY_I2C_DELAY();_ZY_I2C_SCL = 1;_ZY_I2C_DELAY();_ZY_I2C_SCL = 0;,起始信号,应答信号,非应答信号,停止信号,应答信号的处理,static void _zyI2cIsAck (void)_ZY_I2C_SDA = 1;_ZY_I2C_DELAY( );_ZY_I2C_SCL = 1;_ZY_I2C_DELAY( );if (_ZY_I2C_SDA = 1) _ZY_I2C_SCL = 0; return 0; _ZY_I2C_SCL = 0;return 1;,/ 接收应答准备,/ 接收到应答,/ 接收到非应答,发送

10、一个字节的数据,static void _zyI2cByteSend (unsigned char ucData)unsigned char i;/ 发送数据i = 8;do _zyI2cBitSend(ucData); ucData=ucData 1; while (-i ! = 0);,1,0,1,0,1,0,1,0,接收一个字节的数据,static unsigned char _zyI2cByteReceive(void)unsigned char ucRt;unsigned char i;/ 接收数据i = 8;do ucRt = (ucRt 1) + _zyI2cBitReceive

11、(); while (-i != 0);,1,0,1,0,1,0,1,0,从机地址,I2C总线,各从机地址不能冲突!,从机地址,MSB,LSB,从机地址,读写 标志,发送写地址,_zyI2cByteSend(ucAddr ,发送读地址,_zyI2cByteSend(ucAddr | 0 x01);,举例,CAT24C02,读写 标志,带7位地址的完整数据传输,产生起始信号 发送7位地址和读写位 接收ACK信号 读取或者写一个字节的数据 接收或者发送ACK信号 产生结束信号,寄存器地址,目 录,总线初始化函数源代码,char _zyI2cInit (void)_ZY_I2C_SCL = 0;_z

12、yI2cStopSend();return 0;,=,=,unsigned char zyI2cWrite(unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen,unsigned char *pucData, unsigned char uc DataLen) unsigned char i; if (ucDataLen = 0 | pucData = 0) return 0; i = ucDataLen; _zyI2cStartSend(); _zyI2cByteSend(ucAddr,启动总线,发送

13、器件写地址,接收ACK,发送寄存器地址0,接收ACK,发送寄存器地址m-1,接收ACK,发送数据0,接收ACK,发送数据n-1,接收ACK,停止总线,向从机写多个数据源代码,unsigned char zyI2cRead(unsigned char ucAddr, unsigned int uiRegAddr, unsigned char ucRegAddrLen,unsigned char *pucData, unsigned char uc DataLen) unsigned char i; if (ucDataLen = 0 | pucData = 0) return 0; _zyI2c

14、StartSend(); _zyI2cByteSend(ucAddr,启动总线,发送器件写地址,接收ACK,发送寄存器地址0,接收ACK,发送寄存器地址m-1,接收ACK,接收数据0,发送ACK,接收数据n-1,发送NAK,停止总线,向从机读多个数据源代码,重启总线,发送器件写地址,接收ACK,目 录,CAT1025简介,CAT1025的管脚描述,I2C,电源监控复位,器件更多详情见 https:/,由安森美半导体推出,CAT1025的复位监控特性,3V,3.3V,5V,0,RST,门槛电压,管脚电平状态,复位信号图示,CAT1025的应用电路,上拉电阻原因:MR/RST:确保复位信号的稳定性

15、,SCL/SDA:管脚为开漏输出,保证低电平可靠,手动复位输入,隔离电阻,CAT1025特点,遵循I2C标准,无特殊要求,编程结束后需忙等待至少5ms,一次只能在一页内执行写操作,不能跨页操作,void main(void) unsigned char ucData = “123456”; zyLedDisplayInit(); timer0Init(); timer1Init(); EA = 1; zyI2cInit(); if (zyI2cWrite(0 xa0 , 0, 1, ucData, 6) != 6 ) zyLedDisplayPuts(“error1”); while(1);

16、delay100us(50);,E2PROM读写程序范例,E2PROM读写程序范例,ucdata0 = 0; if (zyI2cRead(0 xa0, 0, 1, ucData, 6) != 6) zyLedDisplayPuts(“error2”); while(1); zyLedDisplayPuts(char *)ucData); while(1);,续上页,CAT1024驱动决策,CAT1025较1024多WP引脚, 支持硬件写保护,写操作具有忙状态和页限制,不支持硬件写保护功能,通过编程使读/写操作的接口统一,char zyCat1024Init (void) return zyI2

17、cInit();,#define _CAT1024_ADDR 0 xa0 / 器件地址#define _CAT1024_PAGE_SIZE 16 / 器件页大小,E2PROM的读写范例,器件地址固定为0 xa0,调用I2C总线初始化函数,E2PROM读写范例写操作,unsigned char zyCat1024Write (unsigned char uc Addr, unsigned char *pucData, unsigned char ucDataLen) unsigned char ucTmp1, ucTmp2; / 第一页可能不是从页开始处写,所以需单独编码 ucTmp1=_CAT

18、1024_PAGE_SIZE (ucAddr % _CAT1024_PAGE_SIZE); if (ucTmp1 ucDataLen) ucTmp1 = ucDataLen; ucTmp2 = zyI2cWrite(_CAT1024_ADDR, ucAddr, 1, pucData, ucTmp1); if(ucTmp2 != ucTmp1) return ucTmp2; ucAddr = ucAddr + ucTmp2; ucTmp1 = ucDataLen - ucTmp2; PucData = PucData + ucTmp2; _CAT1024_WRITE_DLY();,E2PROM读

19、写范例写操作,/ 写中间页,都是满页 while (ucTmp1 _CAT1024_PAGE_SIZE) ucTmp2 = zyI2cWrite(_CAT1024_ADDR, ucAddr, 1, pucData,_CAT1024_PAGE_SIZE) ucTmp1 = ucTmp1 ucTmp2; ucAddr = ucAddr + _CAT1024_PAGE_SIZE; pucData = pucData + _CAT1024_PAGE_SIZE; _CAT1024_WRITE_DLY(); if (ucTmp2 != _CAT1024_PAGE_SIZE) return (ucDataL

20、en - ucTmp1); ,续上页,E2PROM读写范例写操作,/ 写最后一页,一般为不满页 ucTmp2 = zyI2cWrite (_CAT1024_ADDR,ucAddr,1, pucData,ucTmp1); ucTmp1 = ucTmp1 ucTmp2; _CAT1024_WRITE_DLY(); return (ucDataLen ucTmp1);,续上页,E2PROM读写范例读操作,/ 直接调用I2C驱动库读函数unsigned char zyCat1024Read(unsigned char ucAddr, unsigned char *pucData, unsigned c

21、har ucDataLen) return zyI2cRead (_CAT1024_ADDR, ucAddr, 1, pucData, ucDataLen);,目 录,LM75A简介,CAT1025的管脚描述,器件更多详情见 https:/,LM75A是NXP半导体推出的具有I2C接口的数字温度传感器芯片,LM75A特性,供电范围:2.8 5.5V,温度范围:-55 125,I2C总线接口,器件地址1001xxx,11位ADC可提供0.125的温度分辨率,精度:2(-25100),3(-55125),LM75A应用电路介绍,加热电阻,I2C接口为开漏输出,需接上拉电阻,总线上仅一个器件无需地址

22、选择,两根粗导线用来加热芯片,温度的表示,LM75A的温度以16位二进制补码方式表示,分别保存在寄存器0和寄存器1中。,static code char *_GpcShowTable = “000”,”125”,”250”, “375”,”500”,”625”,”750”,”875”;void main(void) char cShowBuf10; char cTmpt2; zyLedDisplayInit(); timer0Init(); timer1init(); EA = 1; zyI2cInit();,LM75A范例程序,LM75A范例程序,while(1) if(zyI2cRead(0 x90,0,1,(unsigned char *)cTmpt, 2) = 2) if(cTmpt0 5) ,续上页,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号