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

📄 ib.c

📁 DALLAS可代替DS1994卡的DS1904卡基于AVR代码
💻 C
字号:
/*
*********************************************************************************************************
*Copyright(c)2005,广东必达保安系统有限公司电子开发部
*All rights rerserved
*
*文件名称:ib.c
*文件标识:
*摘    要:Dallas iB的IAR V3.20A 底层协议包
*
*当前版本:1.0
*作    者:钱少群
*完成日期:2006年06月20日
*
*取代版本:
*作    者:
*完成日期:
*
*********************************************************************************************************
*/


#include "includes.h"


///////////////////////////////////////////////////
//		1-WIRE 操作
///////////////////////////////////////////////////

/*
*****************************************************
*描述:	读 DS19XX ID
*
*入口:	idBuf		ID数据区指针
*	
*出口:	返回值 = 1	数据有效
*	返回值 = 0	数据无效
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
#if	TMROM
unsigned char Tm_Rom(unsigned char *idBuf)
{
	unsigned char right = 0;
        unsigned char n = 8;
        unsigned char *tBuf;

	tBuf = idBuf;
	if (Tm_Rst() == 1)			//reset TM
	{
		Tm_Txd(IBREADROM);		//33H read rom command
		do{
			*tBuf++ = Tm_Rxd();	//read data
		}while (--n);		

		--tBuf;
		if (Crc_8n(idBuf, 7) == *tBuf)	//crc 校验
		{
			right = 1;
		}
		
		if (*idBuf == 0) right = 0;
		if (*idBuf == 0xFF) right = 0;
	}
	
	return right;
}
#endif

/*
*****************************************************
*描述:	读 DS1991 subkey
*
*入口:	adr		subkey地址
*	idBuf		ID数据区指针
*	passwordBuf	subkey密码区指针
*	dataBuf		subkey数据区指针
*	n		字节数
*出口:	idBuf		ID数据区指针
*	dataBuf		subkey数据区指针
*	返回值 = 1	数据有效
*	返回值 = 0	数据无效
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
#if	TMRDS
unsigned char Tm_Rds(unsigned char adr, 
			unsigned char *idBuf, 
			unsigned char *passwordBuf, 
			unsigned char *dataBuf, 
			unsigned char n)
{
	unsigned char right = 0;
	
	if (Tm_Rst() == 1)		//reset TM
	{
		Tm_Txd(IBSKIPROM);	//skip rom
		Tm_Txd(IBREADSUBKEY);	//read subkey
		Tm_Txd(adr);		//send low of address
		adr = ~adr;
		Tm_Txd(adr);
		
		adr = 8;		//read identifier(ID)
		do{
			*idBuf++ = Tm_Rxd();
		}while (--adr);
			
		adr = 8;		//write password
		do{
			Tm_Txd(*passwordBuf++);
		}while (--adr);
		
		do{			//read data
			*dataBuf++ = Tm_Rxd();
		}while (--n);

		right = Tm_Rst();	//reset TM
	}
	
	return right;
}
#endif

/*
*****************************************************
*描述:	写 DS1991 subkey
*
*入口:	adr		subkey地址
*	idBuf		ID数据区指针
*	passwordBuf	subkey密码区指针
*	dataBuf		subkey数据区指针
*	n		字节数
*出口:	idBuf		ID数据区指针
*	返回值 = 1	数据写正确
*	返回值 = 0	数据写错
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
#if	TMWRS
unsigned char Tm_Wrs(unsigned char adr, 
			unsigned char *idBuf, 
			unsigned char *passwordBuf, 
			unsigned char *dataBuf, 
			unsigned char n)
{
	unsigned char right = 0;
	
	if (Tm_Rst() == 1)		//reset TM
	{
		Tm_Txd(IBSKIPROM);	//skip rom
		Tm_Txd(IBWRITESUBKEY);		//write subkey
		Tm_Txd(adr);		//send address
		adr = ~adr;
		Tm_Txd(adr);
		
		adr = 8;		//read identifier(ID)
		do{
			*idBuf++ = Tm_Rxd();
		}while (--adr);

		adr = 8;		//write password
		do{
			Tm_Txd(*passwordBuf++);
		}while (--adr);
		
		do{			//write data
			Tm_Txd(*dataBuf++);
		}while (--n);
		
		right = Tm_Rst();	//reset TM
	}
	
	return right;
}
#endif

/*
*****************************************************
*描述:	读 DS1994 时钟
*
*入口:	timeBuf		时间区指针
*	
*出口:	返回值 = 1	读时钟对
*	返回值 = 0	读时钟错
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
#if	TM1994
unsigned char Tm_1994(unsigned char *timeBuf)
{
	return Tm_Rdp(02, 02, timeBuf, 5);
}
#endif

/*
*****************************************************
*描述:	读 DS1904 时钟
*
*入口:	dataBuf		数据区指针
*	
*	
*	
*出口:	返回dataBuf数据区数据
*	返回值 = 1	读数据对
*	返回值 = 0	读数据错
*
*原创: 杨富添
*时间: 2008年10月13日
*修改:
*时间:
******************************************************
*/
#if	TMRDP1904
unsigned char Tm_Rdp1904(unsigned char *dataBuf)
{
	unsigned char right = 0;
	unsigned char n = 5;
	
	if (Tm_Rst() == 1)		//reset TM
	{
		Tm_Txd(IBSKIPROM);	//skip rom
		Tm_Txd(IBREADSUBKEY);	//66H read clock
		
		do{
			*dataBuf++ = Tm_Rxd();//receive data (1个控制字节 + 4字节数据)
		}while (--n);
		
		right = Tm_Rst();	//reset TM
	}
	
	return right;
}
#endif

