解析I2C通信协议
2016-08-16 10:25
141 查看
一、I2C的概念
1. I2C总线是PHLIPS公司推出的一种串行总线,I2C总线只有两根双向信号线。其中一根是数据线SDA,另一根是时钟线SCL。
2. 每个接到I2C总线上的器件都有唯一的地址。发送数据到总线上的称为发送器,从总线上接收数据的器件称为接收器。
每个I2C总线上的器件的地址唯一,主机就是通过寻找唯一的地址来进行数据传输。当主机为发送器的时候,器件接收数据,当主机为接收器的时候,器件发送数据。
二、常用的串行扩展总线
I2C(Inter Ic BUS)总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)等。
三、I2C的六个信号
1. 起始信号
定义:SCL线为高电平期间,SDA线由高电平向低电平的变化。
定义:SCL线为高电平期间,SDA线由低电平向高电平的变化。
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。
I2C总线协议规定,每传送一个字节数据,都要有一个应答信号以确定数据传送是否被对方接收。应答信号由接收设备产生,在SCL为高电平期间,接收设备将SDA拉低为低电平,表示数据传输正确。
1. I2C总线是PHLIPS公司推出的一种串行总线,I2C总线只有两根双向信号线。其中一根是数据线SDA,另一根是时钟线SCL。
2. 每个接到I2C总线上的器件都有唯一的地址。发送数据到总线上的称为发送器,从总线上接收数据的器件称为接收器。
每个I2C总线上的器件的地址唯一,主机就是通过寻找唯一的地址来进行数据传输。当主机为发送器的时候,器件接收数据,当主机为接收器的时候,器件发送数据。
二、常用的串行扩展总线
I2C(Inter Ic BUS)总线、单总线(1-WIRE BUS)、SPI(Serial Peripheral Interface)等。
三、I2C的六个信号
1. 起始信号
定义:SCL线为高电平期间,SDA线由高电平向低电平的变化。
void iic_start(void) { SDA = 1; SCL = 1; delay_us(1); SDA = 0; delay_us(1); SCL = 0; }2. 终止信号
定义:SCL线为高电平期间,SDA线由低电平向高电平的变化。
void iic_stop(void) { SDA = 0; SCL = 1; delay_us(1); SDA = 1; delay_us(1); SCL = 0; }3. 写数据信号
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。
bit iic_send_byte(unsigned char byte) { unsigned char i; for(i = 0; i < 8; i++) { SDA = byte & 0x80; SCL = 1; delay_us(1); SCL = 0; byte <<= 1; } SCL = 1; SDA = 1; delay_us(1); if(0 == SDA) { ack = 1; } else { ack = 0; } SCL = 0; return ack; }4. 读数据信号
I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高低电平状态才允许变化。
unsigned char iic_rcv_byte(void) { unsigned char i; unsigned char temp = 0; unsigned char a; SDA = 1; for(i = 0; i < 8; i++) { SCL = 0; delay_us(1); SCL = 1; if(SDA) { a = 0x01; } else { a = 0; } temp |= (a << (7 - i)); delay_us(1); } SCL = 0; return temp; }5. 应答信号
I2C总线协议规定,每传送一个字节数据,都要有一个应答信号以确定数据传送是否被对方接收。应答信号由接收设备产生,在SCL为高电平期间,接收设备将SDA拉低为低电平,表示数据传输正确。
void iic_ack(void) { SDA = 0; SCL = 1; delay_us(1); SCL = 0; }6. 非应答信号
void iic_noack(void) { SDA = 1; SCL = 1; delay_us(1); SCL = 0; }
相关文章推荐
- 实战解析--项目的主要技术储备
- ASP.Net常见技术疑难解析(一)
- RussianIME 全程解析3
- CPU/Arm920t/interrupt.c解析
- Android中解析doc、docx、xls、xlsx格式文件
- python解析xml
- android proguard注意事项(json的解析请注意)
- 解析PHP中如何将数组变量写入文件
- 修改tinyxml让其支持解析特殊字符
- Java中substring方法解析
- Android下拉刷新完全解析,教你如何一分钟实现下拉刷新功能
- Java解析Google Maps API返回的Json
- 深度解析中文分词器算法(最大正向/逆向匹配)
- HTTP的GET和POST格式解析
- ReentrantLock中lock/trylock/lockInterruptibly方法的区别及源码解析
- dns 服务不稳定,解析有问题时,解决办法
- Android滑动菜单框架完全解析,教你如何一分钟实现滑动菜单特效
- Android 属性动画(Property Animation) 完全解析 (下)
- Swift 解析 JSON
- 源码分析: Android AsyncTask完全解析