基于1-WireTM技术的单片机单线通信的实现
- 格式:docx
- 大小:10.36 KB
- 文档页数:2
基于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 实验名称: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调试:把程序下载到老师的开发板上并没有达到预期的效果,进过老师的一番调试后终于找到了原因,原来是那个芯片初始化的时候那个延时搞错了,不是太久就是太短了,所以就没得显示。
在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)技术及应用预览说明:预览图片所展示的格式为文档的源格式展示,下载源文件没有水印,内容可编辑和复制单总线技术及其应用单总线(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-Wire总线通信的方法可以分为以下几个步骤:
1. 硬件连接:将单片机的串口与1-Wire总线接口连接,确保连接正确。
2. 初始化单片机串口:根据单片机的串口通信协议,设置串口通信参数,如波特率、数据位、校验位等。
3. 初始化1-Wire总线接口:根据1-Wire总线协议,设置总线接口参数,如时钟频率、数据线引脚等。
4. 发送数据:通过单片机串口发送数据到1-Wire总线上,驱动总线上的传感器或其他设备。
5. 接收数据:通过1-Wire总线接口读取传感器或其他设备的数据,并将其传送到单片机串口。
6. 数据处理:对接收到的数据进行处理,如校验、解析等,并将其传送到单片机其他模块或外部设备。
需要注意的是,在实现1-Wire总线通信时,需要考虑到总线上的其他设备,如温度传感器、EEPROM等,它们可能需要进行不同的初始化设置和通信方式。
同时,还需要考虑到单片机的电源、时钟等硬件资源,以确保通信的稳定性和可靠性。
此外,对于具体的单片机型号和开发环境,具体的实现方法可能会有所不同。
因此,建议参考相关硬件和软件文档,或者寻求专业人士的帮助。
1-wire系统中TM卡的单片机等效替换方案介绍TM(Touch Memory)卡是美国Dallas 公司的专利产品。
它采用单线协议通信,通过瞬间碰触完成数据读写,既具有非接触式IC 卡的易操作性,又具有接触式IC 卡的廉价性,是当前性价比最优秀的IC 卡之一。
它的外形类似于一个钮扣(button)电池,可镶嵌于卡片、钥匙扣等物体上。
TM 卡通过一个多功能器将数据线、地址线、控制线和电源线合并为1根线,实现单线通信。
当主机加电时,TM 卡通过500 kΩ和50 Ω阻抗之间的切换来响应主机,用信号被拉低的时长(长或短)来表示数字逻辑(长为1,短为0)。
由于阻抗切换的幅度为10 000∶1,因此,触点的接触电阻不会影响数字信号的辨识。
2 1wire 通信协议单总线即只有1 根数据线, 系统中的数据交换、控制都由这根线完成。
设备(主机或从机)通过一个漏极开路或三态端口连至该数据线, 以允许设备在不发送数据时能够释放总线, 而让其他设备使用总线。
单总线通常要求外接一个约为4.7 kΩ 的上拉电阻, 这样, 当总线闲置时, 其状态为高电平。
主机和从机之间的通信可通过3 个步骤完成:初始化1wire 器件;识别1wire 器件;交换数据。
由于它们是主从结构,只有主机呼叫从机时, 从机才能应答, 因此主机访问1wire 器件都必须严格遵循单总线命令序列, 即初始化、ROM 命令、功能命令。
如果出现序列混乱,1wire 器件将不响应主机(搜索ROM 命令,报警搜索命令除外)。
SMC1990A1 是具有工厂激光刻度的64 位ROM ID 码,其中包括48 位的序列号、1 个8 位的CRC 编码和1 个8 位的产品系列号。
数据遵循单总线协议传输,用于读和写的电源由数据线本身提供,而不需要提供外部电源。
基于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。
由此可见,主机和从机进行单线通信,总是由主机发起的,即将总线由高拉低,除非被主机请求,否则从机无法主动发送数据。
除了主机外,从机之间也无法进行通信。