OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7298|回复: 8

I2C写一个字节和读一个字节SCL和SDA拉高和拉低

[复制链接]

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
发表于 2018-8-5 10:34:22 | 显示全部楼层 |阅读模式
1金钱
一直不理解写字节和读字节SDA和SCL,还请大神解惑,我用的51.

/*I2C总线写一个字节*/
void wr_byte(uchar date)
{
       uchar i;
       for(i=0;i<8;i++)
       {
              date=date<<1;
              SDA=CY;   //用CY位将date的每一位通过SDA写进去
              delay();
              SCL=1;     //这里将SCL拉高是为了将写入的那一位稳定吗?( SDA=CY)
              delay();
              SCL=0;    //这里我知道,scl为低时,sda数据才允许变化
              delay();
       }
}
/*I2C总线读一个字节*/
uchar rd_byte()
{
       uchar i,temp;
       for(i=0;i<8;i++)
       {
              SCL=1;
              delay();
              temp=(temp<<1)|SDA;
              delay();
              SCL=0;
              delay();
       }
       return temp;
}

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]/*I2C总线写一个字节*/ //参数是需要写的一个字节数据 void wr_byte(uchar date) { //循环辅助变量 uchar i; //由于一个字节有8位,所以需要循环八次下面的内容 for(i=0;i
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-5 10:34:23 | 显示全部楼层
wgb123 发表于 2018-8-6 10:36
能不能帮把那个程序详细讲解下?

[mw_shl_code=c,true]/*I2C总线写一个字节*/
//参数是需要写的一个字节数据
void wr_byte(uchar date)
{
        //循环辅助变量
        uchar i;
        //由于一个字节有8位,所以需要循环八次下面的内容
        for(i=0;i<8;i++)
        {
                //数据左移,对于51单片机当前date的最高位将会移动到CY寄存器中
                date=date<<1;
                //将CY寄存器中的数值,也就是date刚才的最高位放到SDA线上(此时SCL必须为低电平)
                SDA=CY;
                //短暂延时使数据稳定
                delay();
                //SCL拉高,告知IIC从器件可以对SDA上的数据进行采样了,此时要保持SDA上的数据不变
                SCL=1;
                //延时等待从器件操作完成(其实从器件基本都是在SCL的上升沿完成采样,时间极短ns级别)
                delay();
                //认为从器件读SDA操作完成,由于接下来还是需要操作SDA所以将SCL拉低
                SCL=0;
                //等待SCL电平稳定(对于51来说没有必要)
                  delay();
        }
}
/*I2C总线读一个字节*/
uchar rd_byte()
{
       uchar i,                        //循环变量
                        temp;                //接收缓冲

       //一个字节有8bit,所以需要循环8次
       for(i=0;i<8;i++)
       {
                       //在进行下面的操作之前,从器件就应当已经将数据放在SDA线上了
                       //拉高SCL,告知从器件现在不可以改动SDA线数据
                        SCL=1;
                        //延时等待SCL电平稳定(对于51来说没有必要)
                        delay();
                        //从SDA线获取数据,并且放在缓冲字节的尾部,这样逐渐移位8次之后就拼凑成了一个完整的字节
                        temp=(temp<<1)|SDA;
                        //讲真这个延时没有必要加毫无意义
                        delay();
                        //拉低SCL,告知从器件现在把下一bit放在SDA上
                        SCL=0;
                        //等待从器件操作完成
                        delay();
       }

       //返回从IIC总线读取到的结果
       return temp;
}
[/mw_shl_code]
十六进制带我飞。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2018-8-6 01:35:44 | 显示全部楼层
学习IIC协议。。。
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-8-6 09:40:17 | 显示全部楼层
拉高时钟线SCL,是告知外部IIC设备现在SDA上的数据已经准备妥当,现在可以对其进行采样了
十六进制带我飞。
回复

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-8-6 10:08:28 | 显示全部楼层
正点原子 发表于 2018-8-6 01:35
学习IIC协议。。。

嗯嗯。。。。。。。
回复

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-8-6 10:08:30 | 显示全部楼层
正点原子 发表于 2018-8-6 01:35
学习IIC协议。。。

嗯嗯。。。。。。。
回复

使用道具 举报

22

主题

95

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
378
金钱
378
注册时间
2018-7-16
在线时间
58 小时
 楼主| 发表于 2018-8-6 10:36:44 | 显示全部楼层
DreamWaterPro 发表于 2018-8-6 09:40
拉高时钟线SCL,是告知外部IIC设备现在SDA上的数据已经准备妥当,现在可以对其进行采样了

能不能帮把那个程序详细讲解下?
回复

使用道具 举报

1

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2018-5-19
在线时间
10 小时
发表于 2018-8-6 10:54:53 | 显示全部楼层
//以写为例作说明:
void wr_byte(uchar date)//date为要发送的数据
{
       uchar i;
       for(i=0;i<8;i++)//IIC为串行传输,一次发送一个bit,8次即一个字节,采用MSB方式发送
       {
              date=date<<1;//左移一位
              SDA=CY;   //date左移一位的溢出bit会体现在PSW寄存器的最高位CY上
              delay();//许多单片机的工作频率都比IIC的传输速率快的多(IIC器件许多在400KHZ以下),需要延时。
              SCL=1;     //这里将SCL拉高,上升沿相当于驱动力或者说是协议,唤醒对方处理
              delay();
              SCL=0;    //
              delay();
       }
}

希望能对你有帮助,想在这一领域共同探讨的话,可以加我微信: baofeng_zouyu
回复

使用道具 举报

20

主题

227

帖子

0

精华

高级会员

Rank: 4

积分
605
金钱
605
注册时间
2017-7-14
在线时间
116 小时
发表于 2018-8-9 16:15:39 | 显示全部楼层
原子有IIC代码。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 18:42

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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