I2C通讯协议详解:SDA/SCL时序与数据传输机制
创作时间:
作者:
@小白创作中心
I2C通讯协议详解:SDA/SCL时序与数据传输机制
引用
CSDN
1.
https://blog.csdn.net/weixin_44006573/article/details/105674761
I2C(Inter-Integrated Circuit)总线是一种两线式串行通信总线,广泛应用于微控制器(MCU)与外围设备之间的数据传输。它采用一主多从的总线结构,通过SDA(串行数据线)和SCL(串行时钟线)实现数据的发送和接收。本文将详细介绍I2C总线的基本概念、时序规则以及具体实现方式。
一、基础介绍
I2C总线的主要功能是实现主机和从机之间的数据传输,其核心机制包括起始信号、终止信号、应答信号、读字节、写字节、数据读取和数据写入等。I2C总线的基本架构如下:
Start_I2C
Stop_I2C
readack 读取应答信号
sendack and sendnack 输出应答或非应答
sendbyte
readbyte
write_I2C
read_I2C
二、I2C通信协议详解
1. 空闲状态
SDA和SCL通过上拉电阻保持高电平,表示总线处于空闲状态。
2. 主从设备
- 主设备负责控制通信,通过初始化/终止化数据传输,发送数据并产生同步时钟脉冲。
- 从设备等待主设备的命令并响应,同步时钟信号只能由主设备产生。
3. 起始信号和结束信号
(1) I2C的起始位
void I2C_sendStart() //开始位
{
SDA=1; /*发送起始条件的数据信号*/
SCL=1;
SDA=0; /*发送起始信号*/
Delay_us(1);
SCL=0;
}
(2)I2C的结束位
Void sendstop()
{
SCL=0;
SDA=0; /*发送结束条件的数据信号*/
SCL=1;
while(SCL!=1) { };
Delay_us(1);
SDA=1; Delay_us(1);
}
4. 数据有效性
I2C总线在SCL的每个时钟脉冲期间传输一个数据位。数据线SDA上的数据必须在SCL为高电平时保持稳定,只有在SCL为低电平时,SDA的状态才能发生变化。从机地址发送完成后,可能会发送一些指令,然后开始传输数据,每个数据为8位,数据的字节数没有限制。
5. 应答信号
- 当SDA是低电平表示有效应答(ACK),表示接收成功。
- 当SDA是高电平表示无效应答(NACK),表示接收失败。
(1)接收数据需向发送方发送应答:
void IIC_ack(u8 ack)
{
// 数据线设置为输出
SCL = 0;
delay_us(5);
if(ack)
SDA = 1; // 无效应答
else
SDA = 0; // 有效应答
delay_us(5);
SCL = 1;
// 保持数据稳定
delay_us(5);
// 拉低SCL开始传输数据
SCL = 0;
}
(2)发送数据需等待接收方的应答:
// 等待ACK 1-无效 0-有效
u8 IIC_wait_ack(void)
{
u8 ack = 0;
// 数据线设置为输入
// 拉高时钟线
SCL = 1;
delay_us(5);
// 获取数据线的电平
if(SDA)
{ // 无效应答
ack = 1;
IIC_stop();
}
else
{ // 有效应答
ack = 0;
// 拉低SCL开始传输数据
SCL = 0;
delay_us(5);
}
return ack;
}
三、I2C通信实现方式
1. 硬件I2C
使用芯片上的I2C外设,有专用的I2C引脚,通过调用I2C的控制函数实现通信,无需手动控制SCL、SDA的电平变化。
2. 模拟I2C
通过软件控制任意IO口模拟I2C协议的时序,实现I2C信号和数据传输。
3. 数据读取和写入的示例
- Write_I2C:start->slave address+0+ACK+数据包(byte+ack+…+byten+Nack)+stop
- Read_I2C:start->slave address+1+ACK+数据包(byte+ack+…+byten+Nack)+stop
注意:slave address是7位的一个字节,write是0位,read是1位。
示例:
- slave address为50H(1010000)
- 写地址:10100000(A0)
- 读地址:10100001(A1)
具体流程:
- 发送开始条件
- 发送从机地址和读写控制位
- 传输数据及数据传输结束时
- 发送停止条件
4. 应用示例
(1)读取I2C的应答标志位
Unsigned char readACK() //读取应答信号
{
SCL=0;
SDA=1; /*此处为释放SDA 总线,由从从机发出低电平应答*/
_nop_();
SCL=1;
_nop_();
if(SDA)
return 1; //no ACK
else
return 0; //ACK
}
(2)主控端送出应答信号
void sendACK() //输出应答信号
{
SCL=0;
SDA=0;
_nop_();
SCL=1;
}
void sendNOACK() //输出无应答信号
{
SCL=0;
SDA=1;
_nop_();
SCL=1;
}
(3)主控端写入一个字节到从机
void sendByte(uchar dat) //写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
SCL=0; /*钳住I2C 总线,准备发送数据 */
if(dat&0x80)
SDA=1;
else
SDA=0;
_nop_();
_nop_();
SCL=1;
dat<<=1;
}
}
(4)主控端对从机读取一个字节
uchar readByte() //读一个字节
{
uchar i, dat=0;
for(i=0;i<8;i++)
{
SCL=0;
SDA=1;
_nop_();
dat<<=1;
SCL=1;
if(SDA==1)
dat|=0x01;
}
return dat;
}
(5)主控端数据写入
bit writeIIC(uchar addrW, uchar *writeData, uchar length)
{
uchar i;
bit ACK;
sendStart();
sendByte(addrW); //传送地址与写入标记
ACK = readACK();
if (ACK)
{
sendStop(); //地址不正确或装置未连接,送出停止信号
return ACK;
}
for(i = 0; i<length; i++)
{
sendByte(writeData[i]);
ACK = readACK();
if (ACK)
{
sendStop(); //未接收到ACK,送出停止信号
return ACK;
}
}
sendStop(); //资料写入完成,送出停止信号
return ACK;
}
(6)主控端对从机数据读取
bit readIIC(uchar addrR, uchar *readData, uchar length)
{
uchar i;
bit ACK;
sendStart();
sendByte(addrR); //传送地址与读取标记
ACK = readACK();
if (ACK)
{
sendStop(); //地址不正确或装置未连接,送出停止信号
return ACK;
}
for(i = 0; i<length; i++)
{
readData[i] = readByte();
if(i<length-1)
sendACK();
else
sendNOACK(); //读取最后一笔资料,送出No ACK
}
sendStop(); //资料读取完成,送出停止信号
return ACK;
}
(7)调用数据写入和读取
writeIIC(address_W, &Write_Buffer,4);
readIIC(address_R, &Read_Buffer, 5);
热门推荐
黑木耳的营养价值与食用指南
美国庭院设计趋势,如何选择适合的风格?
癫痫患者可以吃山竹吗
八字财星旺的人好不好 八字财星旺的人具有什么特点
利君沙能治中耳炎吗?医生这样建议
知觉感知:AI深层理解的关键
无痛,更无忧——疼痛管理的现代理念
战争时期,西药“盘尼西林”有多珍贵?战场上的救命药
CCTV5直播!2025亚洲杯国乒参赛名单、赛程以及央视直播表
狗狗吃什么鱼好?这些鱼对狗狗健康有益吗
冷冻蔬菜真的没营养?研究破解四大营养迷思
周易中初九和九二是什么
长江三峡三日游旅游路线:全程无购物,游船览胜,深度体验三峡风光
泡桐树开花季节与特征(春季之美,泡桐花香如诗;盛夏之色,泡桐叶繁荣丽)
一首"伪造"的唐诗,意外火了几百年,考证发现唐朝根本没这诗人
凡人逆袭成神,《仙逆》带你领略修真界的波澜壮阔!
糖尿病性视网膜病变为什么要“打激光”?
猫咪必备!伊丽莎白圈,轻松解决各种困扰
2024春节旅游大数据系列报告
《山海经》的神秘面纱逐渐揭开:古老记载中的生物确有其物
从0开始架构英雄射击游戏体系
为创伤者补缺损,为求美者提颜值……公立医院整形外科,那些不为人知的“隐藏技能”
盘点北京国安队三位大佬级球员:谢峰、邵佳一和高洪波
历史上真实存在的十大“武功秘籍”
焖猪蹄怎么做好吃?牢记“4个技巧”,猪蹄Q弹软烂,不油腻没腥味
苏州地铁8号线正式开通运营,市民乘客体验“环线”热情高涨
信息学奥赛初赛天天练-06-组合数学抽屉原理习题大全
户外运动背包选购指南:从容量到功能全方位解析
2024年NBA全明星赛回顾:乏味与亮点并存,利拉德荣膺MVP
西安事变中,为保蒋损失多大?看死了多少勋贵,数据名单触目惊心