I2C总线时序模拟(一)-加深理解总线协议

发布者:tau29最新更新时间:2016-03-01 来源: eefocus关键字:I2C总线  时序模拟  总线协议 手机看文章 扫描二维码
随时随地手机看文章
[cpp] view plain copy
 
 print?
  1. #include  
  2. #define uchar unsigned char  
  3. sbit sda=P2^0;  
  4. sbit scl=P2^1;//用单片机的两个I/O口模拟I2C接口  
  5. uchar a;  
  6. ***************************************************************************  
  7. void delay()//简单延时函数  
  8. { ;; }  
  9. ***************************************************************************  
  10. void start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号  
  11. {     
  12.     sda=1; //释放SDA总线  
  13.     delay();  
  14.     scl=1;  
  15.     delay();  
  16.     sda=0;  
  17.     delay();  
  18. }  
  19. ***************************************************************************  
  20. void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号  
  21. {  
  22.     sda=0;  
  23.     delay();  
  24.     scl=1;  
  25.     delay();  
  26.     sda=1;  
  27.     delay();  
  28. }***************************************************************************  
  29. void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答  
  30. {  
  31.     uchar i;  
  32.     scl=1;  
  33.     delay();  
  34.     while((sda==1)&&(i<250))i++;  
  35.     scl=0;  
  36.     delay();  
  37. }  
  38. ***************************************************************************  
  39. void init()//总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号  
  40. {  
  41.     sda=1;  
  42.     delay();  
  43.     scl=1;  
  44.     delay();  
  45. }  
  46. ***************************************************************************  
  47. void write_byte(uchar date) //写一个字节  
  48. {  
  49.     uchar i,temp;  
  50.     temp=date;  
  51.   
  52.   
  53.     for(i=0;i<8;i++)  
  54.     {  
  55.         temp=temp<<1;  
  56.         scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿  
  57.         delay();  
  58.         sda=CY;  
  59.         delay();  
  60.         scl=1;//拉高SCL,此时SDA上的数据稳定  
  61.         delay();  
  62.     }  
  63.     scl=0;//拉低SCL,为下次数据传输做好准备  
  64.     delay();  
  65.     sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号  
  66.     delay();  
  67. }  
  68. ***************************************************************************  
  69. uchar read_byte()//读一个字节  
  70. {  
  71.     uchar i,k;  
  72.     scl=0;  
  73.     delay();  
  74.     sda=1;  
  75.     delay();  
  76.     for(i=0;i<8;i++)  
  77.     {  
  78.         scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦  
  79.         delay();      
  80.         k=(k<<1)|sda;  
  81.         scl=0;//拉低SCL,使发送端可以把数据放在SDA上  
  82.         delay();      
  83.     }  
  84.     return k;  
  85. }  
  86. ***************************************************************************  
  87. void write_add(uchar address,uchar date)//任意地址写一个字节  
  88. {  
  89.     start();//启动  
  90.     write_byte(0xa0);//发送从设备地址  
  91.     respons();//等待从设备的响应  
  92.     write_byte(address);//发出芯片内地址  
  93.     respons();//等待从设备的响应  
  94.     write_byte(date);//发送数据  
  95.     respons();//等待从设备的响应  
  96.     stop();//停止  
  97. }  
  98. ***************************************************************************  
  99. uchar read_add(uchar address)//读取一个自己  
  100. {  
  101.     uchar date;  
  102.     start();//启动  
  103.     write_byte(0xa0);//发送发送从设备地址 写操作  
  104.     respons();//等待从设备的响应  
  105.     write_byte(address);//发送芯片内地址  
  106.     respons();//等待从设备的响应  
  107.     start();//启动  
  108.     write_byte(0xa1);//发送发送从设备地址 读操作  
  109.     respons();//等待从设备的响应  
  110.     date=read_byte();//获取数据  
  111.     stop();//停止  
  112.     return date;//返回数据  
  113. }  
关键字:I2C总线  时序模拟  总线协议 引用地址:I2C总线时序模拟(一)-加深理解总线协议

上一篇:对I2C总线的时钟同步和总线仲裁的深入理解
下一篇: 对I2C总线协议的一些理解

推荐阅读最新更新时间:2024-03-16 14:45

半年之殇:困扰半年的MSP430的I2C总线问题在今天解决
搞过嵌入式开发的程序员一定知道有I2C总线,手机和电视中的主要串行技术,通过两条线SDA,SCL解决总线传输,地址区分和热插拔问题的技术。 可是就是这么一个简单的东西,让我这个自认为有些经验的单片机开发者浪费了整整五个月!这还是我有比较充分的经验,在一年半前就已经非常了解I2C协议的情况下!这段时间我花了无数的时间在调试,思考,解决问题而没有一丝进展。反复的检查问题,想要的结果死活不出来!昨晚的反思让我今天早上我一大早起来第一件事就是调代码,结果正确出来的时候,眼泪都快出来了。这篇文章,总结下这五个月来的问题,这五个月给我好好的上了一课。 五个月前,初步规划方案阶段: 我做的体感项目发展到了第四代,为了尽可能的减少尺寸
[单片机]
I2C总线线路的走线方式
I2C总线线路的走线方式   一般来说走线必须使总线线路的串扰和干扰最小。   如果PCB 板的总线长度或带状电缆超过10cm, 包括VDD 和VSS 线配线方式必须是:   SDA _______________________   VDD _______________________   VSS _______________________   SCL _______________________   如果只有VSS 线那么配线方式必须是:   SDA _______________________   VSS _______________________   SCL _
[嵌入式]
I2C之知(四)--I2C总线的7bit从机地址
时钟拉伸(Clock stretching) clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.clock stretching是可选的,实际上大多数从设备不包括SCL驱动,所以它们不能stretch时钟. 从字节级来看,一个设备可能在快速模式下接受数据,但是需要更多的时间来存储接收到的字节或者准备将要传输的另一个字节.从机可以以一种握手的处理方式在接受和应答字节后将SCL线拉低来强制使得主机进入wait状态知道从机准备好下一个字节的传输. 从位级来看,I2C总线上的设备可以通过增长每一个时钟的低周期来降低总线时钟.所以每个主机可以适应这个设备的内部操作速率. 在Hs模式,握
[嵌入式]
智能照明中的总线协议
照明是建筑的重要组成部分,对灯光的灵活调用、调节,就依靠日益发展的照明控制手段了。智能照明行业随着人们生活水平的提高,对房屋舒适度需求的不断增多,行业发展开始预热。酒店、别墅、会议厅、大型场馆等项目都已经运用了智能照明产品,应用越来越广泛。现在一起了解下智能照明控制的几种现场总线协议,专题将介绍各个厂商运用的总线协议,以及协议所带来的智能照明效果与案例。    基于现场总线的智能照明控制系统 分析与应用 一、引言 计算机从它产生的那天就开始了在自动控制系统中的应用。早在20世纪60年代,为了提高控制精度和灵活性,人们提出了直接数字控制(DDC);进入20世纪90年代后,随着计算机网络技术的迅速发展并迅速在控制系统中得到
[嵌入式]
简要分析I2C总线在多机通信中的应用
  I2C(Inter Integrated Circuit)总线是Philips公司开发的一种双向两线主机总线,它能方便地实现芯片间的数据传输与控制。通过两线缓冲接口和内部控制与状态寄存器,可方便地完成多机间的非主从通信或主从通信。基于I2C总线的多机通信电路结构简单、程序编写方便,易于实现系统软硬件的模块化和标准化。 本文给出了基于I2C总线的多机通信调度指挥系统方案,讨论了系统的软硬件设计。 1 系统硬件设计 本调度指挥系统由主机和调度操作台两部分组成,工作原理如图1所示,两者间通过RS422总线实现较长距离的数据传送。主机和操行台内部均采用分散多处理器控制,处理器间采用I2C总线进行数据通信。   主机内部采用分
[工业控制]
带RTC的I2C总线铁电存储器FM31256
摘要 FM31256是一种基于I2C总线、采用铁电体技术的多功能存储芯片。除了非易失存储器外,该器件还具有实时时钟、低电压复位、看门狗计数器、非易失性事件计数器、可锁定的串行数字标识等多种功能。文章主要介绍了FM31256的基本功能、原理,并结合实例给出了其在电磁铸轧电源控制装置中的具体应用方法。 关键词 I2C总线 铁电体技术 RTC MSP430F   FM31256是由Ramtron公司推出的新一代多功能系统监控和非易失性铁电存储芯片。与其他非易失性存储器比较,它具有如下优点: 读/写速度快,没有写等待时间;功耗低,静态电流小于1 mA,写入电流小于150 mA;擦写使用寿命长,芯片的擦写次数为100亿次,比一般的EEPRO
[缓冲存储]
I2C总线与串行EEPROM
  在I2C总线上,数据是串行传输的,但数据的读/写是以8位为单位的,不可以只指定存储器内部某特定的比特位进行读或者替换操作,至少需要以8位为单位进行存取。 M24Cxx与主机的连接实例如图1所示,简单的传输格式实例如图2所示。在PC总线对应的 EEPROM 中,认为最多可以连接8个地址,每个地址至多为8位(256字节,2K位)的存储器,基于I2C总线的规范标准,利用起始字节的0位区分读或写操作,利用1~4位指定器件编号。这样,就可以指定接收数据的器件。然后接着的第2字节是存储器地址,第3字节以后为数据。 图1 I2C总线对应的存储器与主机的连接    因为可以连接地址为8位(256字节,2K位)的8个器件,
[嵌入式]
Linux环境下基于I2C总线的EEPROM 驱动程序
  1 引言   I2C (Inter-Integrated Circuit1总线是一种由Philips公司开发的2线式串行总线,用于连接微控制器及其外围设备。它是同步通信的一种特殊形式,具有接口线少、控制方式简单、器件封装形式小、通信速率较高等优点。在主从通信中,可有多个I2C总线器件同时接到I2C总线上,通过地址来识别通信对象。笔者在开发基于MPC8250的嵌入式Linux系统的过程中发现I2C总线在嵌入式系统中应用广泛,I2C总线控制器的类型比较多,对系统提供的操作接口差别也很大。与I2C总线相连的从设备主要有微控制器、EEPROM、实时时钟、A/D转换器等.MPC8250处理器正是通过内部的I2C总线控制器来和这些连接在I
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved