系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
IIC通讯:二线制SDA/SCL
提示:以下是本篇文章正文内容,下面案例可供参考
一、场景
- 51单片机模拟I/O配置SDA/SCL(主器件)
- 根据AT24C02芯片手册,配置IIC通讯底层时序,操作命令
二、IIC核心知识点
图1 总线时序:
1.起始信号
结合时序图1:SCL高电平期间,SDA由高到低跳变
//起始信号
void IIC_Start()
{
SDA = 1;
// Delay2us(); //电路特性要求上升沿小于300ns,最好做延时保证必然高电平
SCL = 1; //拉高总线,空闲状态
Delay5us(); //1.起始信号建立时间tSU:STA至少4.7us
SDA = 0; //2.起始信号产生
Delay5us(); //3.起始信号维持时间tHD:STA至少4us
SCL = 0; //4.时钟拉低,钳住总线,准备后续数据发送
}
2.数据有效性
SCL低电平时SDA数据允许高低变化
SCL高电平时SDA保持稳定
3.写数据(1Byte)
MSB在前,LSB在后
SDA数据位传输后,将SCL高电平期间,从器件开始读取传输的数据
SCL、SDA高电平代表总线空闲,准备主/从器件下一次动作
//写一个字节数据
void IIC_WriteByte(unsigned char vdata)
{
//第一次紧跟着起始信号,SCL已经拉低,无需再操作
unsigned char vtemp;
for(vtemp = 0x80; vtemp != 0; vtemp >= 1)
{
if(vtemp & vdata)
{
SDA = 1;//发送数据
}
else
{
SDA = 0;
}
Delay5us(); //时钟信号低电平宽度tLOW至少4.7us
SCL = 1; //SCL拉高 从器件读数据位
Delay5us(); //时钟信号高电平宽度tHIGH至少4us
SCL = 0; //拉低总线,下一个数据传输
}
}
4.应答信号
8bit数据传输后第9位代表应答信号,0已接收 1未收到
//应答信号
bit IIC_RecvACK()
{
bit ack;
UC vErrTimeCnt = 0;
SDA = 1; //拉高总线空闲,为应答作准备
Delay5us(); //维持SCL低电平
SCL = 1; //SCL高电平期间,从器件应答,拉高或拉低SDA:0接收1无
Delay5us();
if((1 == SDA) && (vErrTimeCnt < 255)) //延时保护,防止未收到应答,程序一直停留
{
vErrTimeCnt++;
ack = 0;
}
else
{
ack = 1;
}
return ack;
}
5.停止信号
结合时序图1:SCL高电平期间,SDA由低拉高
//停止信号
void IIC_Stop()
{
SCL = 0; //拉低时钟线,防止SDA由高到低产生起始信号
// Delay2us(); //电路特性要求下降沿小于1us
SDA = 0;
// Delay2us();
SCL = 1;
Delay5us(); //停止信号建立时间最少4.7us
SDA = 1; //拉高SDA,停止信号
Delay5us(); //最少4.7us,释放总线,准备下一次转换
}
6.从机地址
Address | bit7~bit3 | bit2 | bit1 | bit0 | RW* |
---|---|---|---|---|---|
器件唯一标识 | A2 | A1 | A0 | 传输方向 |
@1. bit7~bit3是IIC器件自身地址,由制造商给定,如At24c02地址为1010。
@2. bit2~bit0对应A2 ~A0由硬件连接决定。(一个系统中最多8个器件)
@3. 通讯时第一个字节需要传输地址字节,以确定接收的从器件。如硬件接线A2~A0为低电平,向该写数据。则器件地址为:1010 000 = 0xA0
总结
1.片外IIC器件大体都是这种配置,根据芯片手册会些许微调。实际开发中大多数IC自带EEPROM,后面举例展开
2.基于底层配置后继续实现一个字节的写、读。至于多字节的“按字节”写,“按页写”,“连续读”等等,后续几篇陆续进行。
版权声明:本文为CSDN博主「请叫我xugege」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43612628/article/details/122334412
系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
IIC通讯:二线制SDA/SCL
提示:以下是本篇文章正文内容,下面案例可供参考
一、场景
- 51单片机模拟I/O配置SDA/SCL(主器件)
- 根据AT24C02芯片手册,配置IIC通讯底层时序,操作命令
二、IIC核心知识点
图1 总线时序:
1.起始信号
结合时序图1:SCL高电平期间,SDA由高到低跳变
//起始信号
void IIC_Start()
{
SDA = 1;
// Delay2us(); //电路特性要求上升沿小于300ns,最好做延时保证必然高电平
SCL = 1; //拉高总线,空闲状态
Delay5us(); //1.起始信号建立时间tSU:STA至少4.7us
SDA = 0; //2.起始信号产生
Delay5us(); //3.起始信号维持时间tHD:STA至少4us
SCL = 0; //4.时钟拉低,钳住总线,准备后续数据发送
}
2.数据有效性
SCL低电平时SDA数据允许高低变化
SCL高电平时SDA保持稳定
3.写数据(1Byte)
MSB在前,LSB在后
SDA数据位传输后,将SCL高电平期间,从器件开始读取传输的数据
SCL、SDA高电平代表总线空闲,准备主/从器件下一次动作
//写一个字节数据
void IIC_WriteByte(unsigned char vdata)
{
//第一次紧跟着起始信号,SCL已经拉低,无需再操作
unsigned char vtemp;
for(vtemp = 0x80; vtemp != 0; vtemp >= 1)
{
if(vtemp & vdata)
{
SDA = 1;//发送数据
}
else
{
SDA = 0;
}
Delay5us(); //时钟信号低电平宽度tLOW至少4.7us
SCL = 1; //SCL拉高 从器件读数据位
Delay5us(); //时钟信号高电平宽度tHIGH至少4us
SCL = 0; //拉低总线,下一个数据传输
}
}
4.应答信号
8bit数据传输后第9位代表应答信号,0已接收 1未收到
//应答信号
bit IIC_RecvACK()
{
bit ack;
UC vErrTimeCnt = 0;
SDA = 1; //拉高总线空闲,为应答作准备
Delay5us(); //维持SCL低电平
SCL = 1; //SCL高电平期间,从器件应答,拉高或拉低SDA:0接收1无
Delay5us();
if((1 == SDA) && (vErrTimeCnt < 255)) //延时保护,防止未收到应答,程序一直停留
{
vErrTimeCnt++;
ack = 0;
}
else
{
ack = 1;
}
return ack;
}
5.停止信号
结合时序图1:SCL高电平期间,SDA由低拉高
//停止信号
void IIC_Stop()
{
SCL = 0; //拉低时钟线,防止SDA由高到低产生起始信号
// Delay2us(); //电路特性要求下降沿小于1us
SDA = 0;
// Delay2us();
SCL = 1;
Delay5us(); //停止信号建立时间最少4.7us
SDA = 1; //拉高SDA,停止信号
Delay5us(); //最少4.7us,释放总线,准备下一次转换
}
6.从机地址
Address | bit7~bit3 | bit2 | bit1 | bit0 | RW* |
---|---|---|---|---|---|
器件唯一标识 | A2 | A1 | A0 | 传输方向 |
@1. bit7~bit3是IIC器件自身地址,由制造商给定,如At24c02地址为1010。
@2. bit2~bit0对应A2 ~A0由硬件连接决定。(一个系统中最多8个器件)
@3. 通讯时第一个字节需要传输地址字节,以确定接收的从器件。如硬件接线A2~A0为低电平,向该写数据。则器件地址为:1010 000 = 0xA0
总结
1.片外IIC器件大体都是这种配置,根据芯片手册会些许微调。实际开发中大多数IC自带EEPROM,后面举例展开
2.基于底层配置后继续实现一个字节的写、读。至于多字节的“按字节”写,“按页写”,“连续读”等等,后续几篇陆续进行。
版权声明:本文为CSDN博主「请叫我xugege」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43612628/article/details/122334412
暂无评论