基于1-WireTM技术的单片机单线通信的实现
基于1-Wire^(TM)技术的单片机单线通信的实现

基于1-Wire^(TM)技术的单片机单线通信的实现
潘海燕
【期刊名称】《微型机与应用》
【年(卷),期】2003(22)8
【摘要】利用在单线数字温度传感器上普遍采用的1-Wire技术,实现在8051单片机之间单线通信的方法。
【总页数】2页(P25-25)
【关键词】单片机;单线通信;1-Wire^TM技术;单线数字温度传感器
【作者】潘海燕
【作者单位】浙江台州职业技术学院电子电气工程系
【正文语种】中文
【中图分类】TP212.11;TP368.1
【相关文献】
1.应用HPI实现单片机与TMS320C54X DSP间的数据通信 [J], 谭勇
2.基于1-WireTM技术的单片机单线通信的实现 [J], 潘海燕
3.基于单片机串口实现1-Wire总线通信的方法 [J], 李多;陈军
4.基于1-WireTM技术的单片机单线通信的实现 [J], 潘海燕
5.TMS320C5402与单片机SPI串口通信的实现方法 [J], 何最红;张辉
因版权原因,仅展示原文概要,查看原文内容请购买。
1-wire 单总线原理

附录 A ROM 搜索实例 ROM 搜索过程只是一个简单的三步循环程序 读一位 读该位的补码 写入一个期望
的数据位 总线主机在 ROM 的每一位上都重复这样的三步循环程序 当完成某个器件后 主机就能够知晓该器件的 ROM 信息 剩下的设备数量及其 ROM 代码通过相同的过程即可 获得
下面的 ROM 搜索过程实例假设四个不同的器件被连接至同一条总线上 它们的 ROM 代码如下所示
息 例如 主机通过在发出跳越 ROM 命令后跟随转换温度命令[44h] 就可以同时命令总线
上所有的 DS18B20 开始转换温度 这样大大节省了主机的时间 值得注意 如果跳越 ROM
命令跟随的是读暂存器[BEh]的命令 包括其它读操作命令 则该命令只能应用于单节点系
统 否则将由于多个节点都响应该命令而引起数据冲突
1-wire 单总线适用于单个主机系统 能够控制一个或多个从机设备 当只有一个从机位 于总线上时 系统可按照单节点系统操作 而当多个从机位于总线上时 则系统按照多节点 系统操作
为了较为全面地介绍单总线系统 将系统分为三个部分讨论 硬件结构 命令序列和信 号方式 信号类型和时序 二 硬件结构
顾名思义 单总线只有一根数据线 设备 主机或从机 通过一个漏极开路或三态端口 连接至该数据线 这样允许设备在不发送数据时释放数据总线 以便总线被其它设备所使用 单总线端口为漏极开路 其内部等效电路如图 1 所示
在主机检测到应答脉冲后 就可以发出 ROM 命令 这些命令与各个从机设备的唯一 64 位 ROM 代码相关 允许主机在单总线上连接多个从机设备时 指定操作某个从机设备 这些命令还允许主机能够检测到总线上有多少个从机设备以及其设备类型 或者有没有设备 处于报警状态 从机设备可能支持 5 种 ROM 命令 实际情况与具体型号有关 每种命令 长度为 8 位 主机在发出功能命令之前 必须送出合适的 ROM 命令 ROM 命令的操作流 程如图 2 所示 下面将简要地介绍各个 ROM 命令的功能 以及使用在何种情况下
1-Wire(单线)概述

