I2C总线使用说明
来源:互联网 发布:二手租赁平java源码 编辑:程序博客网 时间:2024/06/06 15:48
I2C总线协议
概念:
1、I2C(Inter-IntegratedCircuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备(特别是外部存储器件),最初为音频和视频的开发。
2、I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。
3、I2C总线在传送数据过程中共有三种特殊类型信号, 它们分别是:开始信号、结束信号和应答信号。
4、I2C先传高位,后传送低位数据。
时序:
I2C总线发送数据的整个过程时序
(1)I2C的起始信号
SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号。
/************************************************************************** 函数名 : I2cStart()* 函数功能 : 起始信号:在SCL时钟信号在高电平期间SDA信号产生一个下降沿* 输入 : 无* 输出 : 无* 备注 : 起始之后SDA和SCL都为0*************************************************************************/void I2cStart(){SDA=1;Delay10us();SCL=1;Delay10us();//建立时间是SDA保持时间>4.7usSDA=0;Delay10us();//保持时间是>4usSCL=0;Delay10us();}(2)I2C 停止信号
SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。
/************************************************************************** 函数名 : I2cStop()* 函数功能: 终止信号:在SCL时钟信号高电平期间SDA信号产生一个上升沿* 输入 : 无* 输出 : 无* 备注 : 结束之后保持SDA和SCL都为1;表示总线空闲*************************************************************************/void I2cStop(){SDA=0;Delay10us();SCL=1;Delay10us();//建立时间大于4usSDA=1;Delay10us();//SDA持续时间大于4.7us}
(4)应答信号
应答信号的流程是,单片机发完8Bit数据后把SDA拉高->I2C芯片把SDA拉低->单片机收到ACK信号,而非应答信号则不会被拉低。
发送一个字节/************************************************************ 函数名 : I2cSendByte(unsigned char num)* 函数功能 : 通过I2C发送一个字节。在SCL时钟信号高电平期间,保持发送信号SDA保持稳定* 输入 : num* 输出 : 0或1。发送成功返回1,发送失败返回0* 备注 : 发送完一个字节SCL=0,SDA=1************************************************************/unsigned char I2cSendByte(unsigned char dat){unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。for(a=0;a<8;a++)//要发送8位,从最高位开始{ SDA=dat>>7; //右移7位,因先传最高位dat=dat<<1; //左移一位Delay10us();SCL=1;Delay10us();//建立时间>4.7usSCL=0;Delay10us();//时间大于4us}SDA=1; //释放数据线,等待应答信号Delay10us();SCL=1;while(SDA)//等待应答,也就是等待从设备把SDA拉低{b++;if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束{SCL=0;Delay10us();return 0;}}SCL=0;Delay10us(); return 1;}接收一个字节unsigned char I2cReadByte(){unsigned char a=0,dat=0;SDA=1;//释放这条线,起始和发送一个字节之后SCL都是0Delay10us();for(a=0;a<8;a++)//接收8个字节{SCL=1;Delay10us();dat<<=1;dat|=SDA;Delay10us();SCL=0;Delay10us();}return dat;}
附带:数据传送时序(包括读和写)
0 0
- I2C总线使用说明
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- i2c总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- I2C总线
- Keystone 高可靠性部署与性能测试
- mysql 数据库显示中文乱码问题解决
- SDUT OJ 数据结构实验之栈四:括号匹配
- grep
- 开始自学C++ 希望能开始养成认真做笔记的习惯
- I2C总线使用说明
- codeforces 493C Vasya and Basketball
- 什麼是REST跟RESTful?
- 2014.12.04从数据库中查找数据,并以表格显示
- java比较器的复用
- SDUT OJ 数据结构实验之栈二:一般算术表达式转换成后缀式
- [转载]点数据转成Arcgis线、面文件
- UBUNTU系统创建新用户「添加ROOT权限」
- Linux硬件信息命令大全