Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: непонятки с DS2482
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
asket
Для экономии ножек на МК мною было принято решение использовать DS2482-800, для апробирования взята микросхема DS2482-100, проблема такая: после ресет шины микруха не видит сигнала присутствия, хотя физически сигнал присутствует (на осциллографе) и передается со стороны подключаемого к нему DS2406 (dual switch), а DS2482 упорно не хочет ставить флаг PPD (presence pulse detected) в регистре статусе. Кто нибудь сталкивался с этой проблемой? Как решали этот впрос?

Привожу пример кода для STM32, вроде все должно работать

Код
u32 OWReset(void)
{
   u8 command;
   u8 status;
   u32 poll_count = 0;

   // 1-Wire reset (Case B)
   //   S AD,0 [A] 1WRS [A] Sr AD,1 [A] [Status] A [Status] A\ P
   //                                   \--------/        
   //                       Repeat until 1WB bit has changed to 0
   //  [] indicates from slave
  
   command = CMD_1WRS;
   while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
   I2C_Master_BufferWrite(I2C_address, &command, 1);
  
   // loop checking 1WB bit for completion of 1-Wire operation
   // abort if poll limit reached
   do
   {
      while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
      status = I2C_Master_BufferRead1Byte(I2C_address);
   }
   while ((status & STATUS_1WB) && (poll_count++ < POLL_LIMIT));

   // check for failure due to poll limit reached
   if (poll_count >= POLL_LIMIT)
   {
      DS2482_reset();
      return FALSE;
   }

   // check for short condition
   if (status & STATUS_SD)
      short_detected = TRUE;
   else
      short_detected = FALSE;

   // check for presence detect
   if (status & STATUS_PPD)
      return TRUE;
   else
      return FALSE;
}


Заранее благодарен за любую помощь! Она нужна как воздух, срочно!
GetSmart
Что ещё висит на I2C ? Какое конкретно значение статус байта выдаёт 2482 ?
Сигнал Reset значит 2482 формирует правильно (то есть команду воспринимает) ?
asket
Цитата(GetSmart @ Nov 25 2009, 14:27) *
Что ещё висит на I2C ? Какое конкретно значение статус байта выдаёт 2482 ?
Сигнал Reset значит 2482 формирует правильно (то есть команду воспринимает) ?

Кроме DS2482 ничего не висит, а выдает после отправки команды сразу же в первом байте только 1WB, во втором байте 1WB + LL, а в третьем - 1WB сбрасывается, оставляя LL, таким образом команда выполнена, и больше ничего.

Вот на программном осциллографе удалось увидеть следующее

START 0011000 W ACK 10110100 ACK STOP // передача команды 0xB4
START 0011000 R ACK 00000001 NACK STOP // прием статуса шина занята
START 0011000 R ACK 00001001 NACK STOP // прием статуса шина занята + лог.уровень = 1
START 0011000 R ACK 00001001 NACK STOP // прием статуса шина занята + лог.уровень = 1
START 0011000 R ACK 00001000 NACK STOP // команда выполнена

Спасибо!
GetSmart
Вроде ничего подозрительного не вижу. Попробуйте перед командой CMD_1WRS делать DS2482_reset() с таймаутом 1 мс после неё. Может это поможет выяснить проблему.

Кстати, в конфигурационном байте есть такая штука - Presence-Pulse Masking (PPM). Хотя она после сброса должна быть отключена, но стоило бы принудительно прописать конфиг.байт для гарантии.
asket
Цитата(GetSmart @ Nov 25 2009, 16:20) *
Вроде ничего подозрительного не вижу. Попробуйте перед командой CMD_1WRS делать DS2482_reset() с таймаутом 1 мс после неё. Может это поможет выяснить проблему.

Кстати, в конфигурационном байте есть такая штука - Presence-Pulse Masking (PPM). Хотя она после сброса должна быть отключена, но стоило бы принудительно прописать конфиг.байт для гарантии.


В самом начале вышенаписанного кода добавил строчку DS2482_detect(), которая сбрасывает девайс (DS2482_reset) и пишет конфигурационный байт с проверкой (DS2482_write_config()), все равно не пашет. В конфигурационный байт единицу пишу на APU и PPM, а все остальные по нулю. Уже пятая микросхема, ни одна не пашет, а команду они все понимают только в одну сторону, если например передавать байт по шине, а на прием или сигнал присутствия ни в какую, хотя код брал из аппнотуа how to use ds2482. sad.gif
GetSmart
Цитата(asket @ Nov 25 2009, 21:13) *
В конфигурационный байт единицу пишу на APU и PPM, а все остальные по нулю.

В PPM надо писать 0. АPU устанавливать в 1 нужно только перед последним выводом байта/бита, когда планируется большая пауза в общении с OWI (для конверсии температуры обязательно при большом кол-ве термометров)
Может ещё схемку запостите между DS2482 и DS2406.

Цитата(asket @ Nov 25 2009, 16:57) *
проблема такая: после ресет шины микруха не видит сигнала присутствия, хотя физически сигнал присутствует (на осциллографе) и передается со стороны подключаемого к нему DS2406 (dual switch), а DS2482 упорно не хочет ставить флаг PPD (presence pulse detected) в регистре статусе.

То есть осцилл показывает два "нулевых" пульса? Из которых первый - сброс, формируемый DS2482, а второй - presence pulse, формируемый DS2406. Между которыми ~10 мкс. Так?
asket
Цитата(GetSmart @ Nov 25 2009, 18:41) *
В PPM надо писать 0. АPU устанавливать в 1 нужно только перед последним выводом байта/бита, когда планируется большая пауза в общении с OWI (для конверсии температуры обязательно при большом кол-ве термометров)
Может ещё схемку запостите между DS2482 и DS2406.

То есть осцилл показывает два "нулевых" пульса? Из которых первый - сброс, формируемый DS2482, а второй - presence pulse, формируемый DS2406. Между которыми ~10 мкс. Так?


Вообщем-то выяснил в чем проблема, оказалось банально просто - монтажник запаял на плату не того номинала резистор в разрыве шины 1 wire, вместо 100 ом запаял 1.8 КОм, причем на всю партию (гнать надо таких монтажников!), после перепайки на осциллографе видно, что сигнал выпрямился и.. О, Чудо, появился PPD! biggrin.gif Спасибо огромное, дай Бог Вам благополучия и здоровья!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.