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速度很快.
|
|
文章评论(0条评论)
登录后参与讨论