📄 dewire_.c
字号:
#include "Def_.h"
/*----------------------------------------------------
ONE Wire器件DS2406的操作
----------------------------------------------------*/
BOOL InitWire(void)
/*
ONE Wire总线的初始化
*/
{
U08 i;
BOOL result;
PDallasWire = 0;
TL2 = 0;
for(i=0;i<4;i++)
{
while(TL2 < 220); /* 120us */
TL2 = 0;
}
PDallasWire = 1;
TL2 = 0;
while(TL2 < 248); /* 135us */
if(1 == PDallasWire)
result = FALSE;
else
result = TRUE;
TL2 = 0;
for(i=0;i<4;i++)
{
while(TL2 < 220); /* 120us */
TL2 = 0;
}
TL2 = 0;
while(TL2 < 36); /* 20us */
return result;
}
void WireWrBit(BOOL sw)
/*
ONE Wire的写入一个bit
*/
{
PDallasWire = 0;
TL2 = 0;
if(sw)
{
while(TL2 < 11); /* 6us */
PDallasWire = 1;
TL2 = 0;
while(TL2 < 118); /* 64us */
}
else
{
while(TL2 < 110); /* 60us */
PDallasWire = 1;
TL2 = 0;
while(TL2 < 18); /* 10us */
}
}
BOOL WireRdBit(void)
/*
ONE Wire的读取一个bit
*/
{
BOOL result;
PDallasWire = 0;
TL2 = 0;
while(TL2 < 11); /* 6us */
PDallasWire = 1;
TL2 = 0;
while(TL2 < 16); /* 9us */
if(PDallasWire) result = 1;
else result = 0;
TL2 = 0;
while(TL2 < 101); /* 55us */
return result;
}
void DallasProgram(void)
/*
对写入的字节进行编程
*/
{
U08 loop;
DALLAS_PROG_1;
TL2 = 0;
for(loop=0; loop<4; loop++)
{
while(TL2 < 220); /* 120us */
TL2 = 0;
}
DALLAS_PROG_0;
}
void WireWrByte(U08 datas)
/*
写入一个byte
*/
{
U08 i;
for(i=0;i<8;i++)
{
WireWrBit(datas & 0x01);
datas >>= 1;
}
}
U08 WireRdByte(void)
/*
读取一个byte
*/
{
U08 i;
U08 rdTemp;
for(i=0;i<8;i++)
{
rdTemp >>= 1;
if(WireRdBit())
rdTemp |= 0x80;
}
return rdTemp;
}
void WireSetAddr(U16 addr)
/*
设置地址
*/
{
WireWrByte(addr&0xff);
WireWrByte(addr>>8);
}
void ReadU16Crc(void)
/*
读取16位的crc校验码
*/
{
CrcU16RdDat = WireRdByte();
CrcU16RdDat += (U16)(WireRdByte()<<8);
}
BOOL WirePreFunc(U08 funcCommand)
/*
ONE Wire器件功能命令
*/
{
BOOL result;
ClrBit(IE,7);
if(! InitWire())
result = FALSE;
else
{
WireWrByte(funcCommand);
result = TRUE;
}
SetBit(IE,7);
return result;
}
#if USE_WIRE_RD_SN
BOOL WireRdSn(U08 snBuff[],U08 snBuffLen)
/*
读取序列号,8位数组
*/
{
BOOL result;
U08 loop;
if(! WirePreFunc(READ_ROM_COMMAND))
result = FALSE;
else
{
ClrBit(IE,7);
for(loop=0; loop<snBuffLen; loop++)
snBuff[loop] = WireRdByte();
SetBit(IE,7);
CrcU08RdDat = snBuff[snBuffLen-1];
CrcU08MyDat = 0;
for(loop=0; loop<(snBuffLen-1); loop++)
Crc8Value(&CrcU08MyDat,snBuff[loop]);
if(CrcU08MyDat == CrcU08RdDat)
result = TRUE;
else
result = FALSE;
}
return result;
}
#endif
#if USE_WIRE_RD_STATUS
BOOL WireRdStatus(U08 statBuff[],U08 statBuffLen)
/*
读状态字节
*/
{
BOOL result;
U08 loop;
if(! WirePreFunc(SKIP_ROM_COMMAND))
result = FALSE;
else
{
ClrBit(IE,7);
WireWrByte(READ_STATUS);
WireSetAddr(0x0000);
for(loop=0; loop<statBuffLen; loop++)
statBuff[loop] = WireRdByte();
ReadU16Crc();
CrcU16MyDat = 0x0000;
Crc16Value(&CrcU16MyDat,READ_STATUS);
Crc16Value(&CrcU16MyDat,0x00);
Crc16Value(&CrcU16MyDat,0x00);
for(loop=0; loop<8; loop++)
Crc16Value(&CrcU16MyDat,statBuff[loop]);
SetBit(IE,7);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
result = TRUE;
else
result = FALSE;
}
return result;
}
#endif
#if USE_WIRE_WR_STATUS
BOOL WireWrStatus(U08 dat,U16 address)
/*
写状态字节,每次写一个,地址只能为0,1,2,3,4,7
当地址为7时可能返回错误,但是已经写进去,因为读出的校验与本身器件有关
*/
{
BOOL result = TRUE;
U08 recByte;
if(! WirePreFunc(SKIP_ROM_COMMAND))
result = FALSE;
else
{
ClrBit(IE,7);
WireWrByte(WRITE_STATUS);
WireSetAddr(address);
WireWrByte(dat);
ReadU16Crc();
CrcU16MyDat = 0x0000;
Crc16Value(&CrcU16MyDat,WRITE_STATUS);
Crc16Value(&CrcU16MyDat,address&0xff);
Crc16Value(&CrcU16MyDat,address>>8);
Crc16Value(&CrcU16MyDat,dat);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
{
if(address == 7) WireWrByte(0xff);
else DallasProgram();
recByte = WireRdByte();
if(dat == recByte)
result = TRUE;
else
result = FALSE;
}
else
{
result = FALSE;
}
SetBit(IE,7);
}
return result;
}
#endif
#if USE_EXT_RD_32BYTE_MEM
BOOL ExtRd32ByteMem(U16 address)
/*
读取32bytes数据
*/
{
BOOL result;
U08 redirectionByte;
U08 loop;
if(! WirePreFunc(SKIP_ROM_COMMAND))
result = FALSE;
else
{
ClrBit(IE,7);
WireWrByte(EXT_READ_MEMORY);
WireSetAddr(address);
redirectionByte = WireRdByte();
ReadU16Crc();
CrcU16MyDat = 0;
Crc16Value(&CrcU16MyDat,EXT_READ_MEMORY);
Crc16Value(&CrcU16MyDat,address&0xff);
Crc16Value(&CrcU16MyDat,address>>8);
Crc16Value(&CrcU16MyDat,redirectionByte);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
{
CrcU16MyDat = 0x0000;
for(loop=0; loop<DALLAS_REC_BUFF_MAX; loop++)
{
DallasRecBuff[loop] = WireRdByte();
Crc16Value(&CrcU16MyDat,DallasRecBuff[loop]);
}
ReadU16Crc();
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
result = TRUE;
else
result = FALSE;
}
else
{
result = FALSE;
}
SetBit(IE,7);
}
return result;
}
#endif
#if USE_WR_32BYTE_MEM
BOOL Wr32ByteMem(U16 address,U08 count)
/*
对ds2406写入数个字节进行编程
count < 32
*/
{
BOOL result;
U08 recDat;
U08 loop;
if(count > 32) count = 32;
if(! WirePreFunc(SKIP_ROM_COMMAND))
result = FALSE;
else
{
ClrBit(IE,7);
WireWrByte(WRITE_MEMORY);
WireSetAddr(address);
CrcU16MyDat = 0x0000;
Crc16Value(&CrcU16MyDat,WRITE_MEMORY);
Crc16Value(&CrcU16MyDat,address&0xff);
Crc16Value(&CrcU16MyDat,address>>8);
for(loop=0; loop<count; loop++)
{
WireWrByte(DallasSendBuff[loop]);
if(loop > 0) CrcU16MyDat = address + loop;
Crc16Value(&CrcU16MyDat,DallasSendBuff[loop]);
ReadU16Crc();
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
{
DallasProgram();
recDat = WireRdByte();
if(DallasSendBuff[loop] == recDat)
{
result = TRUE;
}
else
{
result = FALSE;
break;
}
}
else
{
result = FALSE;
break;
}
}
SetBit(IE,7);
}
return result;
}
#endif
#if USE_WR_DE_BYTE_MEM
BOOL WrDeByteMem(U08 dat,U16 address)
/*
对ds2406写入一个字节进行编程
*/
{
BOOL result;
U08 recDat;
if(! WirePreFunc(SKIP_ROM_COMMAND))
result = FALSE;
else
{
ClrBit(IE,7);
WireWrByte(WRITE_MEMORY);
WireSetAddr(address);
WireWrByte(dat);
ReadU16Crc();
CrcU16MyDat = 0x0000;
Crc16Value(&CrcU16MyDat,WRITE_MEMORY);
Crc16Value(&CrcU16MyDat,address&0xff);
Crc16Value(&CrcU16MyDat,address>>8);
Crc16Value(&CrcU16MyDat,dat);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
{
DallasProgram();
recDat = WireRdByte();
if(dat == recDat)
result = TRUE;
else
result = FALSE;
}
else
{
result = FALSE;
}
SetBit(IE,7);
}
return result;
}
#endif
#if USE_RD_DE_PIO
BOOL RdDePIO(U08 cmd_1,U08 cmd_2,U08 *dat)
/*
读取通道控制字
*/
{
BOOL result;
if(! WirePreFunc(SKIP_ROM_COMMAND))
result = FALSE;
else
{
ClrBit(IE,7);
WireWrByte(CHANNEL_ACCESS);
WireWrByte(cmd_1);
WireWrByte(cmd_2);
*dat = WireRdByte();
result = TRUE;
SetBit(IE,7);
}
return result;
}
#endif
#if USE_WR_DE_PIO
BOOL WrDePIO(U08 cmd_1,U08 cmd_2,U08 dat)
/*
读取通道控制字
*/
{
BOOL result;
if(! WirePreFunc(SKIP_ROM_COMMAND))
result = FALSE;
else
{
ClrBit(IE,7);
WireWrByte(CHANNEL_ACCESS);
WireWrByte(cmd_1);
WireWrByte(cmd_2);
WireWrByte(dat);
result = TRUE;
SetBit(IE,7);
}
return result;
}
#endif
#if USE_READ_ROM_SN_TEST
BOOL ReadRomSnTest(void)
/*
读取序列码测试
*/
{
U08 loop;
ClrBit(IE,7);
if(! InitWire())
{
SetBit(IE,7);
return FALSE;
}
WireWrByte(READ_ROM_COMMAND);
for(loop=0; loop<8; loop++)
TempBuff8Byte[loop] = WireRdByte();
CrcU08MyDat = 0;
for(loop=0; loop<7; loop++)
Crc8Value(&CrcU08MyDat,TempBuff8Byte[loop]);
SetBit(IE,7);
if(CrcU08MyDat == TempBuff8Byte[7])
return TRUE;
else
return FALSE;
}
#endif
#if USE_EXT_READ_MEM_TEST
BOOL ExtReadMemTest(void)
/*
读取存储器测试
*/
{
U08 redirectionByte;
U08 loop;
BOOL result;
// if(ReadRomSnTest())
if(SkipRomTest())
{
ClrBit(IE,7);
WireWrByte(EXT_READ_MEMORY);
DallasAddr = 0x0000;
WireSetAddr(DallasAddr);
redirectionByte = WireRdByte();
ReadU16Crc();
CrcU16MyDat = 0;
Crc16Value(&CrcU16MyDat,EXT_READ_MEMORY);
Crc16Value(&CrcU16MyDat,DallasAddr&0xff);
Crc16Value(&CrcU16MyDat,DallasAddr>>8);
Crc16Value(&CrcU16MyDat,redirectionByte);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
{
CrcU16MyDat = 0x0000;
for(loop=0; loop<DALLAS_REC_BUFF_MAX; loop++)
{
DallasRecBuff[loop] = WireRdByte();
Crc16Value(&CrcU16MyDat,DallasRecBuff[loop]);
}
ReadU16Crc();
SetBit(IE,7);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
result = TRUE;
else
result = FALSE;
}
else
{
SetBit(IE,7);
result = FALSE;
}
}
else
{
result = FALSE;
}
return result;
}
#endif
#if USE_READ_STATUS_TEST
BOOL ReadStatusTest(void)
/*
读取状态信息测试
*/
{
U08 loop;
BOOL result;
if(ReadRomSnTest())
{
ClrBit(IE,7);
WireWrByte(READ_STATUS);
DallasAddr = 0x0000;
WireSetAddr(DallasAddr);
for(loop=0; loop<8; loop++)
TempBuff8Byte[loop] = WireRdByte();
ReadU16Crc();
CrcU16MyDat = 0x0000;
Crc16Value(&CrcU16MyDat,READ_STATUS);
Crc16Value(&CrcU16MyDat,DallasAddr&0xff);
Crc16Value(&CrcU16MyDat,DallasAddr>>8);
for(loop=0; loop<8; loop++)
Crc16Value(&CrcU16MyDat,TempBuff8Byte[loop]);
SetBit(IE,7);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
result = TRUE;
else
result = FALSE;
}
else
{
result = FALSE;
}
return result;
}
#endif
#if USE_WRITE_STATUS_TEST
BOOL WriteStatusTest(void)
/*
写状态信息测试
*/
{
U08 loop;
BOOL result;
// if(ReadRomSnTest())
if(SkipRomTest())
{
ClrBit(IE,7);
WireWrByte(WRITE_STATUS);
DallasAddr = 0x0007;
WireSetAddr(DallasAddr);
WireWrByte(0xa5);
ReadU16Crc();
CrcU16MyDat = 0x0000;
Crc16Value(&CrcU16MyDat,WRITE_STATUS);
Crc16Value(&CrcU16MyDat,DallasAddr&0xff);
Crc16Value(&CrcU16MyDat,DallasAddr>>8);
Crc16Value(&CrcU16MyDat,0xa5);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
{
WireWrByte(0xff);
result = TRUE;
}
else
{
result = FALSE;
}
SetBit(IE,7);
}
else
{
result = FALSE;
}
return result;
}
#endif
#if USE_SKIP_ROM_TEST
BOOL SkipRomTest(void)
/*
功能命令测试
*/
{
BOOL result;
if(! InitWire())
{
result = FALSE;
}
else
{
ClrBit(IE,7);
WireWrByte(SKIP_ROM_COMMAND);
SetBit(IE,7);
result = TRUE;
}
return result;
}
#endif
#if USE_WR_ONE_BYTE_TEST
BOOL WrOneByteTest(U08 dat)
/*
写一个字节测试
*/
{
BOOL result;
U08 recDat;
ClrBit(IE,7);
if(! InitWire())
{
SetBit(IE,7);
result = FALSE;
}
else
{
WireWrByte(SKIP_ROM_COMMAND);
WireWrByte(WRITE_MEMORY);
DallasAddr = 0x0000;
WireSetAddr(DallasAddr);
WireWrByte(dat);
ReadU16Crc();
CrcU16MyDat = 0x0000;
Crc16Value(&CrcU16MyDat,WRITE_MEMORY);
Crc16Value(&CrcU16MyDat,DallasAddr&0xff);
Crc16Value(&CrcU16MyDat,DallasAddr>>8);
Crc16Value(&CrcU16MyDat,dat);
if( (CrcU16MyDat+CrcU16RdDat) == 0xffff)
{
DallasProgram();
recDat = WireRdByte();
if(dat == recDat)
result = TRUE;
else
result = FALSE;
SetBit(IE,7);
}
else
{
SetBit(IE,7);
result = FALSE;
}
}
return result;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -