单总线(1-Wire BUS)通讯协议

本文详细介绍了Dallas公司的1-Wire通信协议,包括初始化、发送和接收数据的时序结构,并提供了C语言实现的代码示例。通过拉低和释放总线的时间控制,实现主机与从机之间的数据交互。1-Wire协议适用于低速、低功耗的通信场景。
摘要由CSDN通过智能技术生成

介绍:Dallas公司研发的1-Wire单总线是由一根通信线(DQ)组成,且异步、半双工。

时序结构:

一、初始化:主机将总线拉低至少480us,然后释放总线,等待15~60us后,从机会拉低总线60~240us以响应主机,然后将从机释放:

代码:

/**
   *   @brief   初始化
   *   @param   无
   *   @retval  ACK应答位
**/

unsigned char OneWire_Init()
{
	unsigned char i;
	unsigned char Ackbit;
	OneWire_DQ=1;         //先将总线拉高
	OneWire_DQ=0;         //然后将总线拉低
	
	i = 247;while (--i);  //Delay 500 us
	
	OneWire_DQ=1;         //释放总线
	i = 32;while (--i);		//Delay 70 us
	
	Ackbit=OneWire_DQ;    //读取应答位
	
	i = 247;while (--i);  //Delay 500 us
	
	return Ackbit;
	
}

 二、发送一位:如果主机将总线拉低60~120us,然后释放总线,表示发送0;如果主机将总线拉低1~15us,然后释放总线,表示发送一。从机将总线拉低30us后读取电平。整个时间片应不大于60us。(若想发送一个字节,循环8次即可)

 代码:

                                                              发送一位

/**
   *   @brief   发送一位
   *   @param  Bit
   *   @retval   无
**/

void OneWire_Senbit(unsigned char Bit)
{
		unsigned char i;    
		OneWire_DQ=0;      //拉低
	  i = 4;while (--i);   //Delay 10 us(考虑到调用函数需要时间,实际i可以适当取的更大)
		OneWire_DQ=Bit;    //发送一位

     //讲解:从发送0和发送1俩个不同的时序可以看出,如果我们在10us的时候将Bit放在DQ上,如果是0
     //      则DQ一直会被拉低,如果是1,主机也会将DQ拉高,最后等50us后将数据发送即可       


	  i = 24;while (--i);   //Delay 50 us
		OneWire_DQ=1;      //拉高,便于下次发送
}

                                                          发送一个字节

/**
   *   @brief   发送一个字节
   *   @param    Byte
   *   @retval   无
**/

void OneWire_SenByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		OneWire_Senbit(Byte&(0x01<<i));//低位在前
	}
}

三、接受一位:主机将总线拉低1~15us,然后释放总线,并在拉低后15us内读取总线电平(尽量贴近15us的时候),整个时间片应大于60us。

代码:

                                                      读取一位

/**
   *   @brief   接受一位
   *   @param    无
   *   @retval   Bit
**/

unsigned char OneWire_ReceiveBit()
{
	unsigned char i;
	unsigned char Bit;
	OneWire_DQ=0;
	i = 2;while (--i);   //Delay 5 us
	OneWire_DQ=1;
	i = 2;while (--i);   //Delay 5 us

    //解释:读取数据需要在15us内进行(贴近15us的时候),如果是0,DQ会在5us后被从机拉低, 
    //      如果是1, DQ会在5us后被从机拉高

	Bit=OneWire_DQ;      //进行数据接受

	i = 24;while (--i);   //Delay 50 us

	return Bit;
	
}

                                              读取一个字节

/**
   *   @brief   接受一个字节
   *   @param    无
   *   @retval   Byte
**/

unsigned char OneWire_ReceiveByte()
{
	 unsigned char i;
	 unsigned char Byte=0x00;
	for(i=0;i<8;i++)
	{
		if(OneWire_ReceiveBit()){Byte|=(0x01<<i);} //低位在前
	}
		
	return Byte;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值