I2C总线之(三)---以C语言理解IIC

I2C总线之(三)---以C语言理解IIC

为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:

如下图所示的写操作的时序图:

读时序的理解同理。对于时序不理解的朋友请参考“I2C总线之(二)---时序

完整的程序如下:

#include<reg51.h> #define uchar unsigned char #define uint unsigned int #define write_ADD 0xa0 #define read_ADD 0xa1 uchar a;   sbit SDA=P2^0; sbit SCL=P2^1; void SomeNop();     //短延时 void init();    //初始化 void check_ACK(void); void I2CStart(void); void I2cStop(void); void write_byte(uchar dat);//写字节 void delay(uint z); uchar read_byte();     //读字节 void write(uchar addr,uchar dat);  //指定地址写 uchar read(uchar addr);       //指定地址读 bit flag;  //应答标志位 void main() {     init();     write_add(5,0xaa); //向地址5写入0xaa     delay(10);      //延时,否则被坑呀!!!      P1=read_add(5);      //读取地址5的值      while(1);    }    //***************************************************************************   void delay()//简单延时函数   { ;; }   //***************************************************************************   void start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号   {          sda=1; //释放SDA总线       delay();       scl=1;       delay();       sda=0;       delay();   }   //***************************************************************************   void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号   {       sda=0;       delay();       scl=1;       delay();       sda=1;       delay();   } //***************************************************************************   void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答   {       uchar i;       scl=1;       delay();      //至多等待250个CPU时钟周期      while((sda==1)&&(i<250))i++;       scl=0;       delay();   }   //***************************************************************************   void init()//总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号   {       sda=1;       delay();       scl=1;       delay();   }   //***************************************************************************   void write_byte(uchar date) //写一个字节   {       uchar i,temp;       temp=date;             for(i=0;i<8;i++)       {           temp=temp<<1;           scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿           delay();           sda=CY;           delay();           scl=1;//拉高SCL,此时SDA上的数据稳定           delay();       }       scl=0;//拉低SCL,为下次数据传输做好准备       delay();       sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号       delay();   }   //***************************************************************************   uchar read_byte()//读一个字节   {       uchar i,k;       scl=0;       delay();       sda=1;       delay();       for(i=0;i<8;i++)       {           scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦           delay();               k=(k<<1)|sda;           scl=0;//拉低SCL,使发送端可以把数据放在SDA上           delay();           }       return k;   }   //***************************************************************************   void write_add(uchar address,uchar date)//任意地址写一个字节   {       start();//启动       write_byte(0xa0);//发送从设备地址       respons();//等待从设备的响应       write_byte(address);//发出芯片内地址       respons();//等待从设备的响应       write_byte(date);//发送数据       respons();//等待从设备的响应       stop();//停止   }   //***************************************************************************   uchar read_add(uchar address)//读取一个字节   {       uchar date;       start();//启动       write_byte(0xa0);//发送发送从设备地址 写操作       respons();//等待从设备的响应       write_byte(address);//发送芯片内地址       respons();//等待从设备的响应       start();//启动       write_byte(0xa1);//发送发送从设备地址 读操作       respons();//等待从设备的响应       date=read_byte();//获取数据       stop();//停止       return date;//返回数据   }
时间: 2024-10-09 23:50:18

I2C总线之(三)---以C语言理解IIC的相关文章

SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous Receiver Transmitter:通用异步收发器) 第二,区别在电气信号线上: SPI总线由三条信号线组成:串行时钟(SCLK).串行数据输出(SDO).串行数据输入(SDI).SPI总线可以实现多个SPI设备互相连接.提供SPI串行时钟的SPI

I2C总线

I2C总线的介绍(这个就是摘抄拉): I I2 2C C总线( 总线(Inter Integrated Circuit Bus Inter Integrated Circuit Bus):是 ):是Philips Philips公司 公司 推出的串行总线标准(为二线制).总线上扩展的外围器件及外设接 推出的串行总线标准(为二线制).总线上扩展的外围器件及外设接 口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能 口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能 多主机总线.

关于具有I2C总线的TEA6320的使用

现在先了解一下TEA6320,TEA6320是一个I2C总线控制音响应用的立体声放大器,,它的I2C协议和音量控制如下: 它的主要代码: void delay1ms(unsigned int Delay ) //1ms延时 { unsigned int j; for(;Delay>0;Delay--) for(j=0;j<125;j++); } void init() ///总线初始化 将总线都拉高一释放总线 发送启动信号前,要先初始化总线.即总线检测到总线空闲才开始发送启动信号 { SDA=

[I2C]I2C总线协议图解

转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构      I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递.在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平. 2  I2C总线特征 I2C总线上的每一个设备都可以作为主设备或者从设备

17、I2C总线和CAT24WCxx存储器

1.I2C串行总线概述 I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的总线裁决和高低速器件同步功能的高性能串行总线.I2C总线只有两根双向信号线.一根是数据线SDA,另一根是时钟线SCL. 2.I2C总线通过上拉电阻接正电源.当总线空闲时,两根线均为高电平.连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系. 3.每个接到I2C总线上的器件都有唯一的地址.主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发

ADXL345经验总结,采用SPI和I2C总线操作

一. ADXL345简介 ADXL345是ADI公司推出的三轴(x,y,z)iMEMS数字加速度计(digital accelerometer),具有在16G下高分辨率(13Bit)测量能力,同时具备16Bit数字输出.ADXL345 适用于静态倾角测量以及动态加速度测量,高达4mg/LSB的灵敏度允许测量小于1度的倾角. 该传感器还具备单击 /双击探测,自由落体探测,并允许用户设置一个加速度阀值,当加速度值超过设定阀值后可以产生一个信号输出.所有这些功能都可以映射到2个中断上.内置的32级FI

Linux+I2C总线分析(主要是probe的方式)

Linux I2C 总线浅析 ㈠ Overview Linux的I2C体系结构分为3个组成部分: ·I2C核心: I2C核心提供了I2C总线驱动和设备驱动的注册.注销方法,I2C通信方法(即“algorithm”)上层的.与具体适配器无关的代码以及探测设备.检测设备地址的上层代码等.这部分是与平台无关的. ·I2C总线驱动: I2C总线驱动是对I2C硬件体系结构中适配器端的实现.I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter.I2C适配器的algorithm数据结构i2c_a

EEPROM读写学习笔记与I2C总线(二)

无论任何电子产品都会涉及到数据的产生与数据的保存,这个数据可能并不是用来长久保存,只是在运行程序才会用到,有些数据体量较大对于获取时效性并不太强,各种各样的数据也就有不同的存储载体,这次在EEPROM读写中,顺道把看到的关于存储的一些东西整理一下,有些话来自于网友,所以还是那句话,看到的人要带着自己的思考去看,记住尽信书不如无书,fighting!!! 一.基本概念 最熟悉的两个词语应该是RAM与ROM,RAM(Random Access Memory)的全名为随机存取记忆体,它相当于PC机上的

I2C总线协议详解

1.1 I2C总线知识 1.1.1  I2C总线物理拓扑结构     I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA线高低电平时序的控制,来 产生I2C总线协议所需要的信号进行数据的传递.在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平. 1.1.2  I2C总线特征    I2C总线上的每一个设备都可以作为主设备或者从设备,而且每一个设备都会对应一个唯一的地址(可以从I2C器件的数据手册得知)