原创 菜农对模拟总线的菜经

2007-1-20 16:48 4041 4 4 分类: MCU/ 嵌入式

 


菜农对模拟总线的菜经
mood.gif hotpower 发表于 2007-1-20 16:29 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


1-wire总线的读估计领会的不好~~~
建议:

//读一个字节
uchar ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
  DQ = 0; // 给脉冲信号//应该注解为发送同步脉冲
  dat>>=1;//估计时间太小
  DQ = 1; // 给脉冲信号//应该注解为释放数据总线
//在此处加延时,我认为16.4KBPS的速率应该在3uS~15uS处再读
//否则你速度太快,可能测不出1820的写'1'数据
  if(DQ)//以上不延时,DQ=1将释放不了1-wire总线//读数据信号
   dat|=0x80;//释放不了总线,DQ恒为0,故该句永远"休眠"~~~
  longdelay2(40);  //4
}
return(dat);
}


//写一个字节
void WriteOneChar(unsigned char dat)
{
unsigned char i="0";
for (i=8; i>0; i--)
{
  DQ = 0;发送同步脉冲
//在此处加延时,否则你速度太快,1820可能测不出下降沿
  DQ = dat&0x01;//发送数据
  longdelay2(50);   //5
  DQ = 1;//释放总线
//倒塌了,此处应该加延时!!!
  dat>>=1;//该句有点延时效果但太小!!!
}
//delay(4);
}

菜农对模拟总线的菜经:

总线协议都会照顾到双方的利益,不会因为自己飞快就不照顾对方,只要对方符合参赛条件.
1-wire应该算串行同步协议,复位,写'1',写'0'都是用低电平触发对方,以达到同步对方的目的.
同步过程是需要时间的,故特别在写'1'或读'1'时,都应该在同步完成后再读写.
所以应该在3uS~15uS内再执行此操作.
一般模拟IO时,信号跳变需要延时.
例如:
  DQ = 0;//发送同步脉冲,通知对方开始准备发送数据
  dat>>=1;//此句虽然做移位操作,对硬件来说可以认为是延时
  DQ = 1;//释放数据总线
  delay(xxx);//必须在此处加延时,等待本方真正释放总线,即完成对总线的充电过程!!!
//本来可以用while(!DQ);//等待总线释放,但由于是在接收过程,对方可能发送'1'而导致该语句死机!!!故应该加延时等待才是!!!
  if(DQ)//此时才该读数据信号
//......

如果楼主的程序在2051上运行的很好,真是楼主的服气~~~因为1820速度很快.


2007120162931361.jpg

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条