📄 _1wire.c
字号:
#include <iom8v.h>
#include <macros.h>
#include "_1wire.h"
// 总线复位,检查是否有器件挂在总线上
// 如果总线上有器件返回 0,否则返回 1
unsigned char _1wire_reset(void)
{
unsigned char ack;
out_1wire();
clr_1wire();
delay_us(500);
in_1wire();
delay_us(60);
ack = get_1wire();
delay_us(500);
return ack;
}
// 从 1-wire 总线上读取一个字节的数据
unsigned char _1wire_rx(void)
{
unsigned char i, byte=0;
for(i=0; i<BITS_OF_BYTE; i++)
{
out_1wire();
clr_1wire();
delay_us(2);
in_1wire();
delay_us(8);
byte >>= 1;
if(get_1wire())
byte |= 0x80;
delay_us(100);
}
return byte;
}
// 向 1-wire 总线上写入一个字节的数据
void _1wire_tx(unsigned char dat)
{
unsigned char j = BITS_OF_BYTE;
clr_1wire();
while(j--)
{
if(dat & 0x01)
{
out_1wire();
delay_us(10);
in_1wire();
delay_us(100);
}
else
{
out_1wire();
delay_us(100);
in_1wire();
delay_us(10);
}
dat >>= 1;
}
}
// 跳过 ROM
// 操作正确返回 0,否则返回 1
unsigned char _1wire_skip_rom(void)
{
if(_1wire_reset())
return 1;
_1wire_tx(0xCC);
return 0;
}
// 生成 CRC8 校验码
unsigned char crc8_build(unsigned char* pData, unsigned char len)
{
unsigned char crc,i,j,byte;
crc=0;
for(j=0; j<len; j++)
{
WDR();
byte=pData[j];
for(i=0; i<BITS_OF_BYTE; i++)
{
if((crc^byte)&0x01)
{
crc >>= 1;
crc ^= 0x8C;
}
else
crc >>= 1;
byte >>= 1;
}
}
return crc;
}
// 写 Scratchpad
// 出错返回 1,否则返回 0
unsigned char _1wire_write_scratchpad(unsigned char* pData, unsigned char len,
unsigned char addr)
{
unsigned char i;
addr |= 0xC0; // 隐含了 addr &= 0x3F;
// 写入数据
if(_1wire_skip_rom()) // 总线复位,检查是否有器件,并跳过 ROM 命令
return 1;
_1wire_tx(0x96); // 发送 Write Scratchpad 命令
_1wire_tx(addr);
_1wire_tx(~addr);
for(i=0; i<len; i++)
_1wire_tx(pData[i]);
// 验证数据
if(_1wire_skip_rom()) // 总线复位,检查是否有器件,并跳过 ROM 命令
return 1;
_1wire_tx(0x69); // 发送 Read Scratchpad 命令
_1wire_tx(addr);
_1wire_tx(~addr);
for(i=0; i<len; i++)
if(_1wire_rx() != pData[i])
return 1;
return _1wire_reset(); // 总线复位,检查是否有器件
}
// 读 Scratchpad
unsigned char _1wire_read_scratchpad(unsigned char* pData, unsigned char len,
unsigned char addr)
{
unsigned char i;
addr |= 0xC0; // 隐含了 addr &= 0x3F;
if(_1wire_skip_rom())
return 1;
_1wire_tx(0x69);
_1wire_tx(addr);
_1wire_tx(~addr);
for(i=0; i<len; i++)
pData[i] = _1wire_rx();
return 0;
}
// COPY SCRATCHPAD 命令的BLOCK 选择代码表
const unsigned char block_selector_codes[9][8] = {
0x9A, 0x9A, 0xB3, 0x9D, 0x64, 0x6E, 0x69, 0x4C,
0x9A, 0x9A, 0x4C, 0x62, 0x9B, 0x91, 0x69, 0x4C,
0x9A, 0x65, 0xB3, 0x62, 0x9B, 0x6E, 0x96, 0x4C,
0x6A, 0x6A, 0x43, 0x6D, 0x6B, 0x61, 0x66, 0x43,
0x95, 0x95, 0xBC, 0x92, 0x94, 0x9E, 0x99, 0xBC,
0x65, 0x9A, 0x4C, 0x9D, 0x64, 0x91, 0x69, 0xB3,
0x65, 0x65, 0xB3, 0x9D, 0x64, 0x6E, 0x96, 0xB3,
0x65, 0x65, 0x4C, 0x62, 0x9B, 0x91, 0x96, 0xB3,
0x56, 0x56, 0x7F, 0x51, 0x57, 0x5D, 0x5A, 0x7F,};
// 复制 Scratchpad
unsigned char _1wire_copy_scratchpad(unsigned char subkey, unsigned char addr_range,
unsigned char* password)
{
unsigned char i;
while(addr_range >= sizeof(block_selector_codes)/sizeof(block_selector_codes[0]))
addr_range -= sizeof(block_selector_codes)/sizeof(block_selector_codes[0]);
if(_1wire_skip_rom())
return 1;
_1wire_tx(0x3C);
_1wire_tx(subkey);
_1wire_tx(~subkey);
for(i=0; i<sizeof(block_selector_codes[0]); i++) // 发送 BOLCK SELECTOR CODES
_1wire_tx(block_selector_codes[addr_range][i]);
// 发送密码
for(i=0; i<DS1991_PASSWORD_SIZE; i++)
_1wire_tx(password[i]);
return _1wire_reset();
}
// 读取 SUBKEY
unsigned char _1wire_read_subkey(unsigned char* pData, unsigned char len,
unsigned char subkey, unsigned char addr, unsigned char* password)
{
unsigned char i;
unsigned char temp;
addr = ((addr + 0x10) & 0x3F) | subkey;
if(_1wire_skip_rom())
return 1;
_1wire_tx(0x66);
_1wire_tx(addr);
_1wire_tx(~addr);
// 读取 subkey 的 ID
for(i=0; i<DS1991_SUBID_SIZE; i++)
temp = _1wire_rx();
// 发送密码
for(i=0; i<DS1991_PASSWORD_SIZE; i++)
_1wire_tx(password[i]);
// 读取数据
for(i=0; i<len; i++)
{
pData[i] = _1wire_rx();
}
return _1wire_reset();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -