MPR121 I2C Touch -клавиатура с библиотекой проводов

Szilvasyz
Солнце 13 августа 2017 г. 11:08
Всем привет,

(Я здесь новый участник, так что извините, если моя проблема здесь не актуальна. Если так, пожалуйста, напишите мне, где обсудить мою проблему, спасибо.)

Последние два дня я попытался использовать сенсорную клавиатуру, собранную с помощью чипа MPR121 с моей общей платой STM32 (STM32F103C8T6) (STM32F103C8T6). Когда я увидел, что есть библиотека Adafruit для обработки этого оборудования, но Unforunatelly Собирает эту библиотеку в ошибке. Ошибка возникает из -за того, что в библиотеке проводов STM32 нет метода «EndTransmission (UINT8)».

Забота за это особое использование «endtransmission ()» в библиотеке Adafruit я обнаружил, что библиотека закрывает передачу так, как условие остановки не следует отправлять («EndTransmission (false)») в конце реестра адресации.

Дальнейшие исследования показали мне, что с помощью проволочной библиотеки STM32 я могу общаться с другими устройствами I2C (я пробовал PCF8574 и DS1621) без каких -либо проблем. Чтение таблицы данных MPR121 Я обнаружил, что существует специальный случай протокола связи, который, по -видимому, не может быть реализован с использованием библиотеки проводов STM32.

Чтение регистра из MPR121 требует связи следующим образом:
1. отправка начала условия
2. Отправка подчиненного адреса для режима записи
3. Чтение раба
4. Отправка адреса регистра
5. Чтение раба
6. Отправка повторного начального условия
7. Отправка подчиненного адреса для режима чтения
8. Чтение раба
9. чтение данных байт (зарегистрировать Cotent)
10. отправка мастера Нака
11. отправка условия остановки

Я не мог сделать последовательность выше, используя библиотеку проводов STM32. Наиболее важной точкой последовательности является шаг 6, посылая повторное условие начала; Если вы отправите условие остановки, за которым следует условие начала, вы бы не прочитали желаемые данные регистра, но всегда получили ноль на шаге 9.

Вчера вечером я написал немного разбивающего эскиза I2C Communication, который мог бы отправить повторное начало на шаге 6, и я мог правильно прочитать все регистры MPR121.

Может быть, есть метод для создания последовательности выше с помощью Wire LIB, но для меня это неизвестно. Если так, пожалуйста, напишите мне, как сделать!

На этом этапе - если я прав, и желаемая последовательность не может быть собрана с помощью STM32 Wire Lib - я не могу решить, что будет лучшим решением:
- Написание моего собственного битового кода для обработки этого HW?
- Модификация библиотеки проводов STM32 для себя, чтобы справиться?
- поставить запрос (где, как?) изменить библиотеку проводов, как указано выше?

Пожалуйста, помогите мне в решении. заранее спасибо.

С уважением,
Золтан

Rogerclark
Солнце 13 августа 2017 г. 11:23
В библиотеке под названием Softwire в библиотеке есть немного удаленной версии Wire Lib, называемой Softwire

Недавно мы переключились на использование Hardwire, но я не думаю, что все возможные случаи были проверены

Можете ли вы посмотреть в библиотеку проводов и посмотреть, какую функцию не хватает ?

Szilvasyz
Солнце 13 августа 2017 12:04
Привет, Роджер,

Я только что проверил на GitHub, в проволочной базе есть два типа функции EndTransmission (). Кажется, они обрабатывают условие остановки так же, как и версия AVR Wire Lib:
uint8 WireBase::endTransmission(bool stop) { uint8 retVal; if (tx_buf_overflow) { return EDATA; } retVal = process(stop);// Changed so that the return value from process is returned by this function see also the return line below tx_buf_idx = 0; tx_buf_overflow = false; return retVal;//SUCCESS; } uint8 WireBase::endTransmission(){ endTransmission(true); }

Rogerclark
Солнце 13 августа 2017 12:07
Я переключил провод по умолчанию на оборудование i2c около недели назад.

Дайте мне знать, работает ли новая версия для вас

Szilvasyz
Солнце 13 августа 2017 г. 20:38
Привет, Роджер,

Есть хорошие и плохие новости. Хорошая новость заключается в том, что LIB Adafruit MPR121 может быть просто скомпилирован с последней Wire Lib STM32. Нет отсутствующих вызовов функций или других ошибок компиляции. Плохое, что связь еще не работает, библиотека не может увидеть чип MPR121 на шине I2C.

Я провел дальнейшие исследования: попытался скомпилировать и запустить тест ADAfruit MPR121, мой тест Wire Lib MPR121 Регистрации и чтение и мой битовой битовой тест MPR121-чтение-чтение Scketches на трех разных досках: Arduino Pro Mini с Atmega328p (Powered от 3.3V), Arduino Due с Atsam3x8e и STM32 Blue Pill с STM32F103C8T6. Результаты удручают: только Pro Mini хорошо работал с библиотекой «фабрика», даже Dueed нарушил тесты. Кстати, все доски прошли битовые тесты.

Я прикрепил два маленьких наброска, чтобы представить проблему. Оба эскиза могут быть скомпилированы в три платы, упомянутые выше, и могут быть проверены с помощью реального устройства MPR121.

(Если у меня есть время, я проверю таблицу данных STM32, чтобы увидеть, может ли его периферийное устройство I2C справиться с этим специальным условием «Повторное начало».)

Любая дальнейшая идея?

Rogerclark
Солнце 13 августа 2017 г., 21:32
У вас есть логический анализатор, чтобы проверить скорость шины ?

Я думаю, что это должно быть установлено по умолчанию, которое составляет 100 кГц, но я не проверил это с помощью логического анализатора, так как все устройства i2c, которые я, кажется, с радостью работаю до 400K и выше 400K

Szilvasyz
Солнце 13 августа 2017 11:12
К сожалению, у меня нет логического анализатора. Я подумаю о том, чтобы что -то изобретать, чтобы обеспечить скорость автобуса. Но я боюсь, что это на самом деле не проблема.

Я взял еще одну попытку использовать библиотеку Softwire в моем «код Wire TES» с успехом! Затем я скопировал библиотеку Adafruit MPR121 и изменил ее, чтобы использовать Softwire вместо провода, в результате чего был трудолюбивый сенсорный тест на моей синей таблетке.

Но есть интересная вещь: просмотр исходных файлов библиотеки STM32 Wire (который на самом деле является Hardwire), я не могу найти ничего в коде передачи, что было бы заботится о параметре «остановки» эндрансмиссии (Bool). Я вижу, что EndTransmission () без параметров вызовов EndTransmission (bool) с «true», но в теле энд -трансмиссии (Bool) я ничего не видел в отношении данного параметра «остановки». Может я что -то пропустил.
В файлах Softwire я обнаружил, что кодовые снабжанные кодовые салоны. Что делает условие «повторное запуск» вместо «остановки» в конце передачи, если параметр «остановки» является ложным, кроме того, нет генерации «старта» в начале приемного цикла в этом случае.

Когда я заглянул в справочное руководство STM32 "RM0008" Я не могу уверен, что периферийное аппаратное обеспечение может генерировать «повторный запуск» в 7-битном режиме адресации. Я видел упоминание условия «повторного запуска» только в контакте 10-битного режима адресации.

Rogerclark
Пн 14 августа 2017 г. 12:27
@szilvasyz

Я забыл, кто представил обновленное аппаратное ядро, которое мы сейчас используем, но я знаю, что на форуме была ветка об этом, так что, возможно, вы могли бы отследить человека, который написал его, и спросить их об этом, так как у меня нет подробных Знание оборудования i2c на STM32.

Альтернатива - попытаться использовать собственное официальное ядро ​​Arduino для STM для Github F103.com/stm32duino, и посмотрите, поддерживает ли это повторное начало

https: // github.com/stm32duino/arduino_c ... E/Провод.CPP
Что делает звонки в HAL STM

Но можно посмотреть в коде HAL, чтобы увидеть, что оборудование регистрирует его взаимодействие, и, возможно, увидеть, как добавить эту функцию в Libmaple, если она существует

Rogerclark
Пн 14 августа 2017 г. 12:39
КСТАТИ.

Я могу рекомендовать купить дешевый 8 -канальный логический анализатор

На YouTube есть отличное видео https: // www.YouTube.com/watch?v = dobu-b0_l1i

Вы можете получить что -то за 10 долларов

эн.глин. Поиск "CY7C68013A Logic Analyzer"

https: // www.eBay.com/sch/i.HTML?_odkw = c ... ведущий&_SACAT = 0

Или практически по той же цене вы можете получить один в коробке с несколькими кабелями

Поиск на «USB 24mhz 8CH Logic Analyzer»

эн.глин.

https: // www.eBay.com/sch/i.HTML?_odkw = l ... ведущий&_SACAT = 0

Они также кажутся совместимыми со старым программным обеспечением Saleae PC "Logic" или могут использоваться с Sigrok Pulseview с открытым исходным кодом

Szilvasyz
Пн 14 августа 2017 г. 8:34
@Роджер,

Я посмотрел на код HAL-Halling Wire Lib, который вы предложили, но я не вижу никаких следов использования параметра SendStop (даже это отмечено AZ «неиспользованным»):
uint8_t TwoWire::endTransmission(uint8_t sendStop) { UNUSED(sendStop); int8_t ret = 4; if (master == true) { // transmit buffer (blocking) switch(i2c_master_write(&_i2c, txAddress, txBuffer, txBufferLength)) {

Rogerclark
Пн 14 августа 2017 г. 10:24
Если у вас есть учетная запись GitHub, я бы поднял проблему для этого на учетной записи STM32Duino GitHub, поскольку FPSTM довольно активен в этих вещах, и, когда он работает на STM, иногда он может получить поддержку, когда что -то не хватает в HAL

Szilvasyz
Ср 16 августа 2017 г., 21:42
Привет, Роджер,

Извините за поздний ответ, я только что закончил тестовый код для генерации «повторного запуска» с периферийным устройством I2C. Как видно, аппаратное обеспечение может сделать это, только библиотеки I2C не осознают «беспроводную» передачу. Я атаковал эскиз, над которым я работал, чтобы продемонстрировать вещи. Хотя пример кода не заботится о каких -либо ошибках во время связи, он работает на моем столе. Я могу правильно прочитать все регистры MPR121.

Тем временем я создал бесплатную учетную запись GitHub (Szilvasyz), потому что у меня не было ни одного.

Как вы думаете, есть ли шанс поместить обработку этого случая «беспрепятственной передачи» в главный проводной кодекс LIB?

С уважением,
Золтан

Rogerclark
Ср 16 августа 2017 г. 22:29
Я не так много знаю о I2C, но я рад изменить ядро, если оно не ломает вещи для других пользователей.

Я также рад добавить новые функции API, если это необходимо, чтобы включить этот режим

Pareidolialjebus
Сб 27 октября 2018 г. 13:18
[Rogerclark - Ср 16 августа 2017 г. 22:29] - Я не так много знаю о I2C, но я рад изменить ядро, если оно не ломает вещи для других пользователей.

Я также рад добавить новые функции API, если это необходимо, чтобы включить этот режим
Вы получили дальше с этим Роджером? Просто интересно - купил дешевую доску MPR121 из Китая для моего проекта MIDI Sequencer.
Не беспокойтесь, если нет, это может скрываться в моей олово : D

(Надеюсь, никто не возражает за то, чтобы меня пересекала эту ветку, он просто казался настолько привязанным к ней, не казалось разумным, чтобы начать новый).

Jbforrer
Чт 31 января 2019 г. 6:26 утра
Привет,

Теперь есть несколько периферийных устройств I2C, нуждающихся в опции I2C RepeatStart.

Я пытался получить датчик VEML6072, работающий с Bluepill, и столкнуться с той же проблемой.
Это отлично работает с Arduino Uno, где «EndTransmission (false)» работает, пропуская состояние i2c_stop.

Интересно, удастся ли кому -то использовать/изменить библиотеку проводов для реализации RepeatStart?

Большое спасибо.

Jbforrer
Чт 31 января 2019 г., 20:15
К вашему сведению,
Я обнаружил, что «Softwire» решил проблему. Эта библиотека включает в себя поддержку RepeatStart.

Пожалуйста, смотрите мой пример для взаимодействия ультрафиолетового датчика Velm6075 с чертежкой.

Спасибо.