历史上的今天
返回首页

历史上的今天

今天是:2024年08月27日(星期二)

正在发生

2021年08月27日 | 51单片机-IIC入门代码讲解

2021-08-27 来源:eefocus

因IIC时序细节的理解不是一两篇文章就能描写清楚的,这里笔者只针对《手把手教你学51单片机》文档第14章内容做补充辅助理解,如果大家想彻底弄明白IIC的所有通信细节过程,那么就需要“好事多磨”了。


我们现在先贴出IIC的时序流程图

12.1.png?imageView2/2/w/550


1.起始信号函数

我们同样是运用宋老师的代码,这里笔者把代码和截图一起呈现出来让大家能够一句句地去理解含义,打开宋老师的代码lesson14_1。


void I2CStart()  //产生总线起始信号

{

    I2C_SDA = 1; //首先确保SDA、SCL都是高电平

    I2C_SCL = 1;

    I2CDelay();  //延时几微秒

    I2C_SDA = 0; //先拉低SDA

    I2CDelay();  //延时几微秒

    I2C_SCL = 0; //再拉低SCL

}


12.2.png?imageView2/2/w/550

2.停止信号函数


void I2CStop()   //产生总线停止信号

{

    I2C_SCL = 0; //首先确保SDA、SCL都是低电平

    I2C_SDA = 0;

    I2CDelay();  //延时几微秒

    I2C_SCL = 1; //先拉高SCL

    I2CDelay();  

    I2C_SDA = 1; //再拉高SDA

    I2CDelay();  

}


12.3.png?imageView2/2/w/550


3.数据传输过程

假如我们单片机作为主机,需要传输0xA0这个字节给从机,从机其实就是芯片EEPROM,而0xA0的作用是寻址,用来查看开发板上有没有相应的从机。


我们看到“bit I2CWrite(unsigned char dat)”,如果传入的参数给dat为0xA0,那么相关执行过程为下图所示

12.4.png?imageView2/2/w/550


现在我们结合上图再来对比代码

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;    //返回从机应答值

}


如果存在从机,那么就会产生应答,结果演变为下图

12.5.png?imageView2/2/w/550


所以“ack = I2C_SDA;”就会演变为“ack = 0;”,这样返回值就为0了。

要是我们随便寻址,发送的是0xC4,那么不存在相应地址的器件,自然不会存在拉低的现象,导致结果与上图相反

12.6.png?imageView2/2/w/550


返回值就为1了。


这也就充分理解并且分析了宋老师的lesson14_1的代码了。这时我们会发现在函数“bit I2CAddressing(unsigned char addr)”里如果传入的参数为0x50,那么“ack = I2CWrite(addr<<1);”其实就是“ack = I2CWrite(0xA0);”。


如果传入的参数为0x62,那就是“ack = I2CWrite(0xC4);”。

推荐阅读

史海拾趣

Dearborn Electronics Inc公司的发展小趣事

Dearborn Electronics Inc.于1952年在芝加哥注册成立,由一群电子工程师和企业家共同创立。他们看到了当时电子行业对高性能电容器和滤波器的迫切需求,于是决定专注于这一领域。公司初期主要生产薄膜电容器和EMI/RFI滤波器,凭借卓越的产品质量和稳定的性能,逐渐在电子行业中建立了良好的声誉。

Cynergy 3公司的发展小趣事

Cynergy 3一直将客户需求放在首位,致力于为客户提供定制化的产品解决方案。公司拥有一支经验丰富的工程师团队,他们与客户紧密合作,深入了解客户的实际需求。在此基础上,Cynergy 3不断推出符合客户需求的新产品和新技术。这种以客户需求为导向的产品创新策略使得Cynergy 3能够不断满足市场的变化需求,保持其在行业中的领先地位。

Comax Industrial Co Ltd公司的发展小趣事

为了不断提升自身的技术创新能力,Comax Industrial Co Ltd公司积极与高校、科研机构等开展产学研合作。通过与这些机构的紧密合作,公司不仅获得了前沿的技术支持,还培养了一批高素质的技术人才。这种合作模式使得公司的技术创新能力得到了显著提升,为公司的长期发展提供了有力的支撑。

