⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 _1wire.c

📁 atmel mega8 的1线协议驱动程序
💻 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 + -