7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
||||||
1 | ||||||
I2C. Передача слова конфигурации ведомому. Разрыв мозга!30.01.2017, 11:50. Показов 4200. Ответов 34
Метки нет (Все метки)
Уважаемые господа! Требуется коллективное сознание для "осознания".. Есть, как оказалось проблема, решение которой я, пока что не нашёл, несмотря на многочасовые "упражнения" мозга.
Начну с начальных признаков этого безобразия: Здесь, на форуме, я как-то ещё осенью 2016г общался по поводу взаимодействия STM32 с датчиками температуры DS1621. Те проблемы с которыми я обращался были успешно решены и забыты. Была забыта и ещё одна, как на тот момент казалось "проблемка".. Но вот пришлось таки с этой "проблемкой" столкнуться вновь и понять, что это не случайность и частный случай, а закономерность, которая требует разрешения! Итак! Всё началось с конфигурации датчика DS1621. Работает он, как известно по I2C. Для того чтобы, например, инициировать однократное преобразование температуры и установить активный уровень выхода термостата "Hi", в регистр конфигурации датчика нужно записать 0x03.. Вот тут мне пришлось покорячиться. Это значение ни под каким соусом не записывалось в регистр как 0x03 bin=(00000011) и как следствие датчик не запускался на преобразование. Не знаю что на меня нашло.. но я почему-то интуитивно решил попробовать поставить в сташий бит слова "1", в результате получилось 0х83 bin=(10000011). Регистр записался, преобразование запустилось, всё заработало. В этом регистре управляющие биты только [1:0], поэтому установка старшего бита влияет только на корректность записи в регистр. Я имел разговор по этому поводу с участником форума Rius`ом и он мне тогда указал, что возможно некорректно работает процедура передачи байта ведомому. Я "списал" эту проблему на датчик и забыл о ней.. До начала работы уже с другим датчиком. BME280. Когда я дошёл до его конфигурирования и реального запуска измерений, то всплыла вот эта "забытая" проблема. Точно такая же история с конфигурацией!!! Для того, чтобы установить датчик в режим непрерывного измерения давления и температуры и выбрать оверсэмплинг указанных параметров х1 нужно записать в регистр ctrl_meas значение 0x27 bin=(00100111). До этого момента всё шло как по маслу. Калибровочные параметры прочитались как положено. История в этом посте: Работа с датчиком давления BME280. Обсуждение, обмен опытом Дошёл до получения некомпенсированных значений P; RH; T.. Хрена!! Молчит "как рыба об лёд"!!! Тупил весь вечер. Пока не вспомнил про вышеупомянутую проблему с "1" в старшем разряде. И вот, я выбираю слово конфигурации "оверсэмплинг температуры и давления х16, нормальный режим работы" значение этого слова 0xA7 bin=(10110111). Исключительный запуск, появляются измеренные значения!!!!! Опять эта злосчастная "1" в адресе 0x80 Значит проблема всё-таки не в датчиках! Что же это за "косяк" такой, хитрый?? Просмотрел в своём коде процедуру передачи байта ведомому. Вроде никакого "криминала" С этой процедурой прекрасно работает двухточечный термометр 2х DS1621. Но.. Адрес DS1621 0x90 bin=(10010000) (опять эта долбаная единица!) поэтому всё что касается адресации датчиков работает безукоризненно. А вот к конфигурации приходится добавлять эту недостающую "1", чтобы запустить измерения. Вот, собственно максимальное описание сути имеющейся проблемы. Прошу помощи!!! Может кто-либо сталкивался с такой фигнёй?? Помогите пофиксить!! Привожу код функции, отвечающей за передачу байта ведомому. Буду крайне благодарен за помощь в разрешении ситуации!!!! **** КОД:
I2C_Tmng - временные задержки на таймере в однопроходном режиме Ну и аргумент функции, естественно, передаваемый байт. Жду с нетерпением ответа(ов) знающих
0
|
30.01.2017, 11:50 | |
Ответы с готовыми решениями:
34
передача текста i2c Передача данных по i2c I2C slave: прием и передача Передача массива данных по i2c |
7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
|
10.02.2017, 19:42 [ТС] | 22 |
Ну хорошо, я на данный момент не совсем понимаю что вы до меня хотите донести, но если образно сказать, то как можно дать "домашнее задание ученику Васе" не обратившись к нему, не описав упражнения, которые нужно решить и не оговорив сроки выполнения этого задания, в конце диалога не сказав ему "Досвиданья, Вася" (стоп-условие)
0
|
10.02.2017, 19:45 | 23 |
Очень просто: записать задание в общем формате, понятном и Васе , и Маше, и Пете, и всем их десяти братьям и сёстрам. И пусть выполняют, как принято.
Добавлено через 1 минуту Это, конечно, не обязательно. Но после нескольких разных устройств может быть наконец надоест и тогда уже обобщите код.
0
|
7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
|
10.02.2017, 19:48 [ТС] | 24 |
Можно же сказать "Здравствуйте дети" (старт-условие) потом используя стандартные фразы русского языка назначить дежурных по классу, отправить "Петю" за водой для протирки доски, провести урок, обращаясь к разным детям и в конце урока сказать им "Урок окончен, все свободны" (стоп-условие).
Добавлено через 2 минуты Вот я только что об этом написал. Это мне понятно, но пока не нужно. На этом этапе. Я когда-нибудь стану "настоящим сталеваром" вот тогда и буду "варить высоколегированную сталь"
0
|
7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
|
10.02.2017, 19:58 [ТС] | 26 |
Кстати, я за сегодняшний день потрудился над тем, чтобы моя I2C библиотека окончательно стала набором стандартных процедур. И таки теперь она окончательно "вылизана как у кота..." А теперь подставляя в эти процедуры что передать, в какой последовательности принять, когда сказать "здравствуйте", когда "досвиданья" я могу хоть чёртом лысым с интерфейсом I2C управлять!
Добавлено через 3 минуты Да, да, совершенно согласен. И "сталеваром" я рано или поздно буду. И тогда...
0
|
7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
||||||
04.03.2017, 21:20 [ТС] | 27 | |||||
Может кому пригодятся мои скромные труды.. Вот окончательно "вылизанный" код библиотеки программной реализации I2C:
Кликните здесь для просмотра всего текста
Ну и попила ж она моей крови.. Но зато работает как часы! Абсолютно корректная работа с двумя BME280. В процессе отладки и оптимизации были выявлены и пофиксены некоторые "косячки" и неточности. Но всё позади!!! Фуфффф!!! Как-то вот так
1
|
Модератор
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
|
||||||
05.03.2017, 06:26 | 28 | |||||
ошибка, которая неизвестно когда выстрелит
правильно так
регистры BSRR/ BRR устанавливают/ сбрасывают биты тогда когда в определенных разрядах стоит 1, операция "ИЛИ" совершенно лишняя
0
|
7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
|
05.03.2017, 17:44 [ТС] | 29 |
Попробуем
Добавлено через 7 часов 19 минут ValeryS, Спасибо огромное за подсказку. Всё работает. И действительно, ведь GPIO_BSRR_BS6 и подобное имеет значение "True", а значит "1". Перепишу во всех своих проектах!
0
|
7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
|
07.03.2017, 20:03 [ТС] | 30 |
ValeryS, А вот возник вопрос, ну или ситуация.
При замене так как Вы мне посоветовали операции "ИЛИ" на знак равенства в атомарных операциях работа программы не нарушается. А вот если я заменяю, например: TIM3->CR1 |= TIM_CR1_CEN; // Разрешение счётчика на: TIM3->CR1 = TIM_CR1_CEN; // Разрешение счётчика То программа "заваливается".. Ведь логически, как я понимаю в случае с регистром таймера должно происходить то же что и с регистром атомарных операций? В соответствующем бите "поднимается" "1". Почему ж тогда атомарный регистр отрабатывает как надо, а аналогичная конструкция, в случае с таймером не проходит?? Или я "подтупливаю", по незнанию чего-либо, или ???
0
|
07.03.2017, 20:13 | 31 |
scan11, представьте что "атомарные" регистры аппаратно реализуют |= и &=~
Бездумно заменять |= на = в общем случае нельзя. BSRR/BRR были специально сделаны так, чтобы избежать этих лишних операций.
1
|
7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
|
07.03.2017, 21:28 [ТС] | 33 |
Rius, ValeryS, Значит, если я правильно понял из ваших ответов, в атомарных регистрах замена "|=" на"=" возможна по аппаратным причинам, а в остальных регистрах нет..
Так?
0
|
7 / 7 / 2
Регистрация: 08.09.2015
Сообщений: 111
|
|
07.03.2017, 21:35 [ТС] | 35 |
Rius, Усё понятно! Огромное спасибо за разъяснение. И действительно, вспоминаю, что в атомарных регистрах специально исключён механизм чтение-модификация-запись Сорри за лёгкий "тупнячок"
0
|
07.03.2017, 21:35 | |
07.03.2017, 21:35 | |
Помогаю со студенческими работами здесь
35
QLabel разрыв слова STM32 передача по I2C через DMA Как сделать принудительный перенос (разрыв) слова, если оно не умещается в блоке? QSerialPort передача настроек с файла конфигурации GPS модуль EB-500. Передача команды для конфигурации Конвертер i2c в usb - MIKROE-1421, FTDI click USB 2.0 to I2C для ПК К какой конфигурации придёт машина Тьюринга (исходя из начальной конфигурации) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |