122
867
3428
中级工程师
单总线,即一根线进行通信,最常用的温感 DS18B20 采用的就是单总线结构。
使用特权
单总线是美国 DALLAS 公司推出的外围串行扩展总线技术,与 SPI、I2C 串行数据通信方式不同,它采用单根信号线,既传输时钟又传输数据,而且数据传输是双向的。
单总线英文名 1-Wire,传输速率一般是 15.3Kbit/s,最大可达 142Kbit/s,通常采用 100Kbit/s 以下的速率传输数据。
单总线适用于单主机系统,能够控制一个或多个从机设备。主机可以是微控制器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。
9958662e3de7a0bcd0.png (17.89 KB ) 下载附件 2022-7-29 21:19 上传
9958662e3de7a0bcd0.png (17.89 KB )
下载附件
2022-7-29 21:19 上传
单总线典型应用结构
单总线主机或从机设备通过一个漏极开路或三态端口连接至该数据线,由于是开漏结构,需要在数据线上加一个上拉电阻,一般是 4.7K。
为了确保总线上的某些器件在工作时(如温度传感器进行温度转换、E2PROM 写人数据时)有足够的电流供给,除了上拉电阻之外,还需要在总线上使用 MOSFET 提供强上拉供电,大多数的应用这个强上拉是不需要的。
主机或从机将数据线拉低到GND表示数据0,将数据线释放为高表示数据1。
8590762e3deed84efe.png (37.17 KB )
2022-7-29 21:21 上传
单总线器件内部设置有寄生供电电路(Parasite Power Circuit)。
2719262e3df46a593b.png (43.78 KB )
2022-7-29 21:23 上传
主机通过 64 全球唯一的 ROM ID 来识别挂在总线网络上的从机。
每个单总线器件都有一个全球唯一的 64 位 ROM ID,该注册码保证唯一的身份,并用于多节点 1-Wire 网络中的器件寻址,64 位 ROM 注册码不可更改,ROM ID 由出厂激光刻度在单总线器件内部。
64 位 ROM ID 组成:前 8 位是 1-WIRE 家族码,后 48 位是唯一的序列号、最后 8 位是由前 56 位 ROM 码所计算出的 CRC 校验码。
7405262e3df5fd4f01.png (17.54 KB )
节省 I/O 口线、资源结构简单、成本低廉、便于总线扩展和维护等诸多优点。
由于所有设备部件均挂在单一总线上,使这种结构只能分时工作,即同一时刻只能在两个设备之间传送数据,这就使系统总体数据传输的效率和速度受到限制,这是单总线结构的主要缺点。
1-Wire 器件需要严格的协议来保证数据的完整。
如下给出了时序的波形图,在后面实测波形会详细介绍时序要求。
5410862e3e82096ae5.png (28.39 KB )
2022-7-29 22:01 上传
1565362e3e847e1be8.png (31.27 KB )
5279962e3e877f3c35.png (35.56 KB )
2022-7-29 22:02 上传
136562e3e8808ee64.png (13.11 KB )
四、实测分析时序
复位/应答脉冲要求:主机拉低总线 480~960us 来产生复位信号,然后释放总线进入接收模式,接着从机等待 15-60us(上拉电阻上拉至高电平),从机再拉低总线 60-240us 来产生应答信号,主机接收到从机的应答信号后,表明从机准备就绪,初始化过程完成了。
9604762e3e98f58eed.png (106.56 KB ) 下载附件 2022-7-29 22:07 上传
9604762e3e98f58eed.png (106.56 KB )
2022-7-29 22:07 上传
写0时隙要求:写 0 时隙起始于主机拉低总线,主机拉低总线后,只需在整个时隙期间保持总线低电平在 60us 以上,一般是 60~120us 之间。
4397462e3e9b5550b5.png (113 KB ) 下载附件 2022-7-29 22:07 上传
4397462e3e9b5550b5.png (113 KB )
实测写0时隙
写1时隙要求:写 1 时隙和写 0 时隙一样,起始于主机拉低总线,在拉低总线 15us 之内需要将总线拉高,拉高总线需要维持 60us 以上。
9142862e3e9f19559d.png (109.49 KB ) 下载附件 2022-7-29 22:08 上传
9142862e3e9f19559d.png (109.49 KB )
2022-7-29 22:08 上传
实测写1时隙
8090362e3ea438d42b.png (109.5 KB )
2022-7-29 22:10 上传
五、DS18B20
DS18B20 是学习 51 单片机中时,最常用的温感,采用的就是单总线结构。其供电方式有两种,一种是总线寄生电源,一种是使用外部电源。
7291262e3ea78e5a0c.png (23.11 KB )
2022-7-29 22:11 上传
4567462e3ea877a712.png (24.48 KB )
5100862e3ea96ea98b.png (51 KB )
利用单片机从DS18B20 获取温度。
分四步:初始化(复位/应答)→ 写字节 → 读字节 → 计算温度。
如下是给出的代码示例。
#include"delay.h" #include"18b20.h" /*------------------------------------------------ 18b20初始化 ------------------------------------------------*/ bit Init_DS18B20(void) { bit dat=0; DQ = 1; //DQ复位 DelayUs2x(5); //稍做延时 DQ = 0; //单片机将DQ拉低 DelayUs2x(200); //精确延时 大于 480us 小于960us DelayUs2x(200); DQ = 1; //拉高总线 DelayUs2x(50); //15~60us 后 接收60-240us的存在脉冲 dat=DQ; //如果x=0则初始化成功, x=1则初始化失败 DelayUs2x(25); //稍作延时返回 return dat; } /*------------------------------------------------ 读取一个字节 ------------------------------------------------*/ unsigned char ReadOneChar(void) { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; DelayUs2x(25); } return(dat); } /*------------------------------------------------ 写入一个字节 ------------------------------------------------*/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; DelayUs2x(25); DQ = 1; dat>>=1; } DelayUs2x(25); } /*------------------------------------------------ 读取温度 ------------------------------------------------*/ unsigned int ReadTemperature(void) { unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳过读序号列号的操作 WriteOneChar(0x44); // 启动温度转换 DelayMs(10); Init_DS18B20(); WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=ReadOneChar(); //低位 b=ReadOneChar(); //高位 b<<=8; t=a+b; return(t); }
2053
1万
4万
版主
60
4163
资深工程师
91
4166
发表回复 本版积分规则 回帖后跳转到最后一页
时间类勋章
人才类勋章
发帖类勋章
等级类勋章
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注21ic项目外包
扫码关注21ic视频号
扫码关注21ic抖音号
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才 | 论坛帮助
京公网安备 11010802024343号