|
|
  |
Проблема с DS1678, не отвечает, работа с I2C |
|
|
|
Sep 14 2005, 10:36
|
Частый гость
 
Группа: Свой
Сообщений: 182
Регистрация: 10-01-05
Пользователь №: 1 872

|
Добрый всем день!
Использую на плате этого зверя, управляю им с помощью Cyclone. Написал корку, которая используя I2C, пишет в него Memory Adsress Pointer, но этот девайс не отдает бит ACK в нужные моменты, т.е. простыми словами молчит. Посмотрел на осциле - все ОК, пакет с синхронизацией правильные, как в доке, но ACK от DS1678 вместо логического 0 равен логической единице (DS1678 не сливает). Если кто знает с чем это может быть связано, посоветуйте плиз.
|
|
|
|
|
Sep 14 2005, 13:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Camelot @ Sep 14 2005, 14:36) Добрый всем день! Использую на плате этого зверя, управляю им с помощью Cyclone. Написал корку, которая используя I2C, пишет в него Memory Adsress Pointer, но этот девайс не отдает бит ACK в нужные моменты, т.е. простыми словами молчит. Посмотрел на осциле - все ОК, пакет с синхронизацией правильные, как в доке, но ACK от DS1678 вместо логического 0 равен логической единице (DS1678 не сливает). Если кто знает с чем это может быть связано, посоветуйте плиз. В каком режиме работает Ваш 'Cyclone'? Сделайте правильно начальную инициализацию Master-Slave (процессор-DS1678). Очень похоже что это не ответ ACK, а самый натуральный NACK. И во избежании дальнейших ощибок лучше воспользуйтесь готовой (рабочей) программой-драйвером обслуживающая I2C. Такого добра и на нашем форуме и в паутине предостаточно...
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Sep 14 2005, 13:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Camelot @ Sep 14 2005, 17:34) Да вроде правльно инициализирую, посылаю слева-направо следующий пакет: 0 - старт, 1001010-slave address, 0-write, z-ACK, 0000FFFF-internal address, z-ACK, 1-stop. Скажите, а что такое z-ACK? Это 0-ACK? Просто в моем понимании z - это третье состояние, т.е. высокоомное. Если всетаки - 0, то вроде бы все верно... Проверьте полярность фронта тактирования у SCL и посмотрите еще раз описание, что еше необходимо для инициализации. Далее частота передачи должна быть строго синхронизирована между устройствами во избежании ошибки 'набега'. Лучше всего синхронизироваться по прерываниям от таймера.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Sep 14 2005, 14:15
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Camelot @ Sep 14 2005, 18:02) Может это и неправильно, но во время когда DS1678 должен выставлять логический ноль на SDA, я устанавливаю 3-е состояние на этой шине, т.к. SDA двунаправленный порт. Данные на SDA изменяются по спаду фронта, по переднему фронту они уже сформированы. По всей видимости z-состояние для приема ACK от DS1678 надо устанавливать сразу же после тактового строба передачи W(write). Возможно Вы просто не успеваете захватить ACK. Цитата(Camelot @ Sep 14 2005, 18:05) Синхросигнал я беру с PLL и делю его, на осциле смотрел, получается хорошие 100 КГц. Хорошие они то хорошие - бесспорно, но с ними надо еще синхронизовать передачу по SDA.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Sep 15 2005, 09:46
|

Профессионал
    
Группа: Свой
Сообщений: 1 301
Регистрация: 30-11-04
Из: Россия, Н.Новгород
Пользователь №: 1 264

|
Цитата(Camelot @ Sep 15 2005, 11:07) Спасибо большое за советы Особенности применения ПЛИСины, как оказалось. Добавил по выходу SDA триггер, который засинхронизировал по системному клоку и включил "open-drain" в свойствах пина. Во время когда должен отвечать логгер, переключал SDA в третье состояние (если этого не делать, то уровень SDA не вытягивает до логического нуля, а провисает где-то до 2 В, т.е. остается в логической единицей). Наверно можно сделать все проще... Что-то вчера в конце дня обсуждение пошло в 'косяк' (устали). Ну сами подумайте, зачем переключаться в Z-состояние, если надо переключиться на прием (сменить выход на вход для принятия бита подтверждения ACK со стороны DS1678)!? Я не знаю Вашей схемотехнической реализации (приемника/передатчика на ПЛИС), но если прием идет по одному внешнему выводу, а передача по другому и они естественно соединены, то конечно выход надо переводить в Z на момент приема.
--------------------
Не корысти ради, не в целях наживы, а во исполнение велений души!
|
|
|
|
|
Sep 15 2005, 13:45
|

Местный
  
Группа: Свой
Сообщений: 330
Регистрация: 10-06-05
Из: Россия, Москва
Пользователь №: 5 894

|
Цитата(Camelot @ Sep 15 2005, 11:07) Спасибо большое за советы Особенности применения ПЛИСины, как оказалось. Добавил по выходу SDA триггер, который засинхронизировал по системному клоку и включил "open-drain" в свойствах пина. Во время когда должен отвечать логгер, переключал SDA в третье состояние (если этого не делать, то уровень SDA не вытягивает до логического нуля, а провисает где-то до 2 В, т.е. остается в логической единицей). Не только SDA должеен быть Open-Drain, но и SCL тоже. Приемник имеет полное право держать уровень SCL в низком состоянии для формирования цикла ожидания. Высокий уровень (1) на линиях I2C формируется ТОЛЬКО за счет подтягивающих резисторов. Учите мат-часть!
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|