|
1-Wire |
|
|
|
Sep 20 2010, 17:02
|

Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
 |
Ответов
(1 - 10)
|
Sep 21 2010, 17:21
|

Участник

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

|
Цитата(Палыч @ Sep 21 2010, 10:24)  На форуме в настоящее время уже обсуждаются две темы с таким же названием: http://electronix.ru/forum/index.php?showtopic=80541http://electronix.ru/forum/index.php?showtopic=80508Вы читали эти обсуждения? Остались вопросы? Спасибо, прочитал. Ошибку нашел. В конце функции чтения бита необходимо было сделать задержку 45us, для выдержки тайминга в соответствии с даташитом. 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 delay_us(45); // <------------------------------------------------- Ошибка была здесь return ReadBit; }
|
|
|
|
|
Sep 26 2010, 09:51
|
    
Группа: Свой
Сообщений: 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 мкс паузе).
|
|
|
|
|
Sep 26 2010, 15:22
|

Профессионал
    
Группа: Участник
Сообщений: 1 548
Регистрация: 20-12-07
Из: г.Новосибирск
Пользователь №: 33 486

|
Да, похоже, китайские. Вот картинка на фоне команды 33Н масштабы 2В/см и 100мксек/см
Сообщение отредактировал domowoj - Sep 26 2010, 15:24
Эскизы прикрепленных изображений
--------------------
И на камнях растут деревья!
|
|
|
|
|
Sep 27 2010, 08:43
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(domowoj @ Sep 27 2010, 05:44)  так что мастер нуль обеспечивает. Иногда, когда совпадают желания мастера и слэйва. Третий уровень - имхо, конфликт мастера, _активно_ тянущего вверх, и слэйва, тянущего вниз. Цитата Надо наверно временами попробовать поиграться Скорее, где-то 1 досылается и в DDR, и в PORT (AVR assumed).
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|