21ic电子技术开发论坛 单片机与嵌入式系统 侃单片机论坛 (新手)单片机I2C sda问题
发新帖我要提问
返回列表
打印

(新手)单片机I2C sda问题

[复制链接]
3375|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
you147|  楼主 | 2012-4-11 10:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void Write_Byte(uchar date)//写入字节函数

{                 
  uchar temp,i;
temp=date;
for(i=0;i<8;i++)
{
        temp=temp<<1;
        SCL=0;
Delay();
  SDA=CY;  //我的问题是   把CY赋给SDA,但这是在FOR循环里,那不是sda只可以得  到一个字节的最后一位吗?还是把SDA存到哪里去了??因为接下来Read_Byte函数要用到sda,而且还是要用8次,怎么得到的啊  ,难不成这里赋值一次就去执行   Read_Byte()函数一次吗??我觉得不是啊,那谁打我就搞不懂啊,望高手指点一下                              
     SCL=1;
  Delay();
}

SCL=0;
Delay();
SDA=1;
Delay();
}

uchar Read_Byte()
{                   //读入字节函数
uchar i,j,k=0;
SDA=1;
Delay();

for(i=0;i<8;i++)
{
SCL=0;
Delay();
SCL=1;
Delay();
k=k<<1;
k=k|sda;
SCL=0;
Delay();
SDA=1;
Delay();
return k;

}

相关帖子

沙发
ayb_ice| | 2012-4-11 10:31 | 只看该作者
必须确保Delay函数不修改CY的值才行,
或者将temp=temp<<1;放在Delay函数之后

使用特权

评论回复
板凳
you147|  楼主 | 2012-4-11 10:37 | 只看该作者
我的问题是在我执行写入字节函数后那不是只可以得到1bit啊,但是写字节函数还有读字节函数肯定要的是8bit啊,其他7bit我不知道到哪里去找,我的理解是在SDA中会被覆盖啊。不懂

使用特权

评论回复
地板
ayb_ice| | 2012-4-11 11:35 | 只看该作者
请问:
什么叫串行通信

使用特权

评论回复
5
joyme| | 2012-4-11 11:56 | 只看该作者
串行通信必须1bit,1bit地传输或接受就跟吃饭要一口一口吃一样

使用特权

评论回复
6
yesful| | 2012-4-11 12:10 | 只看该作者
3# you147
个人理解:for(i=0;i<8;i++)串行通信,连续写8位数据,当 scl拉底时,sda数据改变,当scl由低被拉高时,产生一个时钟信号,数据就是在这时钟信号,被一位一位的传输的,不知道有没理解错呢?

使用特权

评论回复
7
you147|  楼主 | 2012-4-11 13:05 | 只看该作者

RE: (新手)单片机I2C sda问题

谢谢兄弟为我解惑
     我知道数据是一位一位传送的,我的意思是按照程序我理解为一个字节被for语句传一下,就等于一位了,如果有一个接受SDA 的寄存器或是什么其他的暂时存一下,才会得到8位啊

使用特权

评论回复
8
you147|  楼主 | 2012-4-11 13:08 | 只看该作者
谢谢兄弟为我解惑
     我知道数据是一位一位传送的,我的意思是按照程序我理解为一个字节被for语句传一下,就等于一位了,如果有一个接受SDA 的寄存器或是什么其他的暂时存一下,才会得到8位啊,不可能我们吃饭,一碗饭我们就要吃最后一口吧,其他的不要?我的迷惑是这里,因为for语句是连续执行8次,而中间没有接收SDA 的啊,那还不是就得到1位数据啊

使用特权

评论回复
9
yesful| | 2012-4-11 13:46 | 只看该作者
8# you147
你这个应该是MCU作主机,软件模拟I2C,在Read_Byte()里,定义了uchar K作为数据缓存的,而从机,我想你接的是带I2C接口的器件吧,它里面应该自带接收缓冲区的,会自已处理的

使用特权

评论回复
10
wanwwf117| | 2012-7-19 13:18 | 只看该作者
我想你开始都已经写好了存放的地址,每次把CY的值给SDA,SDA就已经把他放入了那个存放的地址。。我现在是这样想的,也有点迷或:(

使用特权

评论回复
11
yuanfeidexin| | 2015-5-7 11:25 | 只看该作者
SCL=0;
Delay();
SCL=1;
会创造一个上升沿,SDA的值就会把数据写入到芯片中,不会有缓冲区来保存。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

0

粉丝
关闭 热门推荐
快速回复 在线客服 返回列表 返回顶部