📄 ib.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 + -