Не получается корректно прочитать iButton. Т.е. читается что-то из линии, но совсем не то.
В наличии имею две iButton, считанный код для каждой уникальный и повторяется при каждом чтении.
Ткните носом, где не прав.
Запись:
CODE
void Wire1_WriteBit(unsigned char cBit)
{
WIRE1_DN();
if(cBit==0) delay_us(60);
if(cBit==1) delay_us(1);
WIRE1_UP(); // Отпускание линии
if(cBit==0) delay_us(1);
if(cBit==1) delay_us(60);
}
void Wire1_SendByte(unsigned char data)
{
unsigned char temp;
unsigned char i;
SetBit(Wire1DDR,Wire1Bit); // Перевод порта в режим записи
for (i = 0; i < 8; i++) // Отправка байта в линию
{
temp = data & 0x01;
if (temp)
{
Wire1_WriteBit(1);
}
else
{
Wire1_WriteBit(0);
}
data >>= 1;
}
ClearBit(Wire1DDR,Wire1Bit); // Перевод порта в режим чтения
}
Чтение:
CODE
unsigned char Wire1_ReadBit()
{
unsigned char ReadBit=0;
SetBit(Wire1DDR,Wire1Bit); // Перевод порта в режим записи
WIRE1_DN(); // Линия вниз
delay_us(1);
WIRE1_UP(); // Линия вверх
ClearBit(Wire1DDR,Wire1Bit); // Перевод порта в режим чтения
delay_us(14);
// Чтение линии 1-Wire
if( IsBitSet(Wire1Pin, Wire1Bit) ) ReadBit=1; // В линии 1
return ReadBit;
}
unsigned char Wire1_ReadByte()
{
unsigned char data;
unsigned char i;
data = 0x00;
for (i = 0; i < 8; i++)
{
data >>= 1;
if (Wire1_ReadBit())
{
data |= 0x80;
}
}
return data;
}
После посылки Reset и приема Presence
Делаю так:
CODE
Wire1_SendByte(0x33); // Отправка команды чтения серийного номера
lcd_gotoxy(0,0);
for(i=0;i<8;i++)
{
cByte[i]=0; // Чтение одного байта из устройства
cByte[i]=Wire1_ReadByte(); // Чтение одного байта из устройства
if(i==5) lcd_gotoxy(0,1);
sprintf(cStr, "%2x ", cByte[i]);
lcd_puts(cStr);
}
Сообщение отредактировал D H - Sep 21 2010, 05:39