芯海科技(CHIPSEA)公司的发展小趣事

进入21世纪第二个十年,物联网技术迅猛发展,为芯海科技带来了新的机遇。公司紧跟市场趋势,发布了高精度SoC(系统级芯片)/MCU芯片,广泛应用于智能家居、智能穿戴等领域。这一创新使得芯海科技能够为客户提供一站式的智能硬件解决方案,进一步提升了其市场竞争力。

德崧电子(D-SWITCH)公司的发展小趣事

作为一家有社会责任感的企业,德崧电子始终关注环保和可持续发展。公司在生产过程中积极采用环保材料和工艺,减少对环境的影响。同时,公司还积极参与公益事业,为社会做出贡献。例如,在疫情期间,德崧电子捐赠了一批医疗设备和物资给当地的医疗机构,为抗击疫情做出了积极贡献。这种勇于担当社会责任的精神不仅赢得了社会的赞誉,也为公司树立了良好的企业形象。

Actel公司的发展小趣事

作为一家有社会责任感的企业,德崧电子始终关注环保和可持续发展。公司在生产过程中积极采用环保材料和工艺,减少对环境的影响。同时,公司还积极参与公益事业,为社会做出贡献。例如,在疫情期间,德崧电子捐赠了一批医疗设备和物资给当地的医疗机构,为抗击疫情做出了积极贡献。这种勇于担当社会责任的精神不仅赢得了社会的赞誉,也为公司树立了良好的企业形象。

问答坊 | AI 解惑

印度模拟电路市场将激增达3亿美元

印度2005年的模拟电路市场规模达2.21亿美元,今年将猛增35%,达3亿美元,比业界先前的预期增长了50%以上。   印度半导体产业协会称,印度2007年的模拟电路销售额将再增长40%,达4.27亿美元,一直到2010年都会保持快速增长,到那时该市场将达到近1 ...…

查看全部问答>

有没有PCB的高手来指点一下啊?????

请教一下,PCB中的焊盘跟过孔在应用上有什么区别啊?焊盘的中间必须有一个过孔吗?画PCB图自制元件时要加贴片的焊盘用工具栏里的焊盘把中间的过孔去掉呢还是自己随便画个方形呢?请高手指点一下啊!谢谢了!…

查看全部问答>

各位大哥,请帮我看看这个 IC 卡(SLE4442卡)问题啊?谢谢

1: 向 IC 卡里写数据 是不是必须通过效验了才能写啊? 2: 效验 到底是效验什么东西? 是密码,还是? 3: 假设有人自己做个写卡器, 想卡里写个很大的数据, 然后做到您的读卡器里读 这样,就不行了 怎么防止这样的情况啊 是不是在卡里 ...…

查看全部问答>

基于MSP430 的触摸按键2

继续上一个帖子的内容。主要讲基于MSP430构建触摸按键的方式。大家有什么建议意见都可以说,纯交流学习…

查看全部问答>

关于AD835使用中的困惑

我在淘宝上购买了2家店各2片AD835,购入价为48元1片,在使用其模拟乘法器实现幅度调制(AM)时完全按照手册所列示例搭建电路,但都无法实现,W出来的信号始终的0V,1、4脚载波用10KHZ、1VPP,8脚调制信号用500HZ、1VPP,网上也有类似的问题,但不知 ...…

查看全部问答>

BOOSTXL-SENSHUB这个比较适合diy

http://www.ti.com.cn/tool/cn/boostxl-senshub …

查看全部问答>

加速度传感器自身坐标系原点的确定

加速度传感器自身坐标系的坐标原点如何确定。…

查看全部问答>

McuPlayer--跟着我从零开始入门FPGA(一周入门XXOO系列) (转)

原帖请见: http://www.amobbs.com/thread-5476115-1-1.html 觉得写的很好,于是就整理了个pdf,分享给大家。…

查看全部问答>