|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2012-1-31 20:28:49
|
显示全部楼层
刚才看了一下以前写的 DS2431的搜索程序,感觉应该是可以实现的,且贴出DS2431的搜索程序主要代码,从中应该可以找到思路
//---------------------------------------------
// DS2431_First
//
// 功能 开始第一次 Search
// 输入 无
// 输出 放入ROM缓存 RomCode[]
// 返回值 TRUE -- 搜索到一个!
// FALSE-- 无器件
//
//---------------------------------------------
bool
DS2431_First(void)
{
uint8_t i,B,_byte,_bit;
//初始化参数、寄存器
clrROMBuf();
for (i=0;i<64;i++)
{
NODMARK=0xff;
};
//--复位
if (!DS2431_RST())
{
return FALSE;
}
//--查找ROM命令
DS2431_WR_BYTE(DS2431CMD_SEARCH_ROM);
//-------------------------
// 开始第一次 Search
//-------------------------
for (i=0;i<64;i++)
{
_delay_us(40);
//--读取ROM第一位
B=0;
if ( DS2431_RD_BIT() ) B=0x02;
//--读取ROM第一位的补码
if ( DS2431_RD_BIT() ) B+=1;
_byte= i / 8;
_bit= i % 8;
switch (B)
{
case 0x00: /*存在设备 此位 有 0 也有 1*/
DS2431_WR_BIT(0);
NODMARK[_byte] |= BIT(_bit);
ROMBuf[0][_byte]&= ~BIT(_bit);
//printstr("0",1);
break;
case 0x01: /*存在设备 此位都为 0*/
DS2431_WR_BIT(0);
NODMARK[_byte] &= ~BIT(_bit);
ROMBuf[0][_byte]&= ~BIT(_bit);
//printstr("1",1);
break;
case 0x02: /*存在设备 此位都为 1*/
DS2431_WR_BIT(1);
NODMARK[_byte] &= ~BIT(_bit);
ROMBuf[0][_byte]|=BIT(_bit);
//printstr("2",1);
break;
case 0x03: /*不存在任何设备*/
//printstr("3",1);
return FALSE;
break;
}
}
ROMCnt=1;
//printBuf(ROMBuf[0],ROMBufLen);
return TRUE;
}
bool
isTheLastNode(uint8_t n)
{
uint8_t i,_byte,_bit;
for (i=(n+1);i<64;i++)
{
_byte= i / 8;
_bit= i % 8;
if (NODMARK[_byte] & BIT(_bit))
{
return FALSE;
}
}
return TRUE;
}
bool
isNode(uint8_t n)
{
uint8_t _byte,_bit;
_byte= n / 8;
_bit= n % 8;
if (NODMARK[_byte] & BIT(_bit))
{
return TRUE;
}
else
{
return FALSE;
}
}
bool
isOver(void)
{
uint8_t i;
for (i=0;i<8;i++)
{
if ( NODMARK )
{
return FALSE;
}
}
return TRUE;
}
bool
DS2431_Next(void)
{
uint8_t x,i,B,_byte,_bit;
if (isOver())
{
return FALSE;
}
//--复位
if (!DS2431_RST())
{
return FALSE;
}
//--读ROM命令
DS2431_WR_BYTE(DS2431CMD_SEARCH_ROM);
//-------------------------
// 开始第一次 Search
//-------------------------
for (i=0;i<64;i++)
{
_delay_us(40);
//--读取ROM第一位
B=0;
if ( DS2431_RD_BIT() ) B=0x02;
//--读取ROM第一位的补码
if ( DS2431_RD_BIT() ) B+=1;
_byte= i / 8;
_bit= i % 8;
switch (B)
{
case 0x00: /*存在设备 此位 有 0 也有 1*/
if (isNode(i))
{
if (isTheLastNode(i))
{
DS2431_WR_BIT( 1 );
ROMBuf[ROMCnt][_byte] |= BIT(_bit);
NODMARK[_byte] &= ~BIT(_bit);
}
else
{
DS2431_WR_BIT( 0 );
ROMBuf[ROMCnt][_byte] &= ~BIT(_bit);
}
}
else
{
DS2431_WR_BIT( 1 );
ROMBuf[ROMCnt][_byte] |= BIT(_bit);
}
break;
case 0x01: /*存在设备 此位都为 0*/
DS2431_WR_BIT(0);
NODMARK[_byte] &= ~BIT(_bit);
ROMBuf[ROMCnt][_byte]&= ~BIT(_bit);
break;
case 0x02: /*存在设备 此位都为 1*/
DS2431_WR_BIT(1);
NODMARK[_byte] &= ~BIT(_bit);
ROMBuf[ROMCnt][_byte]|=BIT(_bit);
break;
case 0x03: /*不存在任何设备*/
return FALSE;
break;
}
}
ROMCnt += 1;
//printBuf(ROMBuf[ROMCnt-1],ROMBufLen);
return TRUE;
}
//---------------------------------------------
// DS2431_SearchROM
//
// 功能 搜索DS2431的ROM
// 输入 无
// 输出 放入ROM缓存 RomCode[]
// 返回值 TRUE -- CRC8 OK!
// FALSE-- CRCR8 FAIL!
//
//---------------------------------------------
uint8_t
DS2431_SearchROM(void)
{
uint8_t X,i,B,_byte,_bit;
uint8_t ROMCnt=0;
if ( DS2431_First() )
{
for (i=0;i<8;i++)
{
ActiveROM=ROMBuf[0];
}
for (i=0;i<maxROMCntofBus;i++)
{
if ( !DS2431_Next() )
{
return TRUE;
}
}
return TRUE;
}
else
{
return FALSE;
}
} |
|