RW1820与1-wire协议

RW1820

参数名: 具体参数
工作电压: +2.8V~+5.5V
测量范围: -55摄氏度~125摄氏度
测量精度: (-10摄氏度~85摄氏度):±0.5摄氏度
(+35摄氏度~+45摄氏度)±0.1摄氏度
温度转换时间 (12位分辨率)80MS
可选分辨率 7~12位
接口方式: 单线串行Single-Linevitable兼容1-wire
通信速率: 16Kbps标准速率或可变速率
多节点通信地址: 64bit Rom或者用户自定24-bit Extension RomID

RW1820内部结构

9字节暂存器
byte 0 (温度)LSB 50H
byte 1 (温度)MSB 05H
byte 2 TH用户定义字节
byte 3 TL用户定义字节
byte 4 配置寄存器
byte 5 保留位(FFH)
byte 6 保留位(0CH)
byte 7 保留位(10H)
byte 8 CRC校验位

1-wire 单总线协议

1-wire 单总线协议
定义: 主机和从机通过一根线进行通信,在一条总线上可挂接的从器件数量几乎不受限制
特点: 它采用单根信号线,即可传输时钟,又能传输数据,而且数据传输是双向的。
优点: 单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护。

通信过程

初始化:复位脉冲+从机应答脉冲
主机通过拉低单总线480-960us产生复位脉冲,然后释放总线,进入接收模式主机释放总线时,会产生低电平跳变为高电平的上升沿,单总线器件检测到上升沿后,延时15-60us,单总线器件拉低总线60-240us来产生应答脉冲。主机接收到从机的应答脉冲说明单总线器件就绪,初始化过程完成。

void Reset(void)
{
	unsigned int i;
	DOUT=0;                     //DOUT为信号线,主机拉低总线
	i=103;                      //延时
	while(i>0)i--;
	DOUT=1;                     //释放总线低电平跳变为高电平的上升沿	
	i=4;                        
	while(i>0)i--;              //延时,此处后继可检测应答脉冲
}

标志0与标志1
当数据线被拉低15us后,在15-60us的时间窗口内对数据线进行采样。如果数据线为低电平就是
标志0,如果数据线为高电平,就是标志1。

写标志0与标志1
主机要产生一个写1标志,就必须把数据线拉高,在写标志开始的15us内允许数据线拉高。
主机要产生一个写0标志,就必须把数据线拉低并保持60us

void Writebyte(unsigned char dat)   
{
  unsigned int i;
  unsigned char j;
  bit PrepareSendbit;                  //暂存发送位
  for(j=1;j<=8;j++)
  {
    PrepareSendbit=dat&0x01;           //取待发送字节的最低位
    dat=dat>>1;
    if(testbPrepareSendbit)            //如果是1
    {
      DOUT=0;                          //释放信号线
      i++;i++;                     
      DOUT=1;                          //将信号线拉高,从机采样为高
      i=8;while(i>0)i--;
    }
    else
    {
      DOUT=0;                          //将信号线拉低,从机采样为低
      i=8;while(i>0)i--;
      DOUT=1;
      i++;i++;
    }
  }
}

读标志0与标志1

bit Readbit(void)        
{
   unsigned int i;
   bit dat;
   DOUT=0;i++;              //将总线拉低后1us
   DOUT=1;i++;i++;          //释放总线后延时一部分,避免脉冲信号
   dat=DOUT;                //取信号
   i=8;while(i>0)i--;       //延时
   return (dat);
}

读一字节

unsigned char ReadByte(void)
{
      unsigned char i,j,dat;
      dat=0; 
      for(i=1;i<=8;i++) 
      {
      j=Readbit(); dat=(j<<7)|(dat>>1); 
      }
     return(dat);
}

通过1-wire协议获取RW1820温度

unsigned int Get()              
{
  float tt;
  unsigned char a,b;
  Reset();
  delay(1);
  Writebyte(0xcc);
  Writebyte(0xbe);
  a=ReadByte();
  b=ReadByte();
  temperature=b;
  temperature<<=8;             
  temperature=temperature|a;
  tt=temperature*0.0625;
  temperature=tt*10+0.5;
  return temperature;
}

你可能感兴趣的:(RW1820与1-wire协议)