/*
*****************************************************
*描述:	写 DS1904
*
*入口:	
*	
*	dataBuf		数据区指针
*	n		字节数
*出口:	返回值 = 1	写数据对
*	返回值 = 0	写数据错
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
#if	TMWRP1904
unsigned char Tm_Wrp1904(unsigned char *dataBuf)
{
	unsigned char right = 0;
	unsigned char n = 5;

	if (Tm_Rst() == 1)		//reset TM
	{
		Tm_Txd(IBSKIPROM);	//skip rom
		Tm_Txd(IBWRITESUBKEY);//write scratchpad
		
		do{
			Tm_Txd(*dataBuf++);//send data
		}while (--n);

		right = Tm_Rst();	//reset TM
	}
	
	return right;
}
#endif

/*
*****************************************************
*描述:	读 DS1996 页
*
*入口:	adrHigh		数据高地址
*	adrLow		数据低地址
*	dataBuf		数据区指针
*	n		字节数
*出口:	返回dataBuf数据区数据
*	返回值 = 1	读数据对
*	返回值 = 0	读数据错
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
#if	TMRDP
unsigned char Tm_Rdp(unsigned char adrHigh, 
			unsigned char adrLow, 
			unsigned char *dataBuf, 
			unsigned char n)
{
	unsigned char right = 0;
	
	if (Tm_Rst() == 1)		//reset TM
	{
		Tm_Txd(IBSKIPROM);	//skip rom
		Tm_Txd(IBREADMEMORY);	//read memory
		Tm_Txd(adrLow);		//send low of address
		Tm_Txd(adrHigh);	//send high of address
		
		do{
			*dataBuf++ = Tm_Rxd();//receive data
		}while (--n);
		
		right = Tm_Rst();	//reset TM
	}
	
	return right;
}
#endif

/*
*****************************************************
*描述:	写 DS1996 页
*
*入口:	adrHigh		数据高地址
*	adrLow		数据低地址
*	dataBuf		数据区指针
*	n		字节数
*出口:	返回值 = 1	写数据对
*	返回值 = 0	写数据错
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
#if	TMWRP
unsigned char Tm_Wrp(unsigned char adrHigh, 
			unsigned char adrLow, 
			unsigned char *dataBuf, 
			unsigned char n)
{
	unsigned char right = 0;
	unsigned char ta1;
	unsigned char ta2;
	unsigned char ta3;
	//unsigned char ta4;

	//ta4 = n;
	if (Tm_Rst() == 1)		//reset TM
	{
		Tm_Txd(IBSKIPROM);	//skip rom
		Tm_Txd(IBWRITESCRATCHPAD);//write scratchpad
		Tm_Txd(adrLow);		//send low of address
		Tm_Txd(adrHigh);	//send high of address
		do{
			Tm_Txd(*dataBuf++);//send data
		}while (--n);

		Tm_Rst();
		Tm_Txd(IBSKIPROM);	//skip rom
		Tm_Txd(IBREADSCRATCHPAD);//read scratchpad
		ta1 = Tm_Rxd();
		ta2 = Tm_Rxd();
		ta3 = Tm_Rxd();

		Tm_Rst();
		Tm_Txd(IBSKIPROM);	//skip rom	
		Tm_Txd(IBCOPYSCRATCHPAD);//copy scratchpad
		Tm_Txd(ta1);
		Tm_Txd(ta2);
		Tm_Txd(ta3);
		
		right = Tm_Rst();	//reset TM
	}
	
	return right;
}
#endif

/*
*****************************************************
*描述:	读 DS1971 页
*
*入口:	adr		数据地址
*	dataBuf		数据区指针
*	n		字节数
*出口:	返回值 = 1	读数据对
*	返回值 = 0	读数据错
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
#if	TMRD71
unsigned char Tm_Rd71(unsigned char adr, 
			unsigned char *dataBuf, 
			unsigned char n)
{
	unsigned char right = 0;
	
	if (Tm_Rst() == 1)		//reset TM
	{
		Tm_Txd(IBSKIPROM);	//skip rom
		Tm_Txd(IBREADMEMORY);	//read memory
		Tm_Txd(adr);		//send low of address
		
		do{
			*dataBuf++ = Tm_Rxd();//receive data
		}while (--n);
		
		right = Tm_Rst();	//reset TM
	}
	
	return right;
}
#endif



//////////////////////////////////////////////////////
////		DS19XX 操作时序
//////////////////////////////////////////////////////


/*
*****************************************************
*描述:	DS19XX 复位时序
*
*入口:	
*
*出口:	返回值 = 1	复位正确
*	返回值 = 0	复位错误
*
*原创: 钱少群 
*时间: 2005年3月21日
*修改: 冯纯枝
*时间: 2005年12月12日
******************************************************
*/
unsigned char Tm_Rst(void)
{
	unsigned char rst = 0;
	
	if (Tm_Wdrst() == 1)	rst = 1;
	Delay_10Us(41); 	//delay 410us
	
	return rst;
}

/*
*****************************************************
*描述:	DS19XX 发送字节时序
*
*入口:	valTx	发送数据
*
*出口:	
*
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
void Tm_Txd(unsigned char valTx)
{
	unsigned char n = 8;
	
	s(DDRTM, TM);			//Set output
	do{
		c(PORTTM, TM);		//clr TM
		Delay_5Us();		//delay 8us
		
		if (b(valTx,0))
		{
			s(PORTTM, TM);	//SET TM
		}
		Delay_10Us(9);		//Delay 90us
		
		s(PORTTM, TM);		//set TM
		Delay_5Us();		//delay 8us
		
		valTx = valTx >> 1;
	}while (--n);
}

/*
*****************************************************
*描述:	DS19XX 接收字节时序
*
*入口:	
*
*出口:	返回数据
*
*
*原创: 钱少群
*时间: 2005年3月21日
*修改:
*时间:
******************************************************
*/
unsigned char Tm_Rxd(void)
{
	unsigned char n = 8;
	unsigned char valRx = 0;

	do{
		s(DDRTM, TM);	//set output
		c(PORTTM, TM);	//clr TM
		Delay_5Us();	//delay 5us
		
		valRx = valRx >> 1;
		
		s(PORTTM, TM);
		c(DDRTM, TM);
		Delay_10Us(1);	//delay 10us
		
		if (b(PINTM, TM)) valRx |= 0x80;//test TM if TM=1 then set '1'
                Delay_10Us(10); 	//delay 100us
	}while (--n);
	
	return valRx;
}


/*
*****************************************************
*描述:	DS19XX 看门狗读复位时序
*
*入口:	
*
*出口:	返回值 = 1	复位正确
*	返回值 = 0	复位错误
*
*原创: 冯纯枝
*时间: 2005年12月12日
*修改: 
*时间: 
******************************************************
*/
unsigned char Tm_Wdrst(void)
{
	unsigned char rst = 0;
	
	s(DDRTM, TM);		//Set output
	c(PORTTM, TM);		//clr TM
	Delay_10Us(50);		//delay 500us
	
	s(PORTTM, TM);		//PULL UP
	c(DDRTM, TM);		//Set input
	
	Delay_10Us(9);		//delay 90us
	if (b(PINTM, TM) == 0)	//test TM if TM=0 then OK=1
	  rst = 1;
				//OK为标志OK=0=false OK=1=true
	
	return rst;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -