56星座屋
当前位置: 首页 星座百科

iic通信协议怎么实现(嵌入式必备知识-IIC协议原理解析)

时间:2023-06-29 作者: 小编 阅读量: 1 栏目名: 星座百科

它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。③数据线SDA和时钟线SCL都是双向线路,都通过一个电流源或上拉电阻连接到正的电压,所以当总线空闲的时候,这两条线路都是高电平。第三步.拉高SCL:数据稳定就是有效数据。第四步.等待接收器返回应答信号,如果数据线SDA一直为高,就一直等待ucErrTime大于250,并返回1,如果数据线SDA为低,返回0。

今日头条/西瓜视频/抖音短视频 同名:正点原子原子哥

感谢各位的关注和支持,你们的支持是原子哥无限前进的动力。

IIC概述:IIC(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器以及其外围设备,IIC也被成为I2C,其实两者是完全相同的,只是名词不一样而已。它是由数据线SDA和时钟线SCL构成的串行总线,可发送和接收数据。IIC特点:① 数据线SDA:数据线用来传输数据;时钟线SCL:时钟线用来同步数据收发② 总线上每一个器件都有一个唯一的地址识别,所以我们只需要知道器件的地址,根据时序就可以实现微控制器与器件之间的通信。③ 数据线SDA和时钟线SCL都是双向线路,都通过一个电流源或上拉电阻连接到正的电压,所以当总线空闲的时候,这两条线路都是高电平。④ 总线上数据的传输速率在标准模式下可达100kbit/s在快速模式下可达400kbit/s在高速模式下可达3.4Mbit/s。⑤ 总线支持设备连接个数:同时支持多个主机和多个从机,连接到总线的接口数量只由总线电容是400pF的限制决定,如以下图所示:

IIC的协议层详解1.有效数据:在时钟的高电平周期内,SDA线上的数据必须保持稳定,数据线仅可以在时钟SCL为低电平时改变。

2.起始和结束条件:起始条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件,如以下图所示:

结束条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件,如下图所示:

注意:注意起始和终止信号都是由主机发出的,总线在起始条件之后,视为忙状态,在停止条件之后被视为空闲状态。3.应答:每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据。注意:从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答

4.数据帧格式:I2C总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。

写操作:S为起始信号,SLAVEADDRESS从机地址(7bit) W(0)一共8位,有阴影的部分是主机发送的,而没有阴影部分是从机发送到主机的,A/A非(0/1),P代表停止信号。

读操作:S为起始信号,SLAVEADDRESS从机地址(7bit) R(1)一共8位,有阴影的部分是主机发送的,而没有阴影部分是从机发送到主机的,A(应答)/A非(0/1),P代表停止信号,注意:假如主机一直返回应答信号,那么从机可以一直发送数据,也就是图中的(nbyte应答信号)情况,直到主机发出非应答信号,从机才会停止发送数据。如何编写IIC驱动代码:

1.起始信号代码编写:

/* 产生IIC起始信号 */void IIC_Start(void){SDA_OUT(); /* sda线输出 */IIC_SDA=1; /* ① */IIC_SCL=1; /* ② */delay_us(5); /* ③ */IIC_SDA=0; /* ④ */delay_us(5); /* ⑤ */IIC_SCL=0; /* ⑥ */}

上述起始信号函数①代表上图的①,而函数②代表上图②,其他类似。2.停止信号代码编写:

/* 产生IIC停止信号 */void IIC_Stop(void){SDA_OUT(); /* sda线输出 */IIC_SCL=0; /* ① */IIC_SDA=0; /* ② */delay_us(5); /* ③ */IIC_SCL=1; /* ④ */IIC_SDA=1; /* ⑤ */delay_us(5); /* ⑥ */ }/* 产生ACK应答 */void IIC_Ack(void){IIC_SCL=0; /* ① */SDA_OUT(); /* sda线输出 */IIC_SDA=0; /* ② */delay_us(5); IIC_SCL=1; /* ③ */delay_us(5); /* ④ */IIC_SCL=0; /* ⑤ */ }

上述起始信号函数①代表上图的①,而函数②代表上图②,其他类似。3.主机产生应答代码编写:

/* 不产生ACK应答 */ void IIC_NAck(void){IIC_SCL=0; /* ① */SDA_OUT(); /* sda线输出 */IIC_SDA=1; /* ② */delay_us(2); IIC_SCL=1; /* ③ */delay_us(4); /* ④ */IIC_SCL=0; /* ⑤ */}

上述起始信号函数①代表上图的①,而函数②代表上图②,其他类似。4.主机产生非应答代码编写:

/* 不产生ACK应答 */ void IIC_NAck(void){IIC_SCL=0; /* ① */SDA_OUT(); /* sda线输出 */IIC_SDA=1; /* ② */delay_us(2); IIC_SCL=1; /* ③ */delay_us(4); /* ④ */IIC_SCL=0; /* ⑤ */}

述起始信号函数①代表上图的①,而函数②代表上图②,其他类似。

5.等待从机发送应答信号代码编写:思路:先让SDA=1,再判断在一定时间内SDA是否变为0,从而识别出外设有没有发送应答信号。

/* 等待应答信号到来*//* 返回值:1,接收应答失败*//* 0,接收应答成功*/u8 IIC_Wait_Ack(void){u8 ucErrTime=0;SDA_IN(); //SDA设置为输入 */IIC_SDA=1;delay_us(1); IIC_SCL=1;delay_us(1); while(READ_SDA) /* 获取SDA电平*/{ucErrTime;if(ucErrTime>250){IIC_Stop();return 1;}}IIC_SCL=0; /* 时钟输出0 */ return 0; }

第一步.设置SDA为输入第二步.拉高SDA:主要判断从机应答就是把SDA拉低。第三步.拉高SCL:数据稳定就是有效数据。第四步.等待接收器返回应答信号,如果数据线SDA一直为高,就一直等待ucErrTime大于250,并返回1(无效应答),如果数据线SDA为低,返回0(有效应答)。

6.IIC发送一个字节发送一个字节的代码编写:思路:数据传输过程中,数据传输保持稳定(在SCL高电平期间,SDA一直保持稳定,没有跳变),只有当SCL被拉低后,SDA才能被改变在SCL为高电平期间(有效数据时间段),发送数据,发送8次数据,如果数据为1,显然SDA是被拉高;如果数据为0,那么SDA被拉低。

/* IIC发送一个字节*//* 返回从机有无应答*//* 1,有应答*//* 0,无应答 */ void IIC_Send_Byte(u8 txd){ u8 t; SDA_OUT(); IIC_SCL=0; /* ① */for(t=0;t<8;t){ IIC_SDA=(txd&0x80)>>7; /* ② */txd<<=1; /*③ */delay_us(2); /* 对TEA5767这三个延时都是必须的*/IIC_SCL=1; /* ④ */delay_us(2); IIC_SCL=0; /* ⑤ */delay_us(2);} }

一开始为什么①把IIC_SCL=0;因为主要IIC_SCL上升沿时准备好数据就是稳定有效数据,例如我们发送txd = 0xA1为例:②:0xA1&0x80为0xA0,0xA0为10100000然后右移7位得到1,如以下图所示:

重点绿色的位,就是为1。③:0xA1左移1位,如以下图所示:

所以txd = 0x20,懂不?我们重点取绿色的框框。④:IIC_SCL拉高就是为了SDA线上的数据必须保持稳定。⑤:IIC_SCL拉低,为了上升沿时准备好数据就是稳定有效数据。其他从②到⑤执行,一样的道理。所以经过八次for循环发送数据我们SDA就发送了0xA1。

7.IIC读1个字节的代码编写:

/* 读1个字节,ack=1时,发送ACK,ack=0,发送nACK */u8 IIC_Read_Byte(unsigned char ack){unsigned char i,receive=0;SDA_IN();/* SDA设置为输入*/for(i=0;i<8;i){IIC_SCL=0; delay_us(2);IIC_SCL=1;receive<<=1;if(READ_SDA)receive; delay_us(1); } if (!ack)IIC_NAck();/* 发送nACK */elseIIC_Ack(); /* 发送ACK */return receive;}

上述也挺简单理解,首先我们先拉低SCL,延时后拉高就是为了读取有效的数据。例如我们读取从机发送的数据为0x05,换成二进制为00000101,然后for循环八次读取,例如READ_SDA为0那么就是receive<<=1为00000000,知道从机发送的00000101这个位时,READ_SDA为1,那么receive为1,所以再一次receive<<=1为00000001,注意红色标点就是我们第一次发的那个位,最后第八次时候receive<<=1为00000101,然后主机发送应答的话就是继续读取从机的数据,如果主机发送非应答信号,那么从机发送数据结束。如果我们使用IIC读取AT24C0X的EEPROM,请参考对应的手册,这里我们只讲解IIC驱动如何编写以及原理分析。

    推荐阅读
  • 形成酸雨的主要气体是什么(形成酸雨的主要气体)

    以下内容大家不妨参考一二希望能帮到您!形成酸雨的主要气体是什么酸雨是指PH小于5.6的雨雪或其他形式的降水,形成的主要气体有二氧化硫、三氧化硫、硫化氢、二氧化氮。酸雨主要是人为的向大气中排放大量酸性物质所造成的。酸雨又分硝酸型酸雨和硫酸型酸雨。

  • 木棉花的花语是什么(木棉花的意义)

    接下来我们就一起去了解一下吧!珍惜眼前的幸福,珍惜身边的人给他们快乐与幸福。它的花期通常在3月或者4月份,在这一段时间盛开,而传说中四月的第十一天,是木棉花盛开的日子,所以4月11被定为木棉花的日子。

  • 炒凉皮不碎技巧(炒凉皮不碎有什么技巧)

    以下内容大家不妨参考一二希望能帮到您!炒凉皮不碎技巧炒凉皮不碎技巧:就是在做凉皮时不能炒太久,变软会失去筋度。胡萝卜切丝,蒜薹切段,葱切花,猪肉切丝,大蒜拍扁。成品凉皮一张张卷起切粗条,抖散备用。生抽,白糖,盐,鸡精,醋,胡椒粉调成汁备用。热锅倒适量食用油烧热加入大蒜,肉丝翻炒至金黄,加入胡萝卜丝和蒜薹炒熟,凉皮翻炒均匀后随即淋入调好的汁儿翻炒均匀。

  • 近几年灭绝的鱼(瞭望在长江源寻鱼)

    长江被誉为我国淡水渔业的摇篮、鱼类基因的宝库。据青海省渔业部门统计,长江流域青海段分布有土著鱼类21种。因此,严格意义上长江源的关键鱼类指的是裂腹鱼中的小头裸裂尻鱼。2019年,李伟带领团队参加长江源科考时,将小头裸裂尻鱼列为长江源鱼类研究的代表对象。2019年4月,科考小组五个人,两台车,开始了沿河寻觅之旅。“全球平均气温上升已是科学界的共识,位于青藏高原的长江源是全球气候变化的敏感区。”科考发现,江源地区

  • 鹧鸪在什么时候季节鸣叫(鹧鸪的孵化期有多长)

    鹧鸪在什么时候季节鸣叫鹧鸪一般会在繁殖季节鸣叫,繁殖期为3-6月,3-4月间开始求偶交配。求偶期间鸣叫更为频繁,常在山岩、树桩、灌木或乔木枝上鸣叫,尤以黎明和黄昏时更甚,往往是一鸟先鸣叫,其他雄鸟一起跟随,此起彼伏。鹧鸪的孵化期在21天左右,雏鸟出壳后不久即可跟随亲鸟活动。鹧鸪的繁殖期为每年的3-6月,3-4月间开始求偶交配,每窝产卵3-6枚,多时可达8枚,卵为椭圆形或梨形,颜色为淡皮黄色至黄褐色。

  • 秋天的诗词(这些都是关于秋天的诗句)

    迢迢新秋夕,亭亭月将圆《戊申岁六月中遇火》,今天小编就来说说关于秋天的诗词?《戊申岁六月中遇火》自古逢秋悲寂寥,我言秋日胜春朝。《秋词》是处红衰翠减,苒苒物华休。惟有长江水,无语东流。宋·柳永《八声甘州》落时西风时候,人共青山都瘦。《昭君怨》雨色秋来寒,风严清江爽。《酬裴侍御对雨感时见赠》秋声万户竹,寒色五陵松。唐·李颀《望秦川》秋色无远近,出门尽寒山。宋·苏轼《九日次韵王巩》

  • 广州有几种车牌(广州车牌你有吗)

    在广州的普通上班族,有房贷还想拥有一辆车,已经不容易了。但有车想让个广州牌,那更是难上加难,再加之限行,参与摇号,竞价的人是越来越多,那中标的机会更是渺茫了!截止日期是8日24时止。9月拟配置的中小客车增量指标共16313个,是这样分配的:1.以摇号方式向单位和个人配置节能车增量指标7285个,其中,单位指标100个,个人指标7185个。

  • qq注销账号有哪几个步骤(QQ将开注销帐号功能)

    1999年2月10日,一个名为OICQ、只有几百K的软件正式上线。当时,腾讯方面表示,这是QQ团队对帐号注销功能的灰度测试。网友截图出于安全考虑,也有网友表示支持有人说,QQ不推出注销服务有自己的考虑,这是为了防止用户QQ密码被他人知道后恶意注销,给用户带来无法挽回的损失。腾讯2018年第三季度财报显示,QQ智能终端月活跃账户同比增长6.9%至6.979亿。

  • 高跟鞋不合脚怎么办(穿高跟鞋不合脚怎么办)

    4、合理利用袜子,如果不喜欢垫各种鞋垫的朋友,可以穿一双船袜,再穿高跟鞋,那样既不影响穿着效果,也不影响美观,也是比较简单和实用的方法。

  • 年四旺名字打分104分 年四旺事迹

    文章目录:一、年四旺相关名字打分113二、年四旺相关名字评分115三、年四旺相关名字推荐四、年四旺相关名字大全五、其他人还看了一、年四旺相关名字打分113年灯石志明年橘纪红兵武尊道后书法孔多塞年贷款孙敬媛年立秋里蓝业珍冯景华年见朱诗词林于思冯桂年粤日林格孟昭毅年家薛邑马布鱼鲁初雪苏沫沫卜庆中年上年掌柜秦源达刘登龙严学锋国韵酒年线高成江裘梦年维泗红沙日年周王克斌王翔千毛淑红龙威信李万和年神范小慧王大