Camelot
Sep 14 2005, 10:36
Добрый всем день!
Использую на плате этого зверя, управляю им с помощью Cyclone.
Написал корку, которая используя I2C, пишет в него Memory Adsress Pointer, но
этот девайс не отдает бит ACK в нужные моменты, т.е. простыми словами
молчит. Посмотрел на осциле - все ОК, пакет с синхронизацией правильные,
как в доке, но ACK от DS1678 вместо логического 0 равен логической единице (DS1678 не сливает). Если кто знает с чем это может быть связано, посоветуйте плиз.
Цитата(Camelot @ Sep 14 2005, 14:36)
Добрый всем день!
Использую на плате этого зверя, управляю им с помощью Cyclone.
Написал корку, которая используя I2C, пишет в него Memory Adsress Pointer, но
этот девайс не отдает бит ACK в нужные моменты, т.е. простыми словами
молчит. Посмотрел на осциле - все ОК, пакет с синхронизацией правильные,
как в доке, но ACK от DS1678 вместо логического 0 равен логической единице (DS1678 не сливает). Если кто знает с чем это может быть связано, посоветуйте плиз.
В каком режиме работает Ваш 'Cyclone'? Сделайте правильно начальную инициализацию Master-Slave (процессор-DS1678). Очень похоже что это не ответ ACK, а самый натуральный NACK.
И во избежании дальнейших ощибок лучше воспользуйтесь готовой (рабочей) программой-драйвером обслуживающая I2C. Такого добра и на нашем форуме и в паутине предостаточно...
Camelot
Sep 14 2005, 13:34
Да вроде правльно инициализирую, посылаю слева-направо следующий пакет:
0 - старт, 1001010-slave address, 0-write, z-ACK, 0000FFFF-internal address, z-ACK, 1-stop.
Цитата(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 и посмотрите еще раз описание, что еше необходимо для инициализации. Далее частота передачи должна быть строго синхронизирована между устройствами во избежании ошибки 'набега'. Лучше всего синхронизироваться по прерываниям от таймера.
Camelot
Sep 14 2005, 14:02
Может это и неправильно, но во время когда DS1678 должен выставлять логический ноль на SDA, я устанавливаю 3-е состояние на этой шине, т.к. SDA двунаправленный порт. Данные на SDA изменяются по спаду фронта, по переднему фронту они уже сформированы.
Camelot
Sep 14 2005, 14:05
Синхросигнал я беру с PLL и делю его, на осциле смотрел, получается хорошие 100 КГц.
Цитата(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.
Camelot
Sep 15 2005, 07:07
Спасибо большое за советы
Особенности применения ПЛИСины, как оказалось. Добавил по выходу SDA триггер, который засинхронизировал по системному клоку и включил "open-drain" в свойствах пина. Во время когда должен отвечать логгер, переключал SDA в третье состояние (если этого не делать, то уровень SDA не вытягивает до логического нуля, а провисает где-то до 2 В, т.е. остается в логической единицей).
Цитата(Camelot @ Sep 15 2005, 11:07)
Спасибо большое за советы
Особенности применения ПЛИСины, как оказалось. Добавил по выходу SDA триггер, который засинхронизировал по системному клоку и включил "open-drain" в свойствах пина. Во время когда должен отвечать логгер, переключал SDA в третье состояние (если этого не делать, то уровень SDA не вытягивает до логического нуля, а провисает где-то до 2 В, т.е. остается в логической единицей).
Наверно можно сделать все проще...
Что-то вчера в конце дня обсуждение пошло в 'косяк' (устали). Ну сами подумайте, зачем переключаться в Z-состояние, если надо переключиться на прием (сменить выход на вход для принятия бита подтверждения ACK со стороны DS1678)!?
Я не знаю Вашей схемотехнической реализации (приемника/передатчика на ПЛИС), но если прием идет по одному внешнему выводу, а передача по другому и они естественно соединены, то конечно выход надо переводить в Z на момент приема.
Camelot
Sep 15 2005, 11:32
Передача идет по одному пину (который в ПЛИСе настроен как bidirectional). Этот пин может иметь три состояния: 0, 1, z. Поэтому так и реализовано. У меня
к Вам еще есть вопрос, если Вы не против. Читаю секунды, они вроде тикают, выключаю питание, через время включаю, но секунды начинают считать от того места где выключил питание. Значит ли это что при питании от батареи RTC неработает? И фиксирует ли логгер события при питании от батареи?
Батарейное питание для любых часовых контроллеров в том числе и для DS1678 (Vbat) предназначено, чтобы счет времени продолжался, и после обесточивания всей системы. Это как бы стандарт 'здравого смысла'. Vbat должно быть в пределах 2.6 - 3.5 В, может оно у Вас меньше? Во всяком случае в описании про подобный нюанс ничего нет. Я бы еще настоятельно Вам рекомендовал обратить внимание на пункт описания: RECOMMENDED LAYOUT FOR CRYSTAL. Возможно кварцевый генератор DS1678 работает нестабильно а в следствии этого сильно зависит от величины питающего напряжения. Необходимо использовать кварцевый резонатор который рекомендован в фирменном руководстве, а так же соблюсти защитный земляной контур-кольцо в месте соединения кварца с выводами контроллера.
Цитата(Camelot @ Sep 15 2005, 11:07)
Спасибо большое за советы
Особенности применения ПЛИСины, как оказалось. Добавил по выходу SDA триггер, который засинхронизировал по системному клоку и включил "open-drain" в свойствах пина. Во время когда должен отвечать логгер, переключал SDA в третье состояние (если этого не делать, то уровень SDA не вытягивает до логического нуля, а провисает где-то до 2 В, т.е. остается в логической единицей).
Не только SDA должеен быть Open-Drain, но и SCL тоже. Приемник имеет полное право держать уровень SCL в низком состоянии для формирования цикла ожидания. Высокий уровень (1) на линиях I2C формируется ТОЛЬКО за счет подтягивающих резисторов. Учите мат-часть!
Цитата(-Al- @ Sep 15 2005, 17:45)
Высокий уровень (1) на линиях I2C формируется ТОЛЬКО за счет подтягивающих резисторов.
Совершенно верно так работают все выходы с открытым колектором. Это еще в начальных классах высшей школы проходят...
Camelot
Sep 16 2005, 05:14
Помоему уже это проехали

После драки кулаками не машут. Вы бы лучше сказали фиксирует ли логгер события при выключенном питании, а про резисторы подтяжки, не надо меня учить
Если у DS1678 имеется NVR, то почему бы и нет?!...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.