Наконец-то добил я аппаратный I2C на STM8: мало того, что из ERRATA несколько "патчей" внести пришлось, так еще и кое-какие косяки свои исправить. Еще я долго бился, пытаясь понять, почему у меня ожидание кое-каких флагов отваливается. Оказывается, sdcc до gcc еще расти и расти: если аргумент макроса не окружить скобками, то он превращается в пустоту...
Вот код на гитхабе, на сосфорже, соответственно, тоже зеркало лежит.
Т.к. поверенных барометров и термометров у меня при себе нет, протестировать качество показаний этого датчика не по чем.
Вот код на гитхабе, на сосфорже, соответственно, тоже зеркало лежит.
Т.к. поверенных барометров и термометров у меня при себе нет, протестировать качество показаний этого датчика не по чем.
no subject
Date: 2015-06-01 09:25 am (UTC)Вообще аппаратная и2с в большинстве процов довольна мерзка, глючна и тяжела в обработке ошибок, поэтому всегда использую программную реализацию.
no subject
Date: 2015-06-01 10:07 am (UTC)В даташите (да и в описании протокола) я такого не видел. В случае сбоя следующая посылка восстановит линию, посылая периодически STOP.
Да и просто посылка NACK+STOP полностью должна прервать события слейва.
В любом случае, это не страшно: ну, подумаешь, вернет отправка сообщения слейву NACK — в следующий раз повторит.
Я еще попробую эту реализацию с другими датчиками, если будут глюки — отпишусь. А программную надо еще будет сделать. Я все думаю, как: на основе таймера по аналогии с реализацией 1-wire (на одной ноге вешаются два канала compare/capture: один на передачу, другой на прием), или же по-авровски (через задницу, с ногодрыгом).
Потом еще надо будет все это на STM32 перенести: все-таки, STM8 — это игрушка. Единственный смысл под STM8 писать — это чтобы какой-нибудь датчик подвесить к "вольтметру" и получить новый прибор (термометр, барометр, гигрометр и т.п.). Правда, учитывая то, что готовые термометры/психрометр/гигрометры и т.п. стоят дешевле, чем получающийся монстр, то это просто игры "на будущее" — для пополнения базы сниппетов. Тяжко просто в сети найти вменяемые (с моей точки зрения) реализации кода под всякие разные датчики.
no subject
Date: 2015-06-01 11:08 am (UTC)На практике иногда это приводит к полному подвису и захвату линии слейвом.
Много ссылок, хороших и разных по software i2c reset. Например
http://www.analog.com/media/en/technical-documentation/application-notes/54305147357414AN686_0.pdf
Программную проще и универсальнее делать ногодрыгом, этож полностью синхронный интерфейс, в отличие от 1ware. Почему это через задницу совершенно непонятно. Да и 1wire неплохо реализуется на задержках с разрешением прерываний между битами. Всего 3 калиброванные задержки и в одном месте. Но это на сях уже не особо красиво, конечно, зависит от компилятора( хотя задержки можно и опросом таймера сделать) и требует 60мкс запрета прерываний.Зато легко позволяет много линий датчиков обслуживать.
>Потом еще надо будет все это на STM32 перенести: все-таки, STM8 — это игрушка
на stm8, да с 8к памяти можно многое сделать. Если не секрет, что у вас за задачи?
no subject
Date: 2015-06-01 11:14 am (UTC)If the data line (SDA) is stuck LOW, the master should send nine clock pulses. The device that held the bus LOW should release it sometime within those nine clocks. If not, then use the HW reset or cycle power to clear the bus.