реклама на сайте
подробности

 
 
> 1-Wire
D H
сообщение Sep 20 2010, 17:02
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 62
Регистрация: 1-11-06
Пользователь №: 21 847



Не получается корректно прочитать 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ukpyr
сообщение Sep 25 2010, 07:01
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



может нужен active pullup?
Go to the top of the page
 
+Quote Post
xemul
сообщение Sep 26 2010, 09:51
Сообщение #3



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(ukpyr @ Sep 25 2010, 11:01) *
может нужен active pullup?

Active pullup вряд ли нужен для работы с одним слэйвом на стандартной скорости и на минимальном (судя по ...) расстоянии.
Если Вы про strong pullup, то чтобы оно стало нужно, мастер сначала должен подать слэйву команду, требующую спецпайка. Здесь же всё затыкается ещё на READ ROM.
Могу предположить, что проблемы возникают не с оригинальными таблетками, а с китайскими аналогами - с ними желательно обеспечить >=10 мкс между битами (или вообще увеличить этот интервал в 1.5-2 раза; далласовские таблетки работают и на 6-7 мкс паузе).
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 06:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.0129 секунд с 7
ELECTRONIX ©2004-2016