I2C переполняет до 1 МГц

victor_pv
Пт 06 октября 2017 г. 18:43
Роджер и все остальные.
После некоторого обсуждения в другой ветке с RaceManiac я проверил разгоночное количество I2C1 до 1.3 МГц успешно.

Мне было интересно, будет ли это полезно добавить код в ядро, возможно, ограничено до 1 МГц.
Это не спецификации для порта F1 I2C. Официальные документы STM указывают до 400 кГц. Но они также указывают на то, что SPI1 должен работать не более чем на 18 МГц, и мы регулярно запускаем его на уровне 36 МГц и разрешены в ядре, причем большинство людей, вероятно, не знают, что 36 МГц не в состоянии.

Должен ли я отправить пиар для этого?

Rogerclark
Пт 06 октября 2017 г. 22:02
Я подумал, что был вызов API, который устанавливает скорость передачи данных (хотя моя память немного туманна, и я не могу легко проверить, так как сейчас не на своем главном компьютере)

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

Дэнниф
Пт 06 октября 2017 г. 11:36
Вы можете установить TheBi2c Clock Divider, как хотите. Ключевой вопрос: есть ли рабы I2C достаточно быстро, чтобы ответить на это.

Если вам нужна скорость, SPI лучше, я думаю.

Racemaniac
Сб, 07 октября 2017 г. 5:52 утра
[Дэнниф - Пт. 06 октября 2017 г. 11:36 вечера] - Вы можете установить TheBi2c Clock Divider, как хотите. Ключевой вопрос: есть ли рабы I2C достаточно быстро, чтобы ответить на это.
Очевидно, ответ да ^^
Виктор использовал его для памяти I2C, которая может справиться с этими скоростями, я использовал его для популярного ЦАП I2C, который может справиться с этими скоростями :).
Мне также было интересно, как сейчас установлена ​​скорость. В идеале это было бы что -то простое (перечисление, которое вы можете использовать для установления скорости, содержащих определенные часто используемые значения (100 кГц, 400 кГц, 800 кГц_оверов, 1mhz_overclock) или что -то в этом роде). не возиться с разделителями.

Пито
Сб, 07 октября 2017 г. 6:02
Есть такие рабов I2C, то есть ADS11XX - до 3.Часы 4 МГц (и есть и другие чипсы).
Они передают 100/400 кГц (стандартная/быстрая скорость) от init (), но высокоскоростной режим (до 3.4 МГц) необходимо активировать (команда, отправленная мастеру).
Кажется, вы должны быть в состоянии изменить часы на лету.
Википедия: . В 1992 году версия 1 добавила 400 кГц быстрого режима (FM) и 10-битный режим адресации для увеличения емкости до 1008 узлов. Это была первая стандартизированная версия.
. В 1998 году версия 2 добавила 3.Высокоскоростный режим 4 МГц (HS) с требованиями к снижению мощности для электрического напряжения и тока.
. В 2000 году версия 2.1 уточненная версия 2, без значительных функциональных изменений.
. В 2007 году версия 3 добавлена ​​1 МГц быстрого режима плюс (FM+) (с использованием драйверов 20 мА) и механизм идентификатора устройства.
. В 2012 году версия 4 добавила 5 МГц ультра-быстрый режим (UFM) для новых линий USDA (данные) и USCL (часы) с использованием логики нажима. Это всего лишь однонаправленный автобус.

victor_pv
Сб, 07 октября 2017 г. 14:50
Дэнниф Проблема в том, что реализация класса WIRE не позволяет вам пройти какую -либо произвольную скорость, а затем вычисляет правильные значения для настройки периферийных устройств I2C. Он ограничен 100 кГц и 400 кГц. Так что мое изменение было о добавлении возможности в классе для использования других скоростей, поэтому нормальный пользователь не должен идти и рассчитывать значения регистра и применять эти значения непосредственно к регистрам.
Вы можете посмотреть на код setClock (), чтобы увидеть, что я имею в виду.

victor_pv
Сб, 07 октября 2017 г. 14:53
[Racemaniac - Сб, 07 октября 2017 г. 5:52 утра] - Мне также было интересно, как сейчас установлена ​​скорость. В идеале это было бы что -то простое (перечисление, которое вы можете использовать для установления скорости, содержащих определенные часто используемые значения (100 кГц, 400 кГц, 800 кГц_оверов, 1mhz_overclock) или что -то в этом роде). не возиться с разделителями.
Класс провода использует setClock (), но наша реализация позволяет только 100 и 400 кГц. Затем SetClock вызывает функцию Libmaple, не могу вспомнить имя, и это не рассчитывает все правильные регистры для других, чем 100 и 400. Я добавил новую функцию в Libmaple, чтобы вычислить их для любой скорости разгона и модифицированный SetClock (), чтобы вызвать новую функцию, когда скорость превышает 400 кГц. Я мог бы интегрировать его в существующую функцию Libmaple, но сделал это отдельно только для тестирования.

Дэнниф
Сб, 07 октября 2017 г. 16:34
Проблема в том, что реализация класса проводов не позволяет вам пройти какую -либо произвольную скорость... Инициализируйте модуль I2C, а затем измените делитель часов, например:

void myi2c_init (int i2c_ps) {
I2c_init (); // инициализация акций I2C
I2c_ps = i2c_ps; // Установите разделитель часов i2c на основе параметра, передаваемого myi2c_init () - образно говоря
}
Таким образом, в будущем, вместо того, чтобы называть i2c_init () для сброса модуля, используйте myi2c_init ().

Rogerclark
Сб, 07 октября 2017 г., 21:14
Я думаю, мы должны добавить эту функцию..

Я почти уверен, что посмотрел на должный код, и он поддерживал другие скорости - хотя просто расширенный список настройки скорости.
(Я предположил, что, возможно, у архитектуры SAM было только ограниченное количество скоростей, на которых оборудование может работать, потому что вызов API принимает частоту, а код просто находит ближайший доступный FREQ, который поддерживает оборудование. Либо это, либо кто -то из Ардуино только что выбрал эти арбитатные шаги)

Дэнниф
Сб, 07 октября 2017 г. 9:41 вечера
это регистр CWGR, согласно таблицу данных.
Twi_cwgr используется только в главном режиме.
• CLDIV: часы с низким делителем
Низкий период SCL определяется следующим образом:
• CHDIV: часовой высокий разделитель
Высокий период SCL определяется следующим образом:
• CKDIV: часовой разделитель
CKDIV используется для увеличения как SCL, так и низких периодов
Формула также дана.

Вы также можете посмотреть, что устанавливает TMCK.

victor_pv
Солнце 8 октября 2017 г. 5:16 утра
Дэнниф извините за путаницу. Я знаю, как разгонять порт, я спрашивал, считает ли другие люди, что было бы полезно, если бы я отправил свое ядро ​​в качестве пиара, чтобы быть включенным в ядро.

victor_pv
Солнце 8 октября 2017 г. 5:28 утра
[Rogerclark - Сб, 07 октября 2017 г. 9:14 вечера] - Я думаю, мы должны добавить эту функцию..

Я почти уверен, что посмотрел на должный код, и он поддерживал другие скорости - хотя просто расширенный список настройки скорости.
(Я предположил, что, возможно, у архитектуры SAM было только ограниченное количество скоростей, на которых оборудование может работать, потому что вызов API принимает частоту, а код просто находит ближайший доступный FREQ, который поддерживает оборудование. Либо это, либо кто -то из Ардуино только что выбрал эти арбитатные шаги)
API ARDUINO документирует несколько других скоростей (1 МГц, 3.4 МГц), но упоминает, что пользователю нужно проверить, что поддерживается в его оборудовании.
Из моих испытаний с Фрама я смог вполне добраться до 1.3 МГц, и Рейнманьяк смог пройти такую ​​же скорость, прежде чем возникнуть.
Периферийное устройство может работать на разных скоростях с правильными настройками, но я понимаю, что стандартные скорости I2C - это лишь несколько.
Таким образом, мы можем взять оба пути, установить только стандартные скорости с перечислением (100 кГц, 400 кГц, 1 МГц) или просто разрешить любую скорость в пределах диапазона. Я написал свой код во второй форме, так как я хотел проверить, как быстро он может пойти в Beyong 400 кГц.
Для справки, выполняет любую скорость и просто вычисляет значения регистра, которые соответствуют лучшему, но навязывают ограничение:
https: // github.com/arduino/arduinocore- ... эн.CPP#L140
https: // github.com/arduino/arduinocore- ... Тви.C#L114

