LINUX.ORG.RU

STM32 F1 CMSIS I2C

 


0

1

Приветствую! Может кто-то имеет опыт работы с I2C на F1 (103C8Tx) или у кого есть рабочий пример правильной настройки этой штуки. Второй день уже сношаюсь. Все что я находил, либо вообще не взлетает, либо работает по Errata через зад. Конкретно у меня, не проходит повторный сигнал START:

I2C1->CR1 |= I2C_CR1_START;

while (!READ_BIT(I2C1->SR1, I2C_SR1_SB)){}; // <-- висит тут

Вроде как пишут дергать SCL и SDA руками, но это прям костыль какой-то, может есть лучшее решение?


Ответ на: комментарий от aiqu6Ait

Второй раз адрес устройства в шине появляется?

До установки адреса дело не доходит. Точней как, 1й вызов стартует, устанавливает адрес, читает и шлет СТОП. Тут все хорошо. А вот последующий старт уже не проходит и зависает.

ez7
() автор топика
Ответ на: комментарий от ez7

а на шине второй раз старт появляется? Устройство может не ответить ASK или контроллер может не отправить start, у тебя какой случай?

aiqu6Ait ★★★★
()

работает по Errata через зад

В общем (не применительно к вопросу) не хочешь иметь дело с такими ситуациями - работай через HAL - там как правило errata учтены.

aiqu6Ait ★★★★
()
Ответ на: комментарий от aiqu6Ait

Купи хотя-бы логический анализатор. Сэкономишь кучу времени.

Пока только в планах. Если есть какие-то рекомендации по выбору конкретной модели - пиши, охотно почитаю.

ez7
() автор топика
Ответ на: комментарий от Harald

На какой-то платке с али на 103-м, подключение осциллографа решало вопрос, соответственно был повешен 51pF на sda и оно заработало (подтяжка была 4.7к) .

anonymous
()
Ответ на: комментарий от aiqu6Ait

а на шине второй раз старт появляется? Устройство может не ответить ASK или контроллер может не отправить start, у тебя какой случай?

Не могу сказать точно, но скорей всего не может отправить старт.

В общем (не применительно к вопросу) не хочешь иметь дело с такими ситуациями - работай через HAL - там как правило errata учтены.

Я смотрел исходники SPL и HAL, но не увидел там ничего что бы было похоже на решение проблем, описанных в errata. (Они вообще то могли бы быть в обработчиках событий?)

А у тебя какие задачи?

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

ez7
() автор топика
Ответ на: комментарий от ez7

(Они вообще то могли бы быть в обработчиках событий?)

э… а как у тебя интерфейсы инициализированы?

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

Посмотри статью https://habr.com/ru/post/445024/

aiqu6Ait ★★★★
()
Ответ на: комментарий от anonymous

Подтяжка вроде бы на модуле есть (MPU6050), но спс, надо будет уточнить.

ez7
() автор топика
Ответ на: комментарий от aiqu6Ait

э… а как у тебя интерфейсы инициализированы?

Руками.

   RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;
   RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
   RCC->APB2ENR |= RCC_APB2ENR_AFIOEN;

   GPIOB->CRL |= 
       GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | 
       GPIO_CRL_CNF6 | GPIO_CRL_CNF7;

   I2C1->CR1 |= I2C_CR1_PE;

//Грабли из Errata//
   GPIOB->CRL &= ~(
       GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | 
       GPIO_CRL_CNF6 | GPIO_CRL_CNF7);

   GPIOB->CRL |= 
       GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1 | 
       GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;

   I2C1->CR1 &= ~I2C_CR1_PE;
   GPIOB->ODR |= GPIO_ODR_ODR6 | GPIO_ODR_ODR7;
   while(!(GPIOB->IDR &(GPIO_IDR_IDR6 | GPIO_IDR_IDR7)));


   GPIOB->ODR &= ~(GPIO_ODR_ODR6);
   while(GPIOB->IDR & GPIO_IDR_IDR6);
   GPIOB->ODR &= ~(GPIO_ODR_ODR7);
   while(GPIOB->IDR & GPIO_IDR_IDR7 );

   GPIOB->ODR |= GPIO_ODR_ODR6;
   while(!(GPIOB->IDR & GPIO_IDR_IDR6));

   GPIOB->ODR |= GPIO_ODR_ODR7;
   while(!(GPIOB->IDR & GPIO_IDR_IDR7));

   GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7);
   GPIOB->CRL |= GPIO_CRL_MODE6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7;


   I2C1->CR1 |= I2C_CR1_SWRST;
   I2C1->CR1 &= ~I2C_CR1_SWRST;
   I2C1->CR2 &= ~I2C_CR2_FREQ;

   I2C1->CR2 |= 8;
   I2C1->CCR &= ~I2C_CCR_CCR;
   I2C1->CCR = 40;
   I2C1->TRISE = 9;

   I2C1->CR1 |= I2C_CR1_ACK;
   I2C1->CR1 |= I2C_CR1_PE;

Это вариант более менее живой. Те которые без передергивания ног вообще даже до установки адреса не доходят.

ez7
() автор топика
Ответ на: комментарий от ez7

Если есть какие-то рекомендации по выбору конкретной модели - пиши, охотно почитаю.

Наверное стоит ограничиться теми что на CY7C68013A. По минимуму хватит https://aliexpress.ru/item/976713163.html Есть модели чуть дороже, в корпусах. Пользоваться просто, достаточно воткнуть в USB и запустить pulseview, который есть в репозиториях многих дистрибутивов. Прошивать ничего не требуется.

anonymous
()
Ответ на: комментарий от ez7

Да. Пока учишься - не перешивай. Втянешься - напаяй память и перешей устройство. Анализатора хватит на большую часть низкоскоростных интерфейсов.

aiqu6Ait ★★★★
()
Ответ на: комментарий от anonymous

Наверно это сильно любительский) По крайней мере я планировал уложиться в 2-4 тыщи. Но все равно спасибо)

ez7
() автор топика
Ответ на: комментарий от aiqu6Ait

Анализатора хватит на большую часть низкоскоростных интерфейсов.

Ок. Буду иметь в виду.

ez7
() автор топика
Ответ на: комментарий от ez7

Ну, для I2C и такого хватит. Но это не только логический анализатор, это еще и сама микросхема CY7C68013A, на которой много чего можно сделать.

anonymous
()

[url=https://github.com/eddyem/stm32samples/tree/master/F1-nolib/I2Cscan]На тебе[/url], работает.

Но да: на F0 I2C значительно приятней, чем на этой отрыжке!

anonymous
()
Ответ на: комментарий от anonymous

Ссылка

Какой-то долбоеб сделал по умолчанию МаркДаун! Пиздец, товарищи!

anonymous
()
Ответ на: комментарий от ez7

А в чем проблема купить самый дешевый осциллограф? Обойдешься в полкилобакса. Раз уж у тебя микроконтроллеры — хобби, и работа твоя с этим не связана, то уж раскошеливайся на свое хобби… А я просто с работы осцилл таскаю туда-сюда.

anonymous
()
Ответ на: комментарий от anonymous

Так я на большее не претендую (% и с интересом посмотрю, как на PIC32MZ рукастые true будут неделю вручную GPIO настраивать.

Если ТС-у интересно, пусть конечно с регистрами балуется. Завтра может гляну на трезвую, что там он забыл. А если нужен результат - можно наклацать проект в кубе и закинуть туда свой функционал.

aiqu6Ait ★★★★
()
Последнее исправление: aiqu6Ait (всего исправлений: 1)
Ответ на: комментарий от aiqu6Ait

Ты для начала сравни объем и производительность USB-CDC на калокубе и по-человечески. Калокубом ты от силы мегабит выжмешь!!! Да еще и хеллоуворлд займет 12км в обмен на 2-3кб того же CDC по-человечески.

anonymous
()
Ответ на: комментарий от anonymous

Оно реально столько тянет. 8051 тут не при чем, он только для вспомогательных задач используется. Основное там это программируемый автомат, который может данные пихать в FIFO или наоборот выпихивать из него. Например вот такая камера https://www.qhyccd.com/qhy5l-ii-planetaryguiding-camera/ сделана на этой микросхеме, там кроме нее, КМОП матрицы и питания ничего нет. А 8051 там только для настройки этого самого автомата и для управления матрицей по I2C.

anonymous
()
Ответ на: комментарий от anonymous

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

anonymous
()

Никак 103 не закопают. Чтоб там i2c заработал нужна куча костылей. Если 103 используется только потому что он стоит на тн bluepill — легко меняется на что-то поинтереснее. У меня на одном f072, на другом l051.

А осциллограф настоятельно рекомендую. Поможет вовремя заметить кривую stm'ку (вот у меня последний раз порты были полугорелые у китайских мк с распайки), собственный косяк, ещё что-нибудь.

Slavik763
()
Ответ на: комментарий от Slavik763

Если 103 используется только потому что он стоит на тн bluepill — легко меняется на что-то поинтереснее.

Да, пока только из-за блюпила его использую. Так-то 103 меня не особо интересует. Просто он под рукой. Хотел на нем поэкспериментировать да набросать основную логику для прошивки. Потом перенести уже на какой нибудь f3/f4, но эта ситуация с i2c показала, что у ST не только с софтом бывают проблемы. Где-то читал, что этот косяк с i2c встречается не только на 10х, но и на 40х. Кажись перед покупкой мк придется еще и читать на него errata.

А осциллограф настоятельно рекомендую.

Походу да, без спец аппаратуры подобные ситуации не решаются.

ez7
() автор топика
Ответ на: комментарий от aiqu6Ait

привет... помоги советом. делаю звонок на дверь. нужно чтобы если кто-то надавил кнопку доконца, то звучало это https://www.youtube.com/watch?v=g4x-l5-iVN8 и вот будет переменный резистор и кнопка с возвратной пружной нажатие на котрую будет вращать переменный резистор. буду использовать stm32f103c8T. видимо придется задействовать АЦП. чтобы измерять вольты. на резистор подам 3 вольта. при нажатии кнопки она повернет перменный резистор на определенный угол при котором он выдаст 1 вольт. переменный резистор будет соеденен с ногой PA1. вот не понятно откуда теперь можно будет получить данные от АЦП? где они будут хранится ?

anonymous
()
Ответ на: комментарий от anonymous

Данные будут в регистре данных АЦП 1 или АЦП 2, считать их можно по-разному - напрямую, по прерыванию, используя DMA, в зависимости от требований. Если дополнительных мер не принимать, то текущий отсчет будет храниться в регистре данных АЦП и каждый новый отсчет затирает предыдущий.

aiqu6Ait ★★★★
()
Ответ на: комментарий от anonymous

976713163.html

не рекомендую, лучше классический клон saleae.

izzholtik ★★★
()
Ответ на: комментарий от anonymous

нужно чтобы если кто-то надавил кнопку доконца

Скорее всего существуют кнопки двойного действия, которые размыкают одну цепь в начале нажатия и замыкают другую в конце. Возможно они называются не кнопками, а как-то иначе.

anonymous
()
Ответ на: комментарий от ez7

Клон saleae logic 8 не может столько стоить, потому что там внутри, если я не ошибаюсь, имеется как минимум FPGA XC6LX16. Могу ошибаться, но вероятно за такие деньги будет тот же CY7C68013A, только либо будет стоять буфер по входу, либо не будет. И не факт что с буфером лучше, тем более без него можно и на выход использовать, а не только на вход.

anonymous
()
Ответ на: комментарий от anonymous

Клон saleae logic 8 не может столько стоить

Да, это понятно. Просто гугл на запрос «saleae logic» выдает пачку китайских поделок с али. Думал имелась в виду одна из них.

но вероятно за такие деньги будет тот же CY7C68013A

Скорей всего. Некоторые продаваны даже не указывают это в описании товара.

ez7
() автор топика
Ответ на: комментарий от ez7

Если собрано без косяков — норм творение. Ставишь sigrok и вперёд.

anonymous
()
Ответ на: комментарий от anonymous

Они конечно есть, но во-первых, их еще надо найти, а во-вторых надо отвечать на вопрос.

aiqu6Ait ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.