一站式电子元器件采购平台

华强商城公众号

一站式电子元器件采购平台

元器件移动商城,随时随地采购

华强商城M站

元器件移动商城,随时随地采购

半导体行业观察第一站!

芯八哥公众号

半导体行业观察第一站!

专注电子产业链,坚持深度原创

华强微电子公众号

专注电子产业链,
坚持深度原创

电子元器件原材料采购信息平台

华强电子网公众号

电子元器件原材料采购
信息平台

如何使用I(2)C接口的DS2482 1-Wire 主控制器

来源:analog 发布时间:2024-04-15

摘要: DS2482: 1 (2)C: 1-Wire;DS2482 (2)C (2)C (2)C (2)C (2)C (2)C (2)C (2)本应用笔记是DS2482我(2)C至机线驱动器的用户指南,详细介绍了通用机的主控制器操作的通信过程。

机网络包括一个主机和一个或多个从机器件,机的主机可以由微处理器的一个I / O引脚构成,手动产生定时脉冲。DS2482我(2)C至一线网络的桥接器件可以产生详细的一线通信时序,无需工程师参与设计。图例1;(API)、(API)、(API)、(API)详细介绍了对应于机操作的我(2)C通信。这些操作为执行当前和未来一线器件的所有功能打下了全面的基础,但基于DS250x系列EPROM的器件编程除外。1 . wire, wire, wire, wire

【中文翻译】:中文翻译:【中文翻译】DS2482可提供两种配置,单通道机的主控制器(DS2482 - 100)和带有低功耗休眠模式的一线主控制器(DS2482 - 101),以及八通道机的主控制器(DS2482 - 800)。


图1. (2)C - 1-Wire

1-Wire

下面给出几个基本的一线函数,称之为原函数,也就是为了执行所有机操作,应用中必须具备的函数。第一个函数(OWReset)是使网络上所有一线从器件复位,为接收来自机的主控制器的指令做好准备。第二个函数(OWWriteBit)完成一线主控制器向从器件写入一位的操作,而第三个函数(OWReadBit)完成从一线从器件中读取一位的操作。由于必须由一线主控制器启动所有的一线位通信,所以“读”取实际上是在“写”入一位后采样得到的结果。1 .钢丝、钢丝、钢丝、钢丝1、中文:1、中文:1、中文:8、中文:1、中文:1、中文:1、中文:

1-Wire (1-Wire)。(1)、(2)、(2)。1 .线,线,线。

表1所示是三个基本原函数(OWReset OWWriteBit / OWReadBit和OWWriteByte / OWReadByte)以及其它三个非常有用的函数(OWBlock, OWSearch和msDelay),它们构成了一系列主要的基本一线操作。这些操作名称将在下文中使用。

表1. 电线
操作描述
OWReset发送1线复位刺激,检查1线从设备是否存在脉冲。
OWWriteBit / OWReadBit向1-Wire网络发送或接收单个数据位。
OWWriteByte / OWReadByte向1-Wire网络发送或接收单个字节的数据。
OWBlock向1-Wire网络发送和接收多个字节的数据。
OWSearch执行1线搜索算法(见应用说明187)。
msDelay延迟至少指定的毫秒数。用于定时强上拉动作。

【中文翻译】:所有器件都支持标准速率模式。高速速率大约是标准速率的10倍。DS2482

1-Wire 1-Wire不过有些器件在协议的特定操作中需要额外供电。【中文翻译】:http://www.chinas.china.com1 .电线这种供电方式下,不能进行正常通信。DS2482通过设置强上拉标志(SPU)位供电,这将在一线的下一个字节/位通信完成后启动强上拉。ds2482-100、ds2482-101、、

1-Wire: wire: wire

表2. 电线
操作描述
OWSpeed设置1线通信速度,标准或超速。请注意,这只改变了1-Wire主机的通信速度;必须指示1线从设备在从正常到超速时进行切换。当遇到标准速度1线复位时,1线从机将始终恢复到标准速度。
OWLevel设置1-Wire功率级别(正常或供电)。
OWReadBitPower从1-Wire网络中读取单个数据位,并可选地在该位完成后立即应用供电。
OWWriteBytePower将单个字节的数据发送到1-Wire网络,并在字节完成后立即应用电力交付。

主机配置

(2) c,中文,中文,中文,中文,中文,中文,中文,中文,中文。(2) c .“”。(2) c .中文:1 .中文:1 .中文:1 .中文:1 .中文:1 .中文:1 .中文:1 .中文:1 .中文:1 .中文:1 .中文:1。所需操作请参考表3。

表3. i (2) c
操作描述
I2C_startI(2)C启动命令。
I2C_rep_startI(2)C重复启动命令。
I2C_stopI(2)C停止命令。
I2C_write将一个字节写入I(2)C总线。要写入的字节被传递给函数。
I2C_read从I(2)C总线读取一个字节。读取的字节从函数返回。

cs2482


(2)C: 1-Wire,陆基,陆基,陆基,陆基,陆基,陆基ds2482,陆基,陆基,陆基,陆基,陆基,陆基。ds2482-100, ds2482-101, ds2482-800。


图2. ds2482 i (2) c

(2) c


(2) c整整齐齐,整整齐齐。1 . wire(钢丝),wire(钢丝)

i (2) c (2) c (3)
象征描述
年代开始的条件
广告,0写访问选择DS2482
广告,1读访问选择DS2482
重复启动条件
P停止条件
一个承认
一个\不承认
(空闲)公交车不忙
& lt; byte>传输一个字节
DRST命令“设备复位”,F0h
WCFG命令'写配置',D2h
CHSL命令“通道选择”,C3h(仅限DS2482-800)
SRP命令“设置读指针”,e1
1采用命令'1-Wire Reset', B4h
1 wwb命令'1-Wire Write Byte', A5h
每一种命令'1-Wire Read Byte', 96小时
1力命令“1-Wire Single Bit”,87h
1 wt命令“1线三联体”,78小时

数据方向表示法


Master-to-SlaveSlave-to-Master

本文中许多图中的数据方向表示方法指出了通信方向是主机到从机(灰色),还是从机到主机(白色)。

ds2482

1 . wire(钢丝)


ds2482 cep / cep / cep


例1所示C程序提供检测和配置流程,写入DS2482的默认值包括机速率(标准),强上拉(关断),在线脉冲屏蔽(关断)和有源上拉(通)。该状态保持为通用变量,如果器件需要复位到该默认状态可以进行恢复。针对不同应用可以选择不同的默认值。

// DS2482 statunsigned char I2C_address;int c1WS, cSPU, cPPM, cAPU;int short_detected;//--------------------------------------------------------------------------// DS2428检测例程设置I2C地址,然后执行//设备复位,然后将配置字节写入默认值:// 1-线速(c1WS) =标准(0)//强拉上(cSPU) =关(0)//存在脉冲屏蔽(cPPM) =关(0)//活动拉上(cAPU) =开(CONFIG_APU = 0x01)////返回:如果检测到设备并写入,则为TRUE // FALSE未检测到设备或写入配置字节失败//int DS2482_detect(unsigned char addr){//设置全局地址I2C_address = addr;//复位DS2482所选地址如果(!DS2482_reset )返回FALSE;//默认配置c1WS = FALSE;cSPU = FALSE;cPPM = FALSE;cAPU = CONFIG_APU;//写入默认配置设置if (!DS2482_write_config(c1WS | cSPU | cPPM | cAPU))返回FALSE;返回TRUE;}

例1. ds2482 cep / cep / cep

ds2482


(2) c); (2);例2给出了DS2482复位命令的C程序,可实现器件状态机逻辑的完全复位,并终止所有正在进行的一线通信。【中文译文】


图3. 上电后进行器件复位。该实例包括可选的读访问,以检验命令是否成功执行。

//--------------------------------------------------------------------------// 执行设备重置DS2482 / / / /返回:真如果设备重置/ /假或未能执行重置/ /设备无法检测到int DS2482_reset   {unsigned char状态;//设备复位// S AD,0 [A] DRST [A] Sr AD,1 [A] [SS] A\ P //[]表示从slave // SS状态字节读取验证状态I2C_start ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_DRST EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);status = I2C_read(NACK);I2C_stop  ;//检查状态是否因读回错误而失败返回((status &0xF7) == 0x10);}

例2. 复位器件代码

ds2482


图4所示为DS2482写配置的我(2)C通信例程,例3所示为实现DS2482写配置命令时序的C程序。D2h。


图4. 写配置寄存器,该实例中包括可选择的读操作,用于验证是否成功执行命令。