会话 分时使用总线。这对于操作系统或几个进程或线程要求同时使用总线的情况下是非 常重要的。当多项操作在同一器件上运行而又不能被打断的时候,需要独占总线的使用 权。
链路 基本的 1-Wire 总线通信功能。所有的 1-Wire 总线的通信功能可以归结为:复位 所有的器件和读写位。这也包括设置总线电特性的功能,如提供专用的 EPROM 编程脉 冲或进行供电。
选定 1-Wire 器件
执行一个特定器件操作
每个受控器件的序列号的整数部分是一个 8 位的家族代码。这个代码对器件模型来说是 特定的。因为每种器件模型执行不同的功能,所以可以用代码来选择用于控制或者查询器件 的协议。表 1 是达拉斯半导体公司的器件型号的家族代码。
家族代码对照 表 1
家族代码
器件型号()iButton 封装
(DS1921Z)22 NhomakorabeaDS1822
23
(DS1973), DS2433
24
(DS1904), DS2415
26
DS2438
27
DS2417
28
DS18B20
1wire通信

嵌入式原理与设计实验报告书1 实验名称:1wire总线的应用2实验目的:通过阅读芯片资料来对DS18B20芯片的认识,看懂芯片的时序图,从而进一步对芯片的工作原理的了解,更好的来对芯片的操作。
从而实现对温度的检测。
3 实验步骤:// 写temperate.h的头文件#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intsbit DQ=P2^3; //定义通信的管脚void delay_us(uint m) // 延迟{while(--m);}void Init_DS18B20(void){unsigned char x=0;DQ = 1; //DQ复位Delay_us(8); //稍做延时DQ = 0; //单片机将DQ拉低Delay_us(80); //精确延时大于480usDQ = 1; //拉高总线Delay_us(14);x=DQ; //稍做延时后如果x=0则初始化成功x=1则初始化失败Delay_us(20);}void writeonebyte(uchar dat) // 写出一个温度{uchar i;for(i=0;i<8;i++){DQ=0;DQ=dat&0x01;delay_us(10);DQ=1;dat>>=1;}}uchar readonebyte() //从传感器上读出一个温度{uchar i,dat;for(i=0;i<8;i++){DQ=0;dat>>=1;DQ=1;if(DQ)dat|=0x80;delay_us(10);DQ=1;}return dat;}//写一个源文件#include”temperate.h”uint symptom;uchar code number[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 数码管显示void initial() //单片机的初始化{TMOD=0x01;TH0=(65536-2000)/256;TL0=(65536-2000)%256;TR0=1;EA=1;ET0=1;}void delay(uint z) //延迟函数{ uint iWhile(z--){for(i=0;i<110;i++);}}void breaking() interrupt1 //单片机中断1的使用{TH0=(65536-2000)/256;TL0=(65536-2000)%256;Symptom=1;}uint ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;Init_DS18B20();writeonebyte(0xCC); // 跳过读序号列号的操作writeonebyte(0x44); // 启动温度转换Init_DS18B20();writeonebyte(0xCC); //跳过读序号列号的操作writeonebyte(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度a=readonebyte();b=readonebyte();t=(a<<4)|(b>>4);return(t);}void main(){initial();Uchar a;while(1){a=Readtemperate();P2=0x00;P0=number[a/10];delay(1);P2=0x01;P0=number[a%10];}}4调试:把程序下载到老师的开发板上并没有达到预期的效果,进过老师的一番调试后终于找到了原因,原来是那个芯片初始化的时候那个延时搞错了,不是太久就是太短了,所以就没得显示。
STC12XX单片机与DS18B20用软件实现1-Wire通信

//读取和显示温度 void Get_temperature(void) { unsigned char TPL,TPH,temp_data,temp_flg; //unsigned char Tem; unsigned int val; float t; temp_flg=0; //0,正温度标志 DQ=1; Delayus(2);
//DS18B20 Read 1Byte unsigned char DS18B20_ReadByte() { unsigned char i; unsigned char dat=0 ; for(i=0;i<8;i++) { dat>>=1; DQ=0;
Delayus(2) ;
// 1 ,
// 6us
Standard 6
代码实例(STC12XX,晶振 11.0592HZ)
void Delayus(unsigned char n) { while(n--) { _nop_(); _nop_(); } }
//DS18B20 Reset // Return 0, Reset OK; bit DS18B20_Reset() { bit CY=1;
STC12XX 单片机与 DS18B20 用软件实现 1-Wire®通信
摘要:在没有专用总线主机(如 DS18B20、DS2421)的情况下,微处理器可以轻松地产生 1-Wire 时序信号。本 应用笔记给出了一个采用‘C’语言编写、支持标准速率的 1-Wire 主机通信基本子程序实例。1-Wire 总线的四个基 本操作是:复位、写“1”、写“0”和读数据位。字节操作可以通过反复调用位操作实现,本文提供了通过各种传输 线与 1-Wire 器件进行可靠通信的时间参数。
1-wire单总线数据通信

1-wire单总线数据通信
功能命令
主器件借助功能命令访问从器件。 在成功执行初始化和ROM命令后,即可由主器件发出功能
命令,实现主器件与从器件的通信。 Dallas公司现已开发出多种信息纽扣,各器件的功能命令并
不完全相同,使用时须查阅该芯片的技术文档。
1-wire单总线数据通信
基本ROM命令
Read ROM [33H] 即将信息纽扣的注
册码读出。 用于主器件略过其
他ROM命令,直 接读取从器件的 64bit ROM注册码。
1-wire单总线数据通信
基本ROM命令
Match ROM [55H] 用于从多个从器
件中选中一个 命令字节[55H]后
必须紧随64bit ROM注册码
复位时序
1-wire单总线数据通信
写0时序
当单总线上的电平降至VTL以下时,从器件启动内部定时, 于采样窗口内(tSLSMIN至tSLSMAX)写数据0。
单总线在采样点处的电平决定了从器件在窗口内写1或0。 为了保证可靠的通信,整个采样窗口内电平值应该保持恒
定
写0时序
1-wire单总线数据通信
硬件结构
主器件或从器件通过OC门或OD门(即集电极开路或漏极 开路)连接至单总线
单总线要求外接一个5千欧姆左右的上拉电阻 如果单总线保持低电平超过480,单总线上的所有器件将复
位
1-wire单总线数据通信
单总线操作流程
初始化 执行ROM命令 执行功能命令
1-wire单总线数据通信
初始化
1-wire单总线数据通信
复位时序
主器件(单片机或PC机)发送复位脉冲(使单总线为低电 平的持续时间大于tRSTL的)
主器件释放单总线,同时转换为接收模式。 通过上拉电阻将单总线拉至高电平;从器件在检测到数据
在STM32上通过UART+DMA实现One-Wire总线

在STM32上通过UART+DMA实现One-Wire总线One-wire总线使用一根并联总线完成对于多个设备的访问,通过上拉的OD门实现多设备的读写操作,通过ID区别设备,通过CRC5完成数据校验。
常见对于one-wire总线的操作代码主要使用包含基础循环的延时函数实现位读写时序控制,进而实现总线读写(字节读写)。
随着MCU主时钟速度不断加速(STM32F4xx主时钟MCLK为168MHz),延时循环次数变得很巨大,产生了以下的问题:1. 浪费了大量的MCU时钟周期做等待。
2. 在不同编译器优化级别下,设定的延时计数值常量有可能产生不精确的延时。
3. 需要针对时序设定每个状态机的延时参数,参数调整复杂且不稳定。
1. 物理连接方法(PCB设计)2. UART实现位操作的原理1) 总线复位使用9600-8-N-1的UART配置,发送0XF0并返回0X10~0X90实现总线复位时序。
返回其他值标示总线上无设备挂载。
2) 总线位读操作使用115200-8-N-1的UART配置,发送0XFF并返回0XFF(表示读取bit为1)或其他(表示读取为0)实现总线读时序。
1) 总线位写操作使用115200-8-N-1的UART配置,发送0XFF并返回0XFF(表示写入bit为1)或发送0X00并返回0X00(表示写入为0)实现总线位写时序。
3. DMA方式实现One-wire总线读写实现除了复位操作外,对于one-wire总线的操作通常以1个字节为读写单位,即连续的8个位操作。
如果由用户代码实现多位操作,则需要用户代码不断响应UART中断函数,实现对于UART发送、接收数据寄存器的读写。
这会导致代码复杂且打断OS系统其它操作。
而采用DMA方式则很容易实现one-wire总线8bit数据的连续读写。
其原理如下:1. 设定一个宽度为byte容量为8的缓冲。
UART的TX/RX DMA 传输存储器地址都指向此缓冲。
2. 对于byte写操作,将要写入的byte通过上述的位写操作将每一bit转换成发送数据byte顺序存入缓冲,启动两个DMA,通过等待RX DMA的完成标志(TC)完成一次写操作。
单总线(onewire)技术及应用

单总线(onewire)技术及应用预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制单总线技术及其应用单总线(1~Wire Bus)技术采用单根信号线,即传输时钟,又传输数据,而且数据传输是双向的,在其线路简单、硬件开销少、成本低廉、软件设计简单方面有着无可比拟的优势。
目前常用的微机与外设串行总线主要有我们熟悉的12C总线,SPI 总线,SCI总线。
其中12C总线是以同步串行2线方式进行通信(一条时钟线,一条数据线),SPI总线是以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线),SCI总线是以异步方式进行通讯(一条数据输入线,一条数据输出线)。
这些总线至少需要有两条或两条以上的信号线。
近年来,美国的达拉斯半导体公司(DALLAS SEMICONDUCTOR)推出了一套单总线(1-Wire Bus)技术,与上述总线不同,它采用单根信号线,即传输时钟,又传输数据,而且数据传输是双向的,在其线路简单、硬件开销少、成本低廉、便于总线的扩展和维护等优点。
单总线适用于单个主机系统,能够控制一个或多个从机设备。
主机可以是微控制器,从机可以是单总线器件,如图1所示,他们之间的数据交换只通过一条数据线。
当只有一个从机设备时系统可按单节点系统操作;当有多个从机设备时,则系统按多节点系统操作。
单总线工作原理顾名思义,单总线只有一根数据线系统中的数据交换、控制都在这根线上完成。
设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,这样允许设备不发送数据时释放总线,以便其他设备使用总线,其内部等效电路如图2所示。
单总线要求外接一个约4.7?的上拉电阻,这样当总线闲置时,状态为高电平。
主机和从机之间的通信通过以下三个步骤完成:初始化1-wire器件,识别1-wire器件,交换数据。
由于二者是主从结构,只有主机呼叫从机时,从机才能答应,因此主机访问1-wire器件都必须严格遵循单总线命令序列:初始化、ROM命令、功能命令。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于1-WireTM技术的单片机单线通信的实现
在构成一个较大规模的单片机应用系统中,不可避免地要采用多机系统,经常涉及到系统间的信息交换。
在通信速率要求不高的情况下,我们希望进行通信的双方占用尽可能少的端口连线。
美国Dallas 公司生产的单线数字温度传感器DS1820 仅用1 根口线进行信息交换,该技术可以很方便地应用到单片机系统间的通信上来。
1发送和接收
单线通信的数据交换仅在1 根总线上完成,对主机和从机必须有严格的时序要求,可以借助时隙传输来实现数据的发送与接收。
如图1(a),主机向从机发送一位信息时,先由主机将总线由高(1)拉低(0)1~15μs,然后根据发送的信息是1 还是0,置总线为相应的逻辑1 或0,持续时间大于45~60μs 后释放总线。
从机检测到总线由高变低后,在15~60μs 的时间窗内采样总线,若为高,则收到1,否则收到0。
主机发送一位的总时间要求大于60μs,以便为最坏情况提供足够的时间裕量。
当主机需要接收数据时,采用如图1(b)的时隙,先由主机将总线拉低
1~15μs,然后释放。
从机检测到总线由高变低后置总线为逻辑1 或0,持续时间不少于15μs。
主机在释放总线的15μs 时间内采样总线,以接收从机发送的1 或0,同样,要求接收
一位的总时间不少于60μs。
由此可见,主机和从机进行单线通信,总是由主机发起的,即将总线由高拉低,除非被主机请求,否则从机无法主动发送数据。
除了主机外,从机之间也无法进行通信。