历史上的今天
今天是:2024年08月27日(星期二)
2021年08月27日 | 51单片机-IIC入门代码讲解
2021-08-27 来源:eefocus
因IIC时序细节的理解不是一两篇文章就能描写清楚的,这里笔者只针对《手把手教你学51单片机》文档第14章内容做补充辅助理解,如果大家想彻底弄明白IIC的所有通信细节过程,那么就需要“好事多磨”了。
我们现在先贴出IIC的时序流程图

1.起始信号函数
我们同样是运用宋老师的代码,这里笔者把代码和截图一起呈现出来让大家能够一句句地去理解含义,打开宋老师的代码lesson14_1。
void I2CStart() //产生总线起始信号
{
I2C_SDA = 1; //首先确保SDA、SCL都是高电平
I2C_SCL = 1;
I2CDelay(); //延时几微秒
I2C_SDA = 0; //先拉低SDA
I2CDelay(); //延时几微秒
I2C_SCL = 0; //再拉低SCL
}

2.停止信号函数
void I2CStop() //产生总线停止信号
{
I2C_SCL = 0; //首先确保SDA、SCL都是低电平
I2C_SDA = 0;
I2CDelay(); //延时几微秒
I2C_SCL = 1; //先拉高SCL
I2CDelay();
I2C_SDA = 1; //再拉高SDA
I2CDelay();
}

3.数据传输过程
假如我们单片机作为主机,需要传输0xA0这个字节给从机,从机其实就是芯片EEPROM,而0xA0的作用是寻址,用来查看开发板上有没有相应的从机。
我们看到“bit I2CWrite(unsigned char dat)”,如果传入的参数给dat为0xA0,那么相关执行过程为下图所示

现在我们结合上图再来对比代码
bit I2CWrite(unsigned char dat) //I2C总线写操作,dat-待写入字节,返回值-从机应答位的值
{
bit ack; //用于暂存应答位的值
unsigned char mask; //用于探测字节内某一位值的掩码变量
for (mask=0x80; mask!=0; mask>>=1) //从高位到低位依次进行
{
if ((mask&dat) == 0) //该位的值输出到SDA上
I2C_SDA = 0;
else
I2C_SDA = 1;
I2CDelay();
I2C_SCL = 1; //拉高SCL
I2CDelay();
I2C_SCL = 0; //再拉低SCL,完成一个位周期
}
I2C_SDA = 1; //8位数据发送完后,主机释放SDA,以检测从机应答
I2CDelay();
I2C_SCL = 1; //拉高SCL
ack = I2C_SDA; //读取此时的SDA值,即为从机的应答值
I2CDelay();
I2C_SCL = 0; //再拉低SCL完成应答位,并保持住总线
return ack; //返回从机应答值
}
如果存在从机,那么就会产生应答,结果演变为下图

所以“ack = I2C_SDA;”就会演变为“ack = 0;”,这样返回值就为0了。
要是我们随便寻址,发送的是0xC4,那么不存在相应地址的器件,自然不会存在拉低的现象,导致结果与上图相反

返回值就为1了。
这也就充分理解并且分析了宋老师的lesson14_1的代码了。这时我们会发现在函数“bit I2CAddressing(unsigned char addr)”里如果传入的参数为0x50,那么“ack = I2CWrite(addr<<1);”其实就是“ack = I2CWrite(0xA0);”。
如果传入的参数为0x62,那就是“ack = I2CWrite(0xC4);”。
上一篇:51单片机-各功能代码的运用
下一篇:51单片机-EEPROM简单使用
史海拾趣
|
印度2005年的模拟电路市场规模达2.21亿美元,今年将猛增35%,达3亿美元,比业界先前的预期增长了50%以上。 印度半导体产业协会称,印度2007年的模拟电路销售额将再增长40%,达4.27亿美元,一直到2010年都会保持快速增长,到那时该市场将达到近1 ...… 查看全部问答> |
|
请教一下,PCB中的焊盘跟过孔在应用上有什么区别啊?焊盘的中间必须有一个过孔吗?画PCB图自制元件时要加贴片的焊盘用工具栏里的焊盘把中间的过孔去掉呢还是自己随便画个方形呢?请高手指点一下啊!谢谢了!… 查看全部问答> |
|
各位大哥,请帮我看看这个 IC 卡(SLE4442卡)问题啊?谢谢 1: 向 IC 卡里写数据 是不是必须通过效验了才能写啊? 2: 效验 到底是效验什么东西? 是密码,还是? 3: 假设有人自己做个写卡器, 想卡里写个很大的数据, 然后做到您的读卡器里读 这样,就不行了 怎么防止这样的情况啊 是不是在卡里 ...… 查看全部问答> |
|
我在淘宝上购买了2家店各2片AD835,购入价为48元1片,在使用其模拟乘法器实现幅度调制(AM)时完全按照手册所列示例搭建电路,但都无法实现,W出来的信号始终的0V,1、4脚载波用10KHZ、1VPP,8脚调制信号用500HZ、1VPP,网上也有类似的问题,但不知 ...… 查看全部问答> |
|
McuPlayer--跟着我从零开始入门FPGA(一周入门XXOO系列) (转) 原帖请见: http://www.amobbs.com/thread-5476115-1-1.html 觉得写的很好,于是就整理了个pdf,分享给大家。… 查看全部问答> |