//--------------------------------------------------------------------------// 写在DS2482配置寄存器。配置//选项在所提供的配置字节的下半部分提供。//当写入到DS2482时,上端咬痕按位反转。////返回:TRUE:配置写入且响应正确// FALSE:响应不正确//int DS2482_write_config(unsigned char config){unsigned char read_config;// Write configuration (Case A) // S AD,0 [A] WCFG [A] CF [A] Sr AD,1 [A] [CF] A\ P //[]表示从slave // CF配置字节写入I2C_start ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_WCFG EXPECT_ACK);I2C_write(config | (~config <<4)、EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);read_config = I2C_read(NACK);I2C_stop  ;如果(config != read_config){//处理错误//…DS2482_reset  ;返回错误;}返回TRUE;}

例3. ds2482

ds2482


(2) c“”,“”,“”。ds2482-100或ds2482-101。【中文】:C3h。电线,电线,电线。


图5. 写通道选择寄存器,该实例中包括可选择的读操作,用于验证是否成功执行命令。

//--------------------------------------------------------------------------// 选择ds2482 - 800机的通道。////返回:TRUE,如果通道选定// FALSE设备未检测到或执行select失败//int DS2482_channel_select(int channel){unsigned char ch, ch_read, check;// Channel Select (Case A) // S AD,0 [A] CHSL [A] CC [A] Sr AD,1 [A] [RR] A\ P //[]表示从slave // CC通道值// RR通道回读I2C_start ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_CHSL EXPECT_ACK);switch (channel) {default: case 0: ch = 0xF0;ch_read = 0xB8;打破;情形1:ch = 0xE1;ch_read = 0xB1;打破;情况2:ch = 0xD2;ch_read = 0xAA;打破;案例3:ch = 0xC3;ch_read = 0xA3;打破;案例4:ch = 0xB4;ch_read = 0x9C;打破;案例5:ch = 0xA5;Ch_read = 0x95;打破;案例6:ch = 0x96;ch_read = 0x8E;打破;案例7:ch = 0x87;Ch_read = 0x87;打破;};I2C_write (ch, EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);check = I2C_read(NACK);I2C_stop  ;//检查由于通道返回错误的回读导致的失败(check == ch_read);}

例4. ds2482-800

DS2482 1-Wire

OWReset


机复位命令(B4h)在一线总线上执行机复位和一线器件在线应答脉冲检测。通过状态寄存器中的在线应答脉冲检测(产后抑郁症)和短路检测(SD)字段,可以采样和报告机总线的状态。1 (2)C (2)“”“”“”“”“”“”


图6. 1-导线http://www.chinac.cn/cn/或http://www.chinac.cn/cn/连续检测机的空闲(1 wb = 0),忙状态,直到机命令完成为止,等到机命令执行完成,然后读取结果。

//--------------------------------------------------------------------------// 重置所有的设备在一线净并返回结果。////返回:TRUE(1):检测到存在脉冲,设备(s)复位// FALSE(0):未检测到存在脉冲//int OWReset(void){unsigned char状态;Int poll_count = 0;// 1线复位(情况B) // S AD,0 [A] 1WRS [A] Sr AD,1 [A][状态]A[状态]A\ P // \--------/ /重复,直到1WB位变为0 //[]表示从I2C_start ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_1WRS EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);//循环检查1WB位是否完成1线操作//如果轮询限制达到status = I2C_read(ACK)终止;do {status = I2C_read(status &STATUS_1WB);} while ((status &STATUS_1WB),,(poll_count + + & lt;POLL_LIMIT));I2C_stop  ;如果(poll_count >= POLL_LIMIT){//处理错误//…DS2482_reset  ;返回错误;} //检查短条件if (status &STATUS_SD) short_detected = TRUE;else short_detected = FALSE;//检查是否存在检测if (status &STATUS_PPD)返回TRUE;否则返回FALSE;}

例5. 微信号:

OWWriteBit / OWReadBit


1-Wire哒哒哒(0x87)哒哒哒(2)C (2)C (2)C (2)图8【中文译文】◆OWWriteBit、OWReadBit、OWTouchBit


图7. 一线位,在一线总线上生成一个时隙,当世行从1变为0时,状态寄存器保持一线位命令的有效结果。


图8. 电线

