|
|
  |
I2C в STM32F37, ошибка в железе?, Попытка работы с M24M01 (EEPROM) через DMA. |
|
|
|
Oct 25 2013, 11:14
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934

|
Доброго времени суток всем. Есть отладочная плата STM32373C, пытаюсь организовать работу её контроллера с EEPROM. При работе с установленными на ней EEPROM-инами случились следующие проблемы:
1. При приёме NACK в режиме Master-Reader не взводится флаг этого самого NACK-а и, соответственно, не вызывается прерывание (прерывания разрешил, TC и TCR, например, взводятся). В режиме Master-Writer при появлении NACK-а на шине глохнут по меньшей мере прерывания I2C и USART (остальные проверять пока лень).
2. После корректной записи в EEPROM по заданному адресу пробую прочитать записанное с того же адреса: функции I2C_TransferHandling задаю канал I2C, адрес EEPROM на шине, количество байт к передаче (2 байта адреса, с которого будет производиться чтение), режим SoftEnd и Generate_Start_Write, после чего настраиваю DMA на передачу этих двух байт адреса чтения. На осциллографе виден сильно другой адрес, не тот, который задан в переменной. Причём, если производить чтение после сброса контроллера -- адрес отдаётся корректный. Первая же запись всё ломает.
Сталкивался ли кто с подобными проблемами, и есть ли решения? Если да -- поделитесь. Очень уж неохота программно реализовывать I2C.
|
|
|
|
|
Oct 28 2013, 05:26
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 8-01-07
Из: Томск
Пользователь №: 24 208

|
Библиотеку CPAL использовать не пробовали? Там есть режим для работы с внешней памятью, и поддержка ДМА. Нельзя сказать, что без проблем, но вроде, тьфу-тьфу-тьфу, оно работает.
|
|
|
|
|
Oct 28 2013, 09:23
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934

|
Цитата(bseyur @ Oct 28 2013, 09:26)  Библиотеку CPAL использовать не пробовали? Там есть режим для работы с внешней памятью, и поддержка ДМА. Нельзя сказать, что без проблем, но вроде, тьфу-тьфу-тьфу, оно работает. Пробовал -- оно вообще отказалось взлетать. Собственно, отчего я и полез вручную всё это раскручивать. А какие проблемы с CPAL-ом были?
|
|
|
|
|
Oct 28 2013, 10:39
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934

|
Цитата(demiurg_spb @ Oct 28 2013, 14:16)  Можно ссылку на неё? Например, только для F3xx отдельно искать надо.
|
|
|
|
|
Oct 28 2013, 12:34
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 16-08-13
Из: Ставрополь
Пользователь №: 77 934

|
Цитата(rudy_b @ Oct 28 2013, 16:28)  Нормально запустить их I2C (чтобы не взвисало ни в каких ситуациях, в том числе и при отсутствии ACK) удается только путем долгих проб и ошибок. И это без DMA. Что они накрутили там - не знаю и даже думать не хочу. Печально. Так хорошо всё в теории получалось с DMA, и так отвратно на практике. А вообще ST за такую реализацию I2C пинают? Хоть какие подвижки происходят?
|
|
|
|
|
Oct 28 2013, 13:08
|
Знающий
   
Группа: Свой
Сообщений: 888
Регистрация: 25-09-08
Из: Питер
Пользователь №: 40 458

|
Не знаю, но, похоже, что нет. Они непрерывно и со страшной скоростью клепают новые версии (предполагаю, что, практически, с теми же ошибками) - тут не до исправлений.
И вообще, на мой взгляд, STM32F - это какая-то помойка периферии. Какой-то ихний рационализатор решил все сделать по своему и, вместо стандартных отработанных схем интерфейсов, наклепал что-то свое, совершенно невразумительное. При переходе на STM идиотизм периферии просто поражает.
|
|
|
|
|
Oct 28 2013, 14:29
|
Участник

Группа: Участник
Сообщений: 65
Регистрация: 8-01-07
Из: Томск
Пользователь №: 24 208

|
Цитата(rudy_b @ Oct 28 2013, 19:28)  Не знаю как в stm32f3xx (если правильно указано), а в STM32F207 для I2C и в харде и в либах нарисована полная лажа, которая работает совершенно криво. Стандартные либы не работают вообще. Т.е. у них есть какие-то баги в харде (изматерился борясь с кривизной харда) и они попробовали скомпенсировать их софтом, но тоже неудачно. Нормально запустить их I2C (чтобы не взвисало ни в каких ситуациях, в том числе и при отсутствии ACK) удается только путем долгих проб и ошибок. Полностью согласен. Разбираться с периферией на STM32, если где-то что-то не работает, приходится довольно долго. I2C в особенности. Бывает, самая незначительная ошибка приводит к странному поведению девайса, и мозг сломаешь, пока найдешь истинную причину. Кривизна библиотек - это отдельная тема. Вот на днях бился с CPAL. Документация скудная, а в интернете информации по этой библиотеке минимум. Даже спросить-то не у кого... Связь постоянно рушилась после энного количества (порядка нескольких сотен) успешных транзакций. Контроллер то начинает отправлять в шину неверные данные, то "видит" NACK, которого на самом деле нет. На разбор полетов ушло несколько дней. Оказалось, CPAL при неясных обстоятельствах иногда(!) повреждает указатель pbBuffer, который хранится в статической структуре и указывает на массив с данными для отправки/приема. В результате весь контроллер начинал себя вести неадекватно, маскируя источник проблемы. Сейчас в программе перед началом каждой транзакции указатель pbBuffer принудительно устанавливается в требуемое значение - проблема ушла. Ссылку на сайт с библиотекой с ходу не нашел. Во вложении CPAL v2 для серии STM32F3XX.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|