找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2526|回复: 4
打印 上一主题 下一主题
收起左侧

关于IIC总线发送一个字节的单片机程序问题

[复制链接]
跳转到指定楼层
楼主
ID:404479 发表于 2019-10-7 19:12 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下是一段IIC的发送函数,我搞不懂的是,第一,为什么数据移位后要延时并且要让时钟先为1在延时后为0,难道这是在模拟整个发送时序吗?
第二,数据发送完成后,为何手动要将时钟和数据线置高电平?第三,为什么发送完数据并且判断完数据是否发送成功或者失败后,为什么要将时钟线拉成低电平,谢谢!

unsigned char I2cSendByte(unsigned char dat)
{
        unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。               
        for(a=0;a<8;a++)//要发送8位,从最高位开始
        {
                SDA=dat>>7;         //起始信号之后SCL=0,所以可以直接改变SDA信号
                dat=dat<<1;
                Delay10us();   (为什么这里要延时?)
                SCL=1;        (这里的时钟为什么要为1)
                Delay10us();//建立时间>4.7us
                SCL=0;       (这里为何要为0)
                Delay10us();//时间大于4us               
        }
        SDA=1;
        Delay10us();
        SCL=1;     (当发送完数据,为何要手动把时钟和数据线拉成低电平?)
        while(SDA)//等待应答,也就是等待从设备把SDA拉低
        {
                b++;
                if(b>200)         //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束
                {
                        SCL=0;
                        Delay10us();
                        return 0;
                }
        }
        SCL=0;(为何发送完数据时钟要为0)
        Delay10us();
         return 1;               
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:620317 发表于 2019-10-8 08:45 | 只看该作者
第一,在发送数据的时候,已经发过START信号了,此时始终信号是低电平,所以要发送一个高电平延时再发送一个低电平就是模拟一个时钟信号。第二,数据发送完后,要释放数据线,等待接收ACK信号,时钟电平为高是发送一个SCL的高电平,等待数据线的ACK(时钟信号一般上升沿有效)。第三,SCL拉低是为下次发送做准备,这就对上了你的问题一SCL可以直接发送高电平了。f:\\123

评分

参与人数 1黑币 +60 收起 理由
admin + 60 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:365802 发表于 2019-10-8 09:49 | 只看该作者
你為什麼不先去看一下IIC的通訊協議對於細節的描述.
回复

使用道具 举报

地板
ID:620557 发表于 2019-10-8 15:59 | 只看该作者
对照IIC芯片规格书的时序图就理解了
回复

使用道具 举报

5#
ID:866771 发表于 2020-12-24 01:11 | 只看该作者
哇!我刚刚学到这,和楼主一模一样的问题,还是不能理解,能教教我吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表