//--------------------------------------------------------------------------// 发送1位机通信的网络。//使用参数sendbit的最低有效位。/ / / /“sendbit”——1比特发送(最低有效字节)/ /空白OWWriteBit (unsigned char sendbit) {OWTouchBit (sendbit );}//--------------------------------------------------------------------------// 读1比特的沟通从一线净并返回/ / / / / /返回结果:1位读取机Net//unsigned char OWReadBit{返回OWTouchBit (0 x01(无效) );}//--------------------------------------------------------------------------// 通信的发送1位一线网和返回/ /结果1位读取机网。参数'sendbit'//使用最低有效位,结果的最低有效位//是返回位。//// 'sendbit' -最低有效位是要发送的位////返回:0:从sendbit读取0位// 1:从sendbit读取1位//unsigned char OWTouchBit(unsigned char sendbit){unsigned char状态;Int poll_count = 0;// 1- wire bit (Case B) // S AD,0 [A] 1WSB [A] BB [A] Sr AD,1 [A] [Status] A [Status] A\ P // \--------/ /重复,直到1WB bit变为0 //[]表示来自slave // BB表示包含msbit中位值的字节I2C_start ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_1WSB EXPECT_ACK);I2C_write (sendbit ?0x80: 0x00, EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);//循环检查1WB位是否完成1线操作//如果轮询限制达到status = I2C_read(ACK)终止;do {status = I2C_read(status &STATUS_1WB);} while ((status &STATUS_1WB),,(poll_count + + & lt;POLL_LIMIT));I2C_stop  ;如果(poll_count >= POLL_LIMIT){//处理错误//…DS2482_reset  ;返回0;} //返回位状态if (status &STATUS_SBR)返回1;否则返回0;}

例6. 电线

OWWriteByte


1-Wire: 1-Wire: 1-Wire: 1-Wire: 1-Wire: 1-Wire元件元件元件元件元件元件元件元件元件元件I(2)C (1-Wire)1 . wire . wire . wire .电线。


图9. 1-导线。金属丝。巴巴巴巴巴巴,巴巴巴巴,巴巴,巴巴,巴巴,巴巴,巴巴。

//--------------------------------------------------------------------------// 发送8位机的通信网络,并验证/ / 8位读取机网是一样的(写操作)。//参数'sendbyte'使用最低有效的8位。//// 'sendbyte' - 8位发送(最低有效字节)////返回:TRUE:写入的字节和echo相同// FALSE: echo不相同//void OWWriteByte(unsigned char sendbyte){unsigned char状态;Int poll_count = 0;// 1- wire Write Byte (Case B) // S AD,0 [A] 1WWB [A] DD [A] Sr AD,1 [A] [Status] A [Status] A\ P // \--------/ //重复直到1WB位变为0 //[]表示从slave // DD数据写入I2C_start ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_1WWB EXPECT_ACK);I2C_write (sendbyte EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);//循环检查1WB位是否完成1线操作//如果轮询限制达到status = I2C_read(ACK)终止;do {status = I2C_read(status &STATUS_1WB);} while ((status &STATUS_1WB),,(poll_count + + & lt;POLL_LIMIT));I2C_stop  ;如果(poll_count >= POLL_LIMIT){//处理错误//…DS2482_reset  ;}}

例7. OWWriteByte

OWReadByte


1-Wire: 1-Wire: 1-Wire: 1-Wire元件元件元件元件元件元件元件元件元件I(2)C,1-线。这句话的意思是:“我的意思是,我的意思是我的意思。”


图10. 1 .电线。金属丝。1 . 1 . 1 . 0。然后设置读指针指向读数据寄存器(代码E1h),并再次访问该器件,读取从机的总线上得到的数据字节。

//--------------------------------------------------------------------------// 发送阅读交流的8位一线网和返回/ / 8位从一线净读取结果。////返回:从1-Wire Net//unsigned char读取的8位OWReadByte(void){unsigned char数据,状态;Int poll_count = 0;// 1- wire Read Bytes (Case C) // S AD,0 [A] 1WRB [A] Sr AD,1 [A] [Status] A [Status] A // \--------/ /重复直到1WB位变为0 // Sr AD,0 [A] SRP [A] E1 [A] Sr AD,1 [A] DD A\ P // //[]表示从slave // DD数据读取I2C_start ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_1WRB EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);//循环检查1WB位是否完成1线操作//如果轮询限制达到status = I2C_read(ACK)终止;do {status = I2C_read(status &STATUS_1WB);} while ((status &STATUS_1WB),,(poll_count + + & lt;POLL_LIMIT));如果(poll_count >= POLL_LIMIT){//处理错误//…DS2482_reset  ;返回0;} I2C_rep_start  ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_SRP EXPECT_ACK);I2C_write (0 xe1 EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);data = I2C_read(NACK);I2C_stop  ;返回数据;}

例8. OWReadByte

OWBlock


OWBlock, 1-Wire, 1-WireOWBlock;

//--------------------------------------------------------------------------// OWBlock的传输一个数据块的/ /一线网。结果在同一个缓冲区中返回。//// 'tran_buf' -指向一个无符号块的指针//长度为'tran_len'的字符将被发送//到1-Wire Net// 'tran_len' -以字节为单位的长度传输//void OWBlock(unsigned char *tran_buf, int tran_len){int i;For (i = 0;我& lt;tran_len;我+ +)tran_buf[我]= OWTouchByte (tran_buf [i ]);}//--------------------------------------------------------------------------// 通信发送8位一线网和返回/ / 8位从一线净读取结果。参数'sendbyte'//使用最低有效的8位,结果的最低有效的8位//是返回字节。//// 'sendbyte' - 8位发送(最低有效字节)////返回:从sendbyte//无符号char OWTouchByte(无符号char sendbyte)读取8位{if (sendbyte == 0xFF)返回OWReadByte ;其他{owwritebyte (sendbyte);返回sendbyte;}}

例9. OWBlock

OWSearch/1-Wire


机搜索命令用于搜索机网络中每个器件唯一的64位注册码,这个唯一的注册码通常在数据资料中用罗码表示,因为它存储在只读存储器。。1 .线。1-Wire:线,线,线。二叉树搜索通过以下操作判断64位的每一位:首先读一位,读取该位的补码,然后写入一位以确定留在搜索中的器件。这三个单独的位操作时序称为三合一操作。DS2482: wire(线)。

三合一命令(78 h)可在一线总线上产生3个时隙,其中包括两个读时隙和一个写时隙。(dir)(11)。10 . wire wire wire wire wire wire wire wire wire。调用OWFirst,然后重复调用OWNext,可以查找到一线网络的所有器件。“1-Wire”,“1-Wire”。


图11. 1-Wire, 1-Wire, 1-Wire【中文翻译】这句话的意思是:“电线”。

//搜索statunsigned char ROM_NO[8];int last不符;int lastfamily不符;int LastDeviceFlag;unsigned char crc8;//--------------------------------------------------------------------------//找到1-Wire网络上的“第一”设备//返回TRUE:设备找到,ROM号在ROM_NO缓冲区// FALSE:没有设备存在//int OWFirst {//重置搜索状态last不符= 0;LastDeviceFlag = FALSE;lastfamilydifference = 0;返回OWSearch  ;}//--------------------------------------------------------------------------// 找到“next”设备机网络/ /返回TRUE:设备发现,罗数ROM_NO缓冲/ /假:设备没有找到,搜索结束/ / int OWNext {/ /离开独自返回OWSearch搜索状态  ;}//--------------------------------------------------------------------------// OWSearch的通用搜索功能。这个函数//从之前的搜索状态继续。搜索状态//可以通过使用'OWFirst'函数重置。//该函数包含一个参数'alarm_only'。//当'alarm_only'为TRUE(1)时,发送查找告警命令// 0xEC,而不是普通的搜索命令0xF0。//使用find alarm命令0xEC将限制搜索到仅//处于“alarm”状态的1-Wire设备。////返回:TRUE(1):当一个1线设备被发现,它的//序列号放置在全局ROM// FALSE(0):当没有发现新的设备。最后一次搜索是最后一个设备,或者在1-Wire网络上没有设备。//int OWSearch {int id_bit_number;Int last_zero, rom_byte_number, search_result;Int id_bit, cmp_id_bit;Unsigned char rom_byte_mask, search_direction, status;//初始化搜索id_bit_number = 1;Last_zero = 0;Rom_byte_number = 0;Rom_byte_mask = 1;search_result = FALSE;c8 = 0;//如果最后一次调用不是最后一次调用if (!LastDeviceFlag) {// 1-Wire reset if (!OWReset ){//重置搜索last不符= 0;LastDeviceFlag = FALSE;lastfamilydifference = 0;返回错误;} //发出搜索命令OWWriteByte(0xF0);//循环执行搜索do{//如果这个差异如果在最后一个差异之前//在前一个下一个然后选择与上次相同的if (id_bit_number <LastDiscrepancy) {if ((ROM_NO[rom_byte_number] &rom_byte_mask)比;0) search_direction = 1;否则search_direction = 0;} else{//如果等于最后一个选择1,如果不等于则选择0 if (id_bit_number == last不符)search_direction = 1;否则search_direction = 0;} //对DS2482执行三重操作,将执行// 2个读位和1个写位status = DS2482_search_triplet(search_direction);//检查位结果状态字节id_bit =((状态&Status_sbr) == Status_sbr;Cmp_id_bit = ((status &Status_tsb) == Status_tsb);Search_direction =(状态&Status_dir) == Status_dir) ?(byte)1: (byte)0;//检查1-Wire上是否没有设备if ((id_bit) &&(cmp_id_bit))休息;Else {if ((!id_bit) &&(! cmp_id_bit),,(search_direction == 0)) {last_zero = id_bit_number;//检查family中Last的差异if (last_zero <9) lastfamily差异= last_zero;} //设置或清除ROM字节中的位rom_byte_number //使用掩码rom_byte_mask if (search_direction == 1) ROM_NO[rom_byte_number] |= rom_byte_mask;else ROM_NO[rom_byte_number] &= (byte)~rom_byte_mask//增加字节计数器id_bit_number //移动掩码rom_byte_mask id_bit_number++;Rom_byte_mask <<//如果掩码为0,则转到new SerialNum byte rom_byte_number //重置掩码如果(rom_byte_mask == 0) {calc_crc8(ROM_NO[rom_byte_number]);//累积CRC rom_byte_number++;Rom_byte_mask = 1;}}} while(rom_byte_number <8);//循环直到所有ROM字节0-7 //如果搜索成功,则if (!((id_bit_number & lt;65) || (crc8 != 0))){//搜索成功,因此设置last差异,LastDeviceFlag // search_result last差异= last_zero;//检查最后一个设备如果(last不符== 0)LastDeviceFlag = TRUE;search_result = TRUE;}} //如果没有找到设备,则重置计数器,因此next // 'search'将类似于第一个if (!search_result || (ROM_NO[0] == 0)) {last差异= 0;LastDeviceFlag = FALSE;lastfamilydifference = 0;search_result = FALSE;}返回search_result ;}//--------------------------------------------------------------------------// 使用DS2482帮助命令“一线三联体”来执行一个/ /机的搜索。//该命令有两个读位和一个写位。
写入位//是默认方向(所有设备都有相同的位),或者在//不一致的情况下,使用'search_direction'参数。////返回- DS2482状态字节的结果从三元组命令//unsigned char DS2482_search_triplet(int search_direction){unsigned char状态;Int poll_count = 0;// 1- wire Triplet (Case B) // S AD,0 [A] 1WT [A] SS [A] Sr AD,1 [A] [Status] A [Status] A\ P // \--------/ /重复直到1WB位变为0 //[]表示从从// SS表示包含搜索方向位值的字节在msbit中I2C_start ;I2C_write(I2C_address | I2C_write, EXPECT_ACK);I2C_write (CMD_1WT EXPECT_ACK);I2C_write (search_direction ?0x80: 0x00, EXPECT_ACK);I2C_rep_start  ;I2C_write(I2C_address | I2C_READ, EXPECT_ACK);//循环检查1WB位是否完成1线操作//如果轮询限制达到status = I2C_read(ACK)终止;do {status = I2C_read(status &STATUS_1WB);} while ((status &STATUS_1WB),,(poll_count + + & lt;POLL_LIMIT));I2C_stop  ;如果(poll_count >= POLL_LIMIT){//处理错误//…DS2482_reset  ;返回0;} //返回状态字节返回状态;}

例10. 搜索引擎

钢丝

OWSpeed


例11给出了如何用DS2482改变机总线速率的例程,所有一线器件默认工作在标准通信速率,有些器件可以通过Overdrive-Match-ROM或Overdrive-Skip-ROM命令转移到高速工作模式。1 .线,线,线,线【中文译文】

//--------------------------------------------------------------------------// 机网络通信速度。//// 'new_speed' -新的速度定义为// MODE_STANDARD 0x00// MODE_OVERDRIVE 0x01////返回:当前1-Wire网络速度//int OWSpeed(int new_speed){//设置速度如果(new_speed == MODE_OVERDRIVE) c1WS = CONFIG_1WS;else c1WS = FALSE;//写入新配置DS2482_write_config(c1WS | cSPU | cPPM | cAPU);返回new_speed;}

例11. OWSpeed;

OWLevel


例12给出了如何用DS2482改变机总线电平的程序,DS2482可以在执行一次位或字节通信后使能强上拉。随后,OWLevel程序将一线网络返回到标准上拉,利用OWWriteBytePower或OWReadBitPower操作使能强上拉。

//--------------------------------------------------------------------------// 设置机净线拔起正常水平。DS2482只允许在位或字节事件上启用强上拉。因此,这个//函数只允许使用MODE_STANDARD参数。启用强上拉//使用OWWriteBytePower或OWReadBitPower。//// 'new_level' -新级别定义为// MODE_STANDARD 0x00////返回:当前1-Wire网络级别//int OWLevel(int new_level){//函数只会返回非强上拉如果(new_level != MODE_STANDARD)返回MODE_STRONG;//清除全局配置状态下的强上拉位cSPU = FALSE;//写入新配置DS2482_write_config(c1WS | cSPU | cPPM | cAPU);返回MODE_STANDARD;}

例12. OWLevel

OWReadBitPower


1 . wire (wire), wire (wire)当配置寄存器中的强上拉(SPU)位使能时,在下一位或字节通信完成后,DS2482将有源拉高一线总线。该操作可通过是否获得相应的响应来验证读位的正确性,如果响应不正确,一线电平将返回到标准的上拉状态。

//--------------------------------------------------------------------------// 通信发送1位一线网,并验证/ /响应匹配applyPowerResponse比特和功率输出/ /应用于一线网。请注意,某些实现可能会先应用power//,然后在响应不正确时将其关闭。//// 'applyPowerResponse' - 1位响应检查,如果正确,然后开始//供电////返回:TRUE:位写入和响应正确,强上拉现在在// FALSE:响应不正确//int OWReadBitPower(int applyPowerResponse){unsigned char rdbit;//设置cSPU = CONFIG_SPU;//写入新的配置if (!DS2482_write_config(c1WS | cSPU | cPPM | cAPU))返回FALSE;//执行读取位rdbit = OWReadBit ;//检查响应是否正确,如果不正确则关闭强上拉if (rdbit != applyPowerResponse) {OWLevel(MODE_STANDARD);返回错误;}返回TRUE;}

例13. OWReadBitPower

OWWriteBytePower


例14为OWWriteBytePower所采用的程序,用于写入机字节并执行强上拉供电功能。当配置寄存器中的强上拉(SPU)位使能时,在下一位或字节通信完成后,DS2482将由源拉高一线总线。

//--------------------------------------------------------------------------// 发送8位机的通信网络,并验证/ / 8位读取机网是一样的(写操作)。//参数'sendbyte'使用最低有效的8位。发送// 8位后,改变1线网的电平。//// 'sendbyte' - 8位发送(最低有效位)////返回:TRUE:字节写入和echo是相同的,强拉升现在在// FALSE: echo不一样//int OWWriteBytePower(int sendbyte){//设置强拉升启用cSPU = CONFIG_SPU;//写入新的配置if (!DS2482_write_config(c1WS | cSPU | cPPM | cAPU))返回FALSE;//执行写字节OWWriteByte(sendbyte);返回TRUE;}

例14. OWWriteBytePower

结论

DS2482已经过测试,可成功完成我(2)C接口至一线网络的转换。本文给出了基于DS2482我(2)C机线驱动器的完整的一线接口方案,该接口适用于所有一线器件,所提供的例程可以在任何一个具有我(2)C通信口的主机上轻松实现。齐格,齐格,齐格,齐格。【翻译】


修订历史


11/2005。
9/2008 version 1 - 2 (2) c (2) c (2) c (2)



声明:本文观点仅代表作者本人,不代表华强商城的观点和立场。如有侵权或者其他问题,请联系本站修改或删除。

社群二维码

关注“华强商城“微信公众号

调查问卷

请问您是:

您希望看到什么内容: