eddy_em: (Костерок)
[personal profile] eddy_em
Наконец-то добил я аппаратный I2C на STM8: мало того, что из ERRATA несколько "патчей" внести пришлось, так еще и кое-какие косяки свои исправить. Еще я долго бился, пытаясь понять, почему у меня ожидание кое-каких флагов отваливается. Оказывается, sdcc до gcc еще расти и расти: если аргумент макроса не окружить скобками, то он превращается в пустоту...
Вот код на гитхабе, на сосфорже, соответственно, тоже зеркало лежит.

Т.к. поверенных барометров и термометров у меня при себе нет, протестировать качество показаний этого датчика не по чем.

Date: 2015-06-01 09:25 am (UTC)
From: [identity profile] zurabob.livejournal.com
У стм8 настолько обширная еррата, что проще, короче и нагляднее программная реализация. Кроме того, при сбое необходимо подавать 9 клоков для сброса внутренней логики слейвов, чего я не заметил у вас. Иначе возможен захват SDA слейвом и много радости.
Вообще аппаратная и2с в большинстве процов довольна мерзка, глючна и тяжела в обработке ошибок, поэтому всегда использую программную реализацию.

Date: 2015-06-01 10:07 am (UTC)
From: [identity profile] eddy-em.livejournal.com
> при сбое необходимо подавать 9 клоков для сброса внутренней логики слейвов
В даташите (да и в описании протокола) я такого не видел. В случае сбоя следующая посылка восстановит линию, посылая периодически STOP.
Да и просто посылка NACK+STOP полностью должна прервать события слейва.
В любом случае, это не страшно: ну, подумаешь, вернет отправка сообщения слейву NACK — в следующий раз повторит.

Я еще попробую эту реализацию с другими датчиками, если будут глюки — отпишусь. А программную надо еще будет сделать. Я все думаю, как: на основе таймера по аналогии с реализацией 1-wire (на одной ноге вешаются два канала compare/capture: один на передачу, другой на прием), или же по-авровски (через задницу, с ногодрыгом).

Потом еще надо будет все это на STM32 перенести: все-таки, STM8 — это игрушка. Единственный смысл под STM8 писать — это чтобы какой-нибудь датчик подвесить к "вольтметру" и получить новый прибор (термометр, барометр, гигрометр и т.п.). Правда, учитывая то, что готовые термометры/психрометр/гигрометры и т.п. стоят дешевле, чем получающийся монстр, то это просто игры "на будущее" — для пополнения базы сниппетов. Тяжко просто в сети найти вменяемые (с моей точки зрения) реализации кода под всякие разные датчики.
Edited Date: 2015-06-01 10:08 am (UTC)

Date: 2015-06-01 11:08 am (UTC)
From: [identity profile] zurabob.livejournal.com
>Да и просто посылка NACK+STOP полностью должна прервать события слейва.
На практике иногда это приводит к полному подвису и захвату линии слейвом.
Много ссылок, хороших и разных по software i2c reset. Например
http://www.analog.com/media/en/technical-documentation/application-notes/54305147357414AN686_0.pdf

Программную проще и универсальнее делать ногодрыгом, этож полностью синхронный интерфейс, в отличие от 1ware. Почему это через задницу совершенно непонятно. Да и 1wire неплохо реализуется на задержках с разрешением прерываний между битами. Всего 3 калиброванные задержки и в одном месте. Но это на сях уже не особо красиво, конечно, зависит от компилятора( хотя задержки можно и опросом таймера сделать) и требует 60мкс запрета прерываний.Зато легко позволяет много линий датчиков обслуживать.
>Потом еще надо будет все это на STM32 перенести: все-таки, STM8 — это игрушка
на stm8, да с 8к памяти можно многое сделать. Если не секрет, что у вас за задачи?

Date: 2015-06-01 11:14 am (UTC)
From: [identity profile] zurabob.livejournal.com
Не знаю прошел ли предыдущий ответ, что-то ругается на ссылки. Вдогонку к нему цитата из стандарта:
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.

October 2025

S M T W T F S
   1234
567 89 1011
121314 15161718
19202122232425
2627 28293031 

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 06:59 pm
Powered by Dreamwidth Studios