Стивестронг
Солнце 8 октября 2017 г. 8:43
Может быть, эти предопределенные значения имеют смысл: Arduino: 1.8.4 (Windows 10), Board: "Generic STM32F103C series, STM32F103C8 (20k RAM. 64k Flash), Serial, 72Mhz (Normal), Smallest (default)" C:\Users\Dave Morland\Downloads\STM32-O-Scope-master\STM32-O-Scope-master\STM32-O-Scope\STM32-O-Scope.ino: In function 'void showTime()': STM32-O-Scope:598: error: 'hour' was not declared in this scope if (hour(tt) < 10) { ^ STM32-O-Scope:601: error: 'hour' was not declared in this scope TFT.print(hour(tt)); ^ STM32-O-Scope:603: error: 'minute' was not declared in this scope if (minute(tt) < 10) { ^ STM32-O-Scope:606: error: 'minute' was not declared in this scope TFT.print(minute(tt)); ^ STM32-O-Scope:608: error: 'second' was not declared in this scope if (second(tt) < 10) { ^ STM32-O-Scope:611: error: 'second' was not declared in this scope TFT.print(second(tt)); ^ STM32-O-Scope:613: error: 'day' was not declared in this scope TFT.print(day(tt)); ^ STM32-O-Scope:615: error: 'month' was not declared in this scope TFT.print(month(tt)); ^ STM32-O-Scope:617: error: 'year' was not declared in this scope TFT.print(year(tt)); ^ C:\Users\Dave Morland\Downloads\STM32-O-Scope-master\STM32-O-Scope-master\STM32-O-Scope\STM32-O-Scope.ino: In function 'void setCurrentTime()': STM32-O-Scope:867: error: 'setTime' was not declared in this scope setTime(thisArg.toInt()); ^ STM32-O-Scope:868: error: 'now' was not declared in this scope time_t tt = now(); ^ C:\Users\Dave Morland\Downloads\STM32-O-Scope-master\STM32-O-Scope-master\STM32-O-Scope\STM32-O-Scope.ino: In function 'void serialCurrentTime()': STM32-O-Scope:875: error: 'hour' was not declared in this scope if (hour(tt) < 10) { ^ STM32-O-Scope:878: error: 'hour' was not declared in this scope serial_debug.print(hour(tt)); ^ STM32-O-Scope:880: error: 'minute' was not declared in this scope if (minute(tt) < 10) { ^ STM32-O-Scope:883: error: 'minute' was not declared in this scope serial_debug.print(minute(tt)); ^ STM32-O-Scope:885: error: 'second' was not declared in this scope if (second(tt) < 10) { ^ STM32-O-Scope:888: error: 'second' was not declared in this scope serial_debug.print(second(tt)); ^ STM32-O-Scope:890: error: 'day' was not declared in this scope serial_debug.print(day(tt)); ^ STM32-O-Scope:892: error: 'month' was not declared in this scope serial_debug.print(month(tt)); ^ STM32-O-Scope:894: error: 'year' was not declared in this scope serial_debug.print(year(tt)); ^ exit status 1 'hour' was not declared in this scope

Дэнниф
Солнце 8 октября 2017 г. 11:34
Установите частоту I2C на основе F_I2C, которая может быть сопоставлена ​​с любым номером, который желает пользователь, включая несколько предварительно определенных макросов, таких как F_I2C_100 кГц, F_I2C_400KHZ, ....

Лучший из обоих миров.