Наблюдения

Jan 19, 2014 15:25

Сейчас на всех вестибюлях станций метро вешают светодиодные часы-термометр. Какой-то гений на Ленинском проспекте повесил их прямо на решетку вентшахты, встроенной в вестибюль, в итоге вокруг мороз, а термометр весело сообщает о нуле градусов ( Read more... )

Микроконтроллеры, Город, Энергосистема, Электроника, Промзона

Leave a comment

executehv January 19 2014, 15:50:22 UTC
Бит 1 очищается сам(by hardware) по записи в регистр I2Cx_TXDR. Устанавливается, если необходимо записать новую порцию данных в регистр.
Он может быть установлен в единицу (для генерации сообщения TXIS) программой, но такая запись возможна, только если NOSTRETCH=1.
Сгенерируется прерывание, если установлен бит TXIE, и запрос DMA, если установлен TXDMAEN.
Бит 0 аналогичен (очищается сам(by hardware) по записи в регистр I2Cx_TXDR. Устанавливается, если необходимо записать новую порцию данных в регистр),
но запись в него единицы приведет к очистке регистра данных(ясно, что до их фактической передачи, вроде ж регистр чистится сам после отправки пачки данных, так?)

Reply

alex_avr2 January 19 2014, 15:53:43 UTC
>>но запись в него единицы приведет к очистке регистра данных

Это не единственная разница, судя по поведению. Я до сих пор не понимаю логику этих флагов, какой нужен для чего и в каких ситуациях.

Reply

executehv January 19 2014, 15:55:17 UTC
Ну на чтение у них поведение одинаково, а на запись уже разница большая)

Reply

alex_avr2 January 19 2014, 16:01:16 UTC
В том то и дело, что не одинаковое.

Ситуация - надо передать два байта по и2ц(после адреса). Инициализирую передачу, пишу в TXDR первый байт сразу.

Потом ловлю прерывание по флагу(одному из этих двух), которое говорит нам что байт передался и можно слать следующий. Пишу в TXDR второй байт, завершаю передачу, все отлично.

Веселуха начинается при попытке повторить тоже самое еще раз. В случае если использовался флаг TXIS - все ок, тот же алгоритм приводит к правильному результату. А вот если использовать TXE, то первый байт второй посылки будет не тот что мы запишем, а такой же, как второй байт первой посылки. Не знаю, баг это или фича, в ERRATA про это нет(хотя другие косяки с I2C там описаны). Ну и в любом случае описание кривое - можно было бы поподробнее расписать чем отличаются биты и когда что применять. Впрочем это типично для ST :)

Reply

executehv January 19 2014, 16:34:49 UTC
Ты сам должен очистить регистр перед передачей, если используешь флаг TXE. Вроде так.
А чтобы очистить его - делаем flush установкой TXE в 1.

Reply

alex_avr2 January 19 2014, 16:40:41 UTC
Ну видимо да, только вопрос зачем такое нагородили и почему подробно не расписали? :)

Reply


Leave a comment

Up