我是靠谱客的博主 淡然大山,这篇文章主要介绍单总线(1-Wire BUS)通讯协议,现在分享给大家,希望可以做个参考。

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

时序结构:

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

代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/** * @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次即可)

 代码:

                                                              发送一位

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/** * @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; //拉高,便于下次发送 }

                                                          发送一个字节

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/** * @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。

代码:

                                                      读取一位

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/** * @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; }

                                              读取一个字节

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/** * @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; }

最后

以上就是淡然大山最近收集整理的关于单总线(1-Wire BUS)通讯协议的全部内容,更多相关单总线(1-Wire内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(94)

评论列表共有 0 条评论

立即
投稿
返回
顶部