完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一直不理解写字节和读字节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; } |
|
相关推荐
9个回答
|
|
[C] 纯文本查看 复制代码
/*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;} |
|
|
|
学习IIC协议。。。
|
|
|
|
拉高时钟线SCL,是告知外部IIC设备现在SDA上的数据已经准备妥当,现在可以对其进行采样了
|
|
|
|
嗯嗯。。。。。。。
|
|
|
|
嗯嗯。。。。。。。
|
|
|
|
能不能帮把那个程序详细讲解下?
|
|
|
|
//以写为例作说明:
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 |
|
|
|
原子有IIC代码。
|
|
|
|
串行时钟,在高电平时写入,你去看看时序图就懂了
|
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2331浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 07:50 , Processed in 1.392075 second(s), Total 96, Slave 77 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号