介绍: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;
}