1wire协议.docx
《1wire协议.docx》由会员分享,可在线阅读,更多相关《1wire协议.docx(9页珍藏版)》请在冰豆网上搜索。
1wire协议
竭诚为您提供优质文档/双击可除
1,wire,协议
篇一:
单总线(1-wiRebus)技术及其应用
单总线(1-wirebus)技术及其应用摘要:
介绍了美dallas公司推出的单总线技术的原理和信号传输方式,说明了单总线通信协议,最后以单总线器件ibutton在安防系统中的应用为例,给出了单总线的数据传输方法。
关键词:
单总线单总线协议ibutton1引言目前常用的微机与外设之间进行数据传输的串行总线主要有i2c总线、spi总线和sci总线。
其中i2c总线以同步串行2线方式进行通信(一条时钟线,一条数据线),spi总线则以同步串行3线方式进行通信(一条时钟线,一条数据输入线,一条数据输出线),而sci总线是以异步方式进行通信(一条数据输入线,一条数据输出线)的。
这些总线至少需要两条或两条以上的信号线。
近年来,美国的达拉斯半导体公司(dallassemiconductoR)推出了一项特有的单总线(1-wirebus)技术。
该技术与上述总线不同,它采用单根信号线,既可传输时钟,又能传输数据,而且数据传输是双向的,因而这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。
单总线适用于单主机系统,能够控制一个或多个从机设备。
主机可以是微控制器,从机可以是单总线器件,它们之间的数据交换只通过一条信号线。
当只有一个从机设备时,系统可按单节点系统操作;当有多个从设备时,系统则按多节点系统操作。
图1所示是单总线多节点系统的示意图。
2单总线的工作原理顾名思义,单总线即只有一根数据线,系统中的数据交换、控制都由这根线完成。
设备(主机或从机)通过一个漏极开路或三态端口连至该数据线,以允许设备在不发送数据时能够释放总线,而让其它设备使用总线,其内部等效电路如图2所示。
单总线通常要求外接一个约为4.7kΩ的上拉电阻,这样,当总线闲置时,其状态为高电平。
主机和从机之间的通信可通过3个步骤完成,分别为初始化1-wire器件、识别1-wire器件和交换数据。
由于它们是主从结构,只有主机呼叫从机时,从机才能应答,因此主机访问1-wire器件都必须严格遵循单总线命令序列,即初始化、Rom、命令功能命令。
如果出现序列混乱,1-wire器件将不响应主机(搜索Rom命令,报警搜索命令除外)。
表1是列为ΔΙΩ命令的说明,而功能命令则根据具体1-wire器件所支持的功能来确定。
表1Rom命令说明Rom命令说明搜索Rom(F0h)识别单总线上所有的1-wire器件的Rom编码读Rom(33h)(仅适合单节点)直接读1-wire器件的序列号匹配Rom(55h)寻找与指定序列号相匹配的1-wire器件跳跃Rom(cch)(仅适合单节点)使用该命令可直接访问总线上的从机设备报警搜索Rom(ech)(仅少数器件支持)搜索有报警的从机设备3信号方式所有的单总线器件都要遵循严格的通信协议,以保证数据的完整性。
1-wire协议定义了复位脉冲、应答脉冲、写0、读0和读1时序等几种信号类型。
所有的单总线命令序列(初始化,Rom命令,功能命令)都是由这些基本的信号类型组成的。
在这些信号中,除了应答脉冲外,其它均由主机发出同步信号,并且发送的所有命令和数据都是字节的低位在前。
图3是这些信号的时序图。
其中,图3(a)是初始化时序,初始化时序包括主机发出的复位脉冲和从机发出的应答脉冲。
主机通过拉低单总线至少480μs产生tx复位脉冲;然后由主机释放总线,并进入Rx接收模式。
主机释放总线时,会产生一由低电平跳变为高电平的上升沿,单总线器件检测到该上升沿后,延时15~60μs,接着单总线器件通过拉低总线60~240μsμ来产生应答脉冲。
主机接收到从机的以应答脉冲后,说明有单总线器件在线,然后主机就可以开始对从机进行Rom命令和功能命令操作。
图3中的(b)、(c)、(d)分别是写1、写0和读时序。
在每一个时序中,总线只能传输一位数据。
所有的读、写时序至少需要60μs,且每两个独立的时序之间至少需要1μs的恢复时间。
图中,读、写时序均始于主机拉低总线。
在写时序中,主机将在拉低总线15μs之内释放总线,并向单总线器件写1;若主机拉低总线后能保持至少60μs的低电平,则向单总线器件写0。
单总线器件仅在主机发出读时序时才向主机传输数据,所以,当主机向单总线器件发出读数据命令后,必须马上产生读时序,以便单总线器件能传输数据。
在主机发出读时序之后,单总线器件才开始在总线上发送0或1。
若单总线器件发送1,则总线保持高电平,若发送0,则拉低总线。
由于单总线器件发送数据后可保持15μs有效时间,因此,主机在读时序期间必须释放总线,
且须在15μs的采样总线状态,以便接收从机发送的数据。
[!
--empirenews.page--]图3单总线的几种信号时序4单总线器件通常把挂在单总线上的器件称之为单总线器件,单总线器件内一般都具有控制、收*发、存储等电路。
为了区分不同的单总线器件,厂家生产单总线器件时都要刻录一个64位的二进制Rom代码,以标志其id号。
目前,单总线器件主要有数字温度传感器(如ds18b20)、a/d转换器(如ds2450)、门标、身份识别器(如ds1990a)、单总线控制器(如ds1wm)等。
这里介绍一种ibutton形式的单总线器件,它是利用瞬间接触来进行数字通信的,这些器件的应用已经渗透到货币交易和高度安全的认证系统之中。
ibutton是采用纽扣状不锈钢外壳封装的微型计算机晶片,它具有抗撞击、防水渍、耐腐蚀、抗磁扰、防折叠、价格便宜等特点,能较好的解决传统识别器存在的不足,同时又可满足系统在可靠性、稳定性方面的要求。
ibutton主要有三种类型,分别是memoryibutton(存储器);java-poweredcryptographicibutton(加密型);thermochronibutton(温度型)。
存储型ibutton最大存储空间为64kb,可以存储文本或数字照片。
加密型ibutton是一种微处理器和高速算法加速器,可以产生大量需要加密和解密的数据信息,它的运行速度非常快,可与internet应用相结合,并可应用于远程鉴定识别。
温度型ibutton可以测量温度变化,它内含温度计、时钟、热记录和存储单元等。
图4安防系统硬件原理图5单总线器件的应用现以单总线器件ibutton在安防系统上的应用为例来进行说明,该安防系统就是利用ibutton来进行门禁识别的。
其门禁识别部分的硬件原理图如图4所示,它由主机微控制器、从机(包括ibutton信息读取头和ibutton)、主机通过Rs485进行远程通信(或通过microweb连上internet)等三部分组成。
微控制器采用microchip公司的pic16F873芯片,而api8108a语音芯片则用来告诉用户系统[1][2]下一页信息;ibutton采用ds1990a,信息读取头被读取并同时送到主机微控制器,然后由主机把收到的标识码与原先存储的ibutton标识码进行比较判断,若吻合,则系统按设定要求程序工作,否则,系统给出语音提示。
ds1990a与主机微控制器之间的通信软件设计流程图如图5所示。
通常主机与单总线器件的通信都是通过初始化、写0、写1、读0、读1时序来的完成的,下面给出用汇编语言编写的子程序,需要说明的是,这些程序虽然是针对ibutton所写的,但适用于所有的单总线器件,且简单易懂,现予给出,以供大家参考。
篇二:
1-wire程序
ds18b20程序-超详细注释
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdq=p2^2;//数据口defineinterfacesbitdula=p2^6;//数码管段选
sbitwela=p2^7;//数码管位选
uinttemp;//温度值variableoftemperature//不带小数点
unsignedcharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//带小数点
unsignedcharcodetable1[]=
{0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
/*************精确延时函数*****************/
voiddelay(unsignedchari)
{
while(--i);
}
/******************************************
此延时函数针对的是12mhz的晶振
delay(0):
延时518us误差:
518-2*256=6
delay
(1):
延时7us(原帖写"5us"是错的)
delay(10):
延时25us误差:
25-20=5
delay(20):
延时45us误差:
45-40=5
delay(100):
延时205us误差:
205-200=5
delay(200):
延时405us误差:
405-400=5
*******************************************/
/*****************ds18b20******************/
voidinit_ds18b20(void)//ds18b20初始化sendresetand
initializationcommand
{
dq=1;//dq复位,不要也可行。
delay
(1);//稍做延时
dq=0;//单片机拉低总线
delay(250);//精确延时,维持至少480us
dq=1;//释放总线,即拉高了总线
delay(100);//此处延时有足够,确保能让ds18b20发出存在脉冲。
}
ucharRead_one_byte()//读取一个字节的数据readabytedate//读数据时,数据以字节的最低有效位先从总线移出
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
dq=0;//将总线拉低,要在1us之后释放总线
//单片机要在此下降沿后的15us内读数据才会有效。
_nop_();//至少维持了1us,表示读时序开始
dat>>=1;//让从总线上读到的位数据,依次从高位移动到低位。
dq=1;//释放总线,此后ds18b20会控制总线,把数据传输到总线上
delay
(1);//延时7us,此处参照推荐的读时序图,尽量把控制器采样时间放到读时序后的15us内的最后部分
if(dq)//控制器进行采样
{
dat|=0x80;//若总线为1,即dq为1,那就把dat的最高位置1;若为0,则不进行处理,保持为0
}
delay(10);//此延时不能少,确保读时序的长度60us。
}
return(dat);
}
voidwrite_one_byte(uchardat)
{
uchari=0;
for(i=8;i>0;i--)
{
dq=0;//拉低总线
_nop_();//至少维持了1us,表示写时序(包括写0时序或写1时序)开始
dq=dat//从字节的最低位开始传输
//指令dat的最低位赋予给总线,必须在拉低总线后的15us内,
//因为15us后ds18b20会对总线采样。
delay(10);//必须让写时序持续至少60usdq=1;//写完后,必须释放总线,
dat>>=1;
delay
(1);
}
}
uintget_tmp()//获取温度getthetemperature{
floattt;
uchara,b;
init_ds18b20();//初始化
write_one_byte(0xcc);//忽略Rom指令
write_one_byte(0x44);//温度转换指令
init_ds18b20();//初始化
write_one_byte(0xcc);//忽略Rom指令
write_one_byte(0xbe);//读暂存器指令
a=Read_one_byte();//读取到的第一个字节为温度lsbb=Read_one_byte();//读取到的第一个字节为温度msbtemp=b;//先把高八位有效数据赋于temp
temp tt=temp*0.0625;//得到真实十进制温度值
//因为ds18b20可以精确到0.0625度//所以读回数据的最低位代表的是0.0625度temp=tt*10+0.5;//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字
//同时进行一个四舍五入操作。
returntemp;
}
/****************数码码动态显示函数**************/
voiddisplay(uinttemp)//显示程序
{
uchara1,a2,a3;
a1=temp/100;//百位
a2=temp%100/10;//十位
a3=temp%10;//个位
dula=0;
p0=table[a1];//显示百位
dula=1;//打开段选,对应74573的锁存位,高电平不锁存
dula=0;
wela=0;
p0=0x7e;
wela=1;//打开位选
wela=0;
delay(0);
dula=0;
p0=table1[a2];//显示十位,使用的是有小数点的数组(因为temp值扩大了10倍,虽然是十位,实际为个位)
dula=1;
dula=0;
wela=0;
p0=0x7d;
wela=1;
wela=0;
delay(0);
p0=table[a3];//显示个位
dula=1;
dula=0;
p0=0x7b;
wela=1;
wela=0;
delay(0);
}
voidmain()
{
while
(1)
{
display(get_tmp());
}
}
1-wire总线协议应用(转载)
作为一种单主机多从机的总线系统,在一条1-wire总线上可挂接的从器件数量几乎不受限制。
为了不引起逻辑上的冲突,所有从器件的1-wire总线接口都是漏极开路的,因此在使用时必须对总线外加上拉电阻(一般取5kΩ左右)。
主机对1-wire总线的基本操作分为复位、读和写三种,其中所有的读写操作均为低位在前高位在后。
复位、读和写是1-wire总线通信的基础,下面通过具体程序详细介绍这3种操作的时序要求。
(程序中dq代表1-wire总线,定义为p1.0,uchar定义为unsignedchar)
11-wire总线的复位
复位是1-wire总线通信中最为重要的一种操作,在每次总线通信之前主机必须首先发送复位信号。
如程序1.1所示,产生复位信号时主机首先将总线拉低480~960μs然后释放,由于上拉电阻的存在,此时总线变为高电平。
1-wire总线器件在接收到有效跳变的15~60μs内会将总线拉低60~240μs,在此期间主机可以通过对dq采样来判断是否有从器件挂接在当前总线上。
函数Reset()的返回值为0表示有器件挂接在总线上,返回值为1表示没有器件挂接在总线上。
程序1.1总线复位
ucharReset(void)
{
uchartd(1,wire,协议)q;
dq=0;//主机拉低总线
delay480μs();//等待480μs
dq=1;//主机释放总线
delay60μs();//等待60μs
tdq=dq;//主机对总线采样
delay480μs();//等待复位结束
returntdq;//返回采样值
}
21-wire总线的写操作
由于只有一条i/o线,主机1-wire总线的写操作只能逐位进行,连续写8次即可写入总线一个字节。
如程序1.2所示,当mcs-51单片机的时钟频率为12mhz时,程序中的语句_nop_();可以产生1μs的延时,调用此函数时需包含头文件“intrins.h”。
向1-wire总线写1bit至少需要60μs,同时还要保证两次连续的写操作有1μs以上的间隔。
若待写位wbit为0则
篇三:
1-wire总线接口应用
微机原理与接口技术实验报告
实验名称:
班级:
姓名:
学号:
实验日期:
成绩:
总线接口应用
1-wire
1-wire总线接口应用
实验目的
1、理解1-wire总线的工作时序。
2、掌握ds18b20传感器的使用方法。
3、理解不同数码之间的转换方法。
实验仪器
单片机开发板、万利仿真机、稳压电源、计算机
实验原理
1、1-wire总线
近年来,美国的dallas公司推出了一项特有的单总线(1-wirebus)技术。
该技术采用单根信号线进行数据传输。
既可传输时钟,又能传输数据,而且数据传输是双向的,因而这种单总线技术具有线路简单,硬件开销少,成本低廉,便于总线扩展和维护等优点。
所有的1-wire总线器件都具有一个共同的特征;无论是芯片内还是ibutton内,在出厂时每个器件都有一个与其它任何器件互不重复的固定的序列号。
也就是说,每一个器件都是唯一的。
一旦器件的序列号已知,通过这个序列号,任意一个器件都可以从众多连到同1-wire总线的器件中被选出用于通信。
ds18b20是dallas公司生产的一线式数字温度传感器,具有3引脚to-92小体积封装形式;温度测量范围为-55℃一+125%,可编程9一12位a/d转换精度,测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出;其工作电源既可在远端引入,也可采用寄生电源方式产生;多个ds18b20可以并联到2根或3根线上,cpu只需一根端口线就能与诸多ds18b20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
2、ds18b20的读写操作
(1)位读写时序
图4-24所示的是1-wire总的写位时序。
首先把总线拉成地电平15μs,然后根据写1或0的输出1或0约45μs(总线器件约在写出电平后15μs的时间开始采样io口数据),最后输出高电平,结束一位的读写时序。
位与位之间间隔没有限制,但至少1μs以上。
图4-241-wire总线写位时序图
1-wire总线的读位时序如图4-25所示。
首先把总线拉成地电平约8μs,然后io口为高电平释放总线。
主机(单片机)约在开始后15μs读io数据,再等待读时序结束(约45μs),最后释放总线,准备读下一位。
位与位之间间隔没有限制,但至少1μs以上。
图4-251-wire总线读位时序图
总线复位时序如图4-26所示。
主机先把总线拉成低电平并保持480μs-960μs,然后主机释放总线(变成高电平)约15μs-60μs,ds18b20发出存在信号(低电平60μs-240μs),然后ds18b20也释放总线,准备开始通信。
图4-261-wire总线复位时序图
(2)ds18b20的功能命令
一旦总线主机检测到从属器件的存在它便可以发出器件操作命令,操作命令均为8位长,部分常用命令列表如下:
ReadRom(读Rom)[33h]
此命令允许总线主机读ds18b20的8位产品系列编码唯一的48位序列号以及8位的cRc。
此命令只能在总线上仅有一个ds1820的情况下可以使用,如果总线上存在多于一个的从属器件那么当所有从片企图同时发送时,将发生数据冲突的现象,漏极开路会产生线与的结果。
matchRom(符合Rom)[55h]
符合Rom命令后继以64位的Rom数据序列允许总线主机对多点总线上特定的ds1820寻址只有与64位Rom序列严格相符的ds18b20才能对后继的存贮器操作命令作出响应。
所有与64位Rom序列不符的从片将等待复位。
此命令在总线上有单个或多个器件的情况下均可使用。
skipRom(跳过Rom)[cch]
在单点总线系统中,此命令通过允许总线主机不提供64位Rom编码而访问存储器操作来节省时间。
如果在总线上存在多于一个的从属器件,而且在skipRom命令之后发出读命令,那么由于多个从片同时发送数据会在总线上发生数据冲突漏极开路下拉会产生线与的效果。
读暂存存储器Readscratchpad[beh]
此命令读暂存存储器的内容读开始于字节0,并继续经过暂存存储器直至第九个字节字节8cRc被读出为止。
主机可以在任何时候发出一复位以中止读操作。
复制暂存存储器copyscratchpad[48h]
2
此命令把暂存存储器复制入ds18b20的epRom存储器,把温度存储器字节存贮入非易失性存储器。
如果由寄生电源供电总线主机在发出此命令之后必须能立即强制上拉至少10ms。
温度变换convertt[44h]
此命令开始温度变换不需要另外的数据。
如果有多个ds18b20连接在总线上,可以一次启动所有芯片进行温度转换。
如果由寄生电源供电那么总线主机在发出此命令之后必须立即强制上拉至少2秒。
2
重新调出e2RecallepRom
[b8h]
此命令把贮存在epRom中温度触发器的值重新调至暂存存储器。
这种重新调出的操作在对ds18b20上电时也自动执行一次。
(3)ds18b20操作过程
a、读写64位激光Rom
每一个ds18b20包括一个唯一的64位长的Rom编码。
开绐的8位是单线产品系列编码
(ds18b20编码是28h),接着的48位是唯一的系列号,最后的8位是前56位cRc。
读写时数据低位在前。
如图4-27所示。
图4-27ds18b2064位Rom编码
b、内部存储器结构
ds18b20存贮器由一个高速暂存便笺式Ram和一个非易失性电可擦除e2Ram组成。
后者存贮高温度和低温度和触发器th和tl。
暂存存贮器是按8位字节存储器来组织的头两个字节包含测得温度信息第三和第四个字节是th和tl的易失性拷贝。
在每一次上电复位时被刷新,接着的一个字节的配置存储器,接下来三个字节没有使用。
但是在读回时它们呈现为逻辑全1,还有第九个字节它可用读暂存存贮器命令读出该字节包含一个循环冗余校验cRc字节,它是前面所有8个字节的cRc值。
存储器结构如图4-28所示。
图4-28内部寄存器结构
配置寄存器功能定义如图4-29所示。
图4-29配置寄存器功能
从上图可知,不同转换精度所需的时间是不同的。
芯片默认转换精度12位。
3、ds18b20应用程序设计
ds18b20温度测量应用包含1-wire驱动程序和ds18b20驱动程序两部分。
主要有:
复位、读一个字节、写一个字节、读id码、启动温度转换、读温度、设置报警、查报警、设置温度分辨率、cRc校验。
下面说明常用驱动程序的设计。
(1)1-wire总线复位程序
参考上述复位时序,画出流程图如图4-30所示。
(2)1-wire总线读/写一个字节
2
(3)ds18b20驱动程序
ds18b20的驱动程序是在1-