IO口中断模拟I2C通信方式.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
一种IO口中断模拟I2C通信的方法 单片机与单片机之间的通信方式 Jonney.Peng 2016/8/17 更可靠,效率更高的模拟I2C通信方式,主从机都可模拟 目录 一、 I2C通信原理 2 二、 利用IO口模拟I2C的优势 2 三、 利用IO口模拟I2C的原理 2 2、 中断接收数据函数 3 3、 读指令函数 4 4、 发送一个字节函数 5 5、 发送指令函数 6 五、 源代码共享地址 6 I2C通信原理 I2C总线系统是由SCL(串行时钟)和SDA(串行数据)两根总线构成的。该总线有严格的时序要求,总线工作时,由串行时钟线SCL传送时钟脉冲,由串行数据线SDA传送数据。void I2C_INIT() { SDA=1; delays(2); SCL=1; delays(2); } 中断接收数据函数 功能:实现数据的接收 变量名含义: INTTemp:接收数据变量,每一位都存入INTTemp clk_over_timer:接收超时时基,用于复位相应标志位,后面会介绍。 INT_i2c:中断标志位 F_INT_read:读数据标志位 F_read_ok:接收完数据标志位 INTnum:中断次数标志位 INTre[]:接收数据缓存区 INTbyteflag:接收字节个数标志位 F_long:接收的指令长度 void I2cRead() interrupt 0 { INTTemp=INTTemp<<1; INTTemp=INTTemp|SDA; clk_over_timer=0; INT_i2c=1; F_INT_read=0; F_read_ok=0; INTnum++; if(INTnum==8) //若INTnum为8,说明接收完一个字节的数据,将数据存入INTre[] { INTnum=0; INTre[INTbyteflag]=INTTemp; if(INTbyteflag>=3) //当接收数据位后面的数据时,长度标志位相应 减1,直到F_long=0,说明一条指令接收完毕 { F_long--; } INTbyteflag++; } if(INTbyteflag==3) // INTbyteflag为3时说明长度位已接收完毕 { If(INTre[0]==0x00&&INTre[1]==0x01) //包头和地址位接收正确,将长度为赋 值给F_long F_long=INTre[2]; if(INTre[0]!=0x00) //包头不对,标志位复位,重新接收 { INTbyteflag=0; F_long=32; } if(INTre[1]!=0x01) //地址位不对,标志位复位,重新接收 { INTbyteflag=0; F_long=32; } } } 读指令函数 功能:判断指令接收完毕,当F_long=0说明指令已接收完毕,可以根据指令处理相应事件。若20ms内没接收完数据,说明数据接收不正常,复位相应标志位。 void Read_ok() { if(F_long==0) { INTbyteflag=0; F_long=32; INT_i2c=1; F_INT_read=1; F_read_ok=1; clk_d=0; INTnum=0; clk_watch=0; } if(clk_over_timer>=2) { INT_i2c=0; INTnum=0; INTbyteflag=0; F_long=32; clk_d=0; clk_watch=0; clk_over_timer=0; } } 发送一个字节函数 功能:通过I2C发送一个字数据 void send_byte(uchar b ) { uch

文档评论(0)

tangtianbao1 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档