打印

谁来解释一下ds1302这时序问题

[复制链接]
2107|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
t86964988|  楼主 | 2010-1-6 17:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
///////////////////////////////向数据线上写一字节dat/////////////////////////////////
void write_byte(uchar dat)
{
uchar i;
for(i=8;i>0;i--)
{
  sda=(bit)(dat&0x01);
  scl=1;
  _nop_();
  scl=0;
  dat=dat>>1;
}
}
//////////////////////////////////从数据线上读取一字节数据/////////////////////////
uchar read_byte()
{
uchar i,temp=0;
for(i=8;i>0;i--)
{
  temp=temp>>1;
  if(sda==1)
  temp=temp|0x80;
  scl=1;
  _nop_();
  scl=0;
}
return(temp);
}

为什么读写一个字节数据的时钟时序一样?不是读取数据的时候在寄存器地址写入后的紧接的下降沿就输出数据了嘛,那读的时候为什么是在上升沿? 这程序肯定没问题的。

相关帖子

沙发
HWM| | 2010-1-6 18:07 | 只看该作者
写入是上升沿触发,八个上升沿后的第一个下降沿才是输出数据。
for(i=8;i>0;i--)
{
  sda=(bit)(dat&0x01);
  scl=1; // 上升沿触发
  _nop_();
  scl=0;
  dat=dat>>1;
}

使用特权

评论回复
板凳
whbtomboy| | 2010-2-5 10:18 | 只看该作者
我也是不太明白,不是数据输入是在上升沿的时候触发吗,我在网上看到都是像下面的差不多 ,怎么先是高电平,后是低电平了那?那不是形成一个下降沿吗?下降沿不是输出数据的吗,这里的程序这样写,咋会把数据输入那?不解!!!!
sda=(bit)(dat&0x01);
  scl=1;                          高电平
  _nop_();
  scl=0;                            低电平
  dat=dat>>1;

使用特权

评论回复
地板
wkshengren| | 2010-2-19 21:25 | 只看该作者
上升沿写,下降沿读,规定的,没办法,不行看看英文版的资料,只需要看时序图部分,就是read是前8位写,上升沿,后8位读,就是下降沿

使用特权

评论回复
5
与时俱进| | 2010-3-18 21:15 | 只看该作者
我来解释,请看红色注释,两个函数正常工作是有条件的。
1、在write_byte()函数之前scl=0;
2、运行read_byte()之前有一个时钟下降沿。由于紧跟在write_byte()后面,满足这个条件。
void write_byte(uchar dat)
{
//......  
  sda=(bit)(dat&0x01);    //数据准备好在SDA上
  scl=1;                            //时钟上升沿触发
  _nop_();
  scl=0;
  dat=dat>>1;
}
}
//////////////////////////////////从数据线上读取一字节数据/////////////////////////
uchar read_byte()
{
uchar i,temp=0;
for(i=8;i>0;i--)
{
  temp=temp>>1;
  if(sda==1)
  temp=temp|0x80;       //读取数据(本函数运行之前肯定有一个时钟下降沿)
  scl=1;                          //时钟上升沿
  _nop_();
  scl=0;                          //下降沿,读取下一位的时钟
}
return(temp);
}

使用特权

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

本版积分规则

19

主题

77

帖子

1

粉丝