Как установить тактовую скорость I2C на STM32F103C8T6 ?

Charlez64
Солнце 06 марта 2016 г. 18:03
Сначала я должен сказать, что я новичок в программах MCU (выходя из мира Arduino).

Я использую китайскую плату STM32 для управления PCF8574 (8 -битный порт Expander) и PCA9685 (Driver 16x 12Bits Pwm) над i2c.

Это работает, но я не понимаю, почему скорость I2C работает на странной 70 кГц (проверяется на прицеле).
Я хотел бы изменить скорость I2C на стандартную скорость (100 кГц, в идеале при 400 кГц).

Я читаю о CCR & Триза и попыталась выяснить, как установить их в i2c.H Но я не преуспел, так как это немного за пределами моего нынешнего уровня знаний.
Кто -нибудь может помочь ?

Спасибо

ZMEMW16
Солнце 06 марта 2016 г., 19:49
Используйте Advanced Search с 'i2c Установить тактовую скорость'
или
Google I2C Установите сайт тактовой скорости:http: // www.STM32duino.компонент

Mrburnette
Солнце 06 марта 2016 г., 22:52
Charlez64 написал: <...>
Я использую китайскую плату STM32 для управления PCF8574 (8 -битный порт Expander) и PCA9685 (Driver 16x 12Bits Pwm) над i2c.

Это работает, но я не понимаю, почему скорость I2C работает на странной 70 кГц (проверяется на прицеле).
Я хотел бы изменить скорость I2C на стандартную скорость (100 кГц, в идеале при 400 кГц).

Fredbox
Пн, 07 марта 2016 г. 12:55 утра
Проволока пробита, так что скорость не точна. Преимущество заключается в том, что его можно использовать на нестандартных булавках.
Hardwire - это точная скорость, но необходимо использовать на булавках, которые посвящены i2c.

Видеть эта ветка. Способ использовать Hardwire и установить часы на 100 или 400 кГц там.

Charlez64
Вт, 08 марта 2016 г., 16:09
@Ray
Я повторно загрузил самый последний Master Zip (тот, который у меня был 2 месяца). Нет изменений.

@fredbox
Читая ветку, я понял, что использую программное обеспечение Bit-Bangeg i2c.

Ref: https: // github.com/rogerclarkmelbourne/ ... 4e7a0c6c0b

Таким образом, мой модуль - один из тех, кому требуется Soft_standard = 16 вместо 27, чтобы работать при 100 кГц,
И soft_fast = 0 достигает всего около 260 кГц вместо 400 кГц на моем модуле.

Хорошо, это хорошая вещь, теперь я понимаю, что.

Теперь, чтобы запустить на 400 кГц, мне нужно использовать аппаратное i2c.
Моя проблема заключается в том, что я не звоню прямо в библиотеку I2C, так как я использую эту библиотеку (они оба работали нормально, как на STM32):
http: // блог.Iharder.net/2014/08/08/msp4 ... -расширитель/ (для PCF8574)
и
https: // github.com/adafruit/adafruit-pw ... ER-библиотека (для PCA9685)

Поэтому я понимаю, что мне придется отредактировать эту библиотеку, чтобы они называли Adplaware I2C вместо библиотеки Software I2C (пожалуйста, вспомните, что я новичок).
Это нормально ?
Кто -нибудь может дать мне немного грубый инструкции, как это сделать ?.

Спасибо за вашу помощь.

Rogerclark
Вт, март, 08, 2016, 21:38
Re: Изменение библиотек

Это общая проблема. Значительное количество библиотек работает только с AVR и необходимо изменить для работы с STM32 (и не досками AVR в целом)

Это обсуждалось в различных других темах на форуме.

Но чтобы подняться до погони...

Скопируйте библиотеку в свою папку Sketch и измените включение на »./Libraryname/libraryname.ЧАС"

Затем отредактируйте сами файлы библиотеки и измените экземпляры Wire на Hardwire
(вам может потребоваться внести другие изменения, E.глин. Чтобы сделать глобальный экземпляр провода
Но изменения будут зависеть от библиотеки)

Я боюсь, что вам, вероятно, понадобится улучшить свои навыки программирования, если вы абсолютный новичок, потому что STM32 - это шаг вперед от основной функциональности AVR.

Racemaniac
Ср. 09 марта 2016 г., 7:08
Я в последнее время возился с I2C (и вчера пытался заставить его работать с DMA, но пока еще не повезло >_<).
Вы можете изменить библиотеки, чтобы получить разные скорости, но если вы читаете документы & Прочитайте библиотечный код того, как настраиваются регистры, вы можете просто изменить его в своем коде.
После инициализации устройства I2C через Hardwire вы можете манипулировать регистрами перед отправкой адреса для начала связи I2C.

Для манипулирования скоростью, я предполагаю, что вам придется поиграть с CCR (регистр управления часами) или, может быть, CR2 (Регистр управления 2).
Первый содержит значение для достижения правой частоты I2C по сравнению с другими настройками, второе содержит значение, которое указывает часы вашего микроконтроллера (теперь будет 100100, = 36 для платы, работающей на 72 МГц, если вы положите его на 18 Например, я ожидаю, что ваша частота i2c удвоится. Но если вы хотите замедлить его, то это не может быть сделано через это, так как 36 является наибольшим значением, разрешенным в этом регистре).
Прочитайте об этом в документации (стр. 787 для CCR) и в коде:
I2c1->регс->Ccr = <новое значение> (Хотя, будьте осторожны, вы измените только биты, которые вам нужно изменить, только более низкие 11 бит связаны с частотой
I2c1->регс->CR2 = <новое значение> (Хотя, будьте осторожны, вы измените только биты, необходимые для изменения, только более низкие 6 бит связаны с частотой

Rogerclark
Ср. 09 марта 2016 г., 20:42
Просто чтобы исправить мой пост о местных копиях библиотек в папке Sketch.

И Рэй, и я проверили это, и, к сожалению, библиотеки в подпапках (внутри папки эскиза) не работают :-(

Это ошибка в IDE, которая присутствовала в течение нескольких лет


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


Интересно, сколько людей на самом деле используют i2c на любых других булавках. Я не выполнил его на аппаратные штифты i2c.
Возможно, я должен изменить ветвь разработки, чтобы Wire использовал Hardwire???

Mrburnette
Чт 10 марта 2016 г. 1:39
Rogerclark написал: <...>
И Рэй, и я проверили это, и, к сожалению, библиотеки в подпапках (внутри папки эскиза) не работают :-(

Это ошибка в IDE, которая присутствовала в течение нескольких лет

Rogerclark
Чт 10 марта 2016 г. 1:51
Я согласен

Вероятно, тема для опроса

Charlez64
Пт 11 марта 2016 г. 1:56 утра
Спасибо вам всем за поддержку.

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

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

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

Пса
1) Если у кого -то есть быстрое решение в этом, кроме как на мягком i2c, не стесняйтесь публиковать, я всегда буду интересно.
2) Кроме того, текущая мягкая имплантация I2C кажется ограниченной около 260 кГц, любой план улучшения до 400 кГц ?

Rogerclark
Пт 11 марта 2016 г., 6:17
Я посмотрел на то, чтобы получить программное обеспечение i2c, чтобы идти быстрее.

Это определенно возможно. Ограничение скорости вызвано из -за накладных расходов на вызов в цифровой авторитет, а также вызов функций set_sda () и set_scl ()

Если вы хотите попробовать несколько быстрых уловок, вы можете изменить
void TwoWire::set_sda(bool state) {

USB-сериалы

Bluepill заперт?