реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F103CBT и I2C2, нет генерации старта
rav38
сообщение Sep 4 2015, 08:43
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 12-06-12
Из: Москва
Пользователь №: 72 275



Здравствуйте все!
Пытаюсь сделать опрос датчика по I2C2, используя HAL библиотеки stm32cubef1.
При попытке что либо сделать на шине (запись, чтение) получаю ошибку выполнения ф-ции и картинку на линии SDA (в прищепке).
Под отладчиком по шагам запускаю ф-цию HAL_I2C_IsDeviceReady. Вся работа заканчивается моментом генерации стартового бита.
Код
      /* Generate Start */
      SET_BIT(hi2c->Instance->CR1, I2C_CR1_START);


После выполнения этой строчки на SDA появляется шум.

Инициализация I2C2(взял из примеров):
CODE
void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c)
{
GPIO_InitTypeDef GPIO_InitStruct;

GPIO_InitStruct.Pin = GPIO_AMS_SCL_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
HAL_GPIO_Init(GPIO_AMS_SCL_PORT, &GPIO_InitStruct);

GPIO_InitStruct.Pin = GPIO_AMS_SDA_PIN;
HAL_GPIO_Init(GPIO_AMS_SDA_PORT, &GPIO_InitStruct);

HAL_NVIC_ClearPendingIRQ ( AMS_I2C_ER_IRQ );
HAL_NVIC_SetPriority ( AMS_I2C_ER_IRQ, 1, 0 );
HAL_NVIC_EnableIRQ ( AMS_I2C_ER_IRQ );

HAL_NVIC_ClearPendingIRQ ( AMS_I2C_EV_IRQ );
HAL_NVIC_SetPriority ( AMS_I2C_EV_IRQ, 2, 0 );
HAL_NVIC_EnableIRQ ( AMS_I2C_EV_IRQ );

AMS_I2C_CLK_ENABLE();
};

void vAMS_I2C_Init(void)
{
AMS_I2CHandle.Instance = AMS_I2C;
AMS_I2CHandle.Init.ClockSpeed = I2C_STANDARD_MODE_MAX_CLK;
AMS_I2CHandle.Init.DutyCycle = I2C_DUTYCYCLE_2;
AMS_I2CHandle.Init.OwnAddress1 = AMS_I2C_ADDR;
AMS_I2CHandle.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
AMS_I2CHandle.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
AMS_I2CHandle.Init.OwnAddress2 = 0xFF;
AMS_I2CHandle.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
AMS_I2CHandle.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if(HAL_I2C_Init(&AMS_I2CHandle) != HAL_OK)
{
vAMS_Error_Handler();
}
}


Тактирование GPIO тоже включено. Подтяжки стоят.

На форуме упоминались проблемы именно со вторым модулем I2C, но скорее косячу сам. Где-то что-то не то настроил по ощущениям, а что именно понять не могу. Раньше аппартным модулем I2C не пользовался.
Как вариант попробовать подключить библиотеку CPAL (http://www.st.com/web/en/catalog/tools/PF258336) или сделать программную шину, но все же хочу понять почему не могу запустить HAL.

В общем прошу помощи.

Сообщение отредактировал rav38 - Sep 4 2015, 08:46
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Sep 4 2015, 10:17
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Почему-то на осциллографе отчётливо видны 25 МГц, а ноги второго I2C перекрываются с эзернетом.
Этот чудо-HAL случайно тактирование на модуль MAC не включил? :-)

UPD. Глупость говорю, попутал со 105-м.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
rav38
сообщение Sep 14 2015, 10:25
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 12-06-12
Из: Москва
Пользователь №: 72 275



В общем проблему с интерфейсом так и не решил, но уперся в какие-то другие грабли, связанные с портом PB10 (аппаратный I2C2).
Написал программную реализацию I2C.
На плате две ведомых микросхемы, каждая на своем интерфейсе. I2C1 аппаратный запускать даже не пробовал, программная реализация заработала сразу же.
Начал пробовать опрашивать микросхему на PB10.
При инициализации GPIO PB10 c него начинает лезть 26МГц (картинка в первом посте темы). Перефирия не инициализирована, ремап не включен. Параллельно работает светодиодная моргалка и опрашивается первый пограммный порт I2C, все это крутится на FreeRTOS.
Если PB10 настроить на вход - генерации нет. Любой вариант выхода - генерация есть. Частотат появляется после выполнения кода
Код
  GPIO_InitStruct.Pin   =       GPIO_PIN_10;
  GPIO_InitStruct.Mode  =       GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull  =       GPIO_PULLUP;
  GPIO_InitStruct.Speed =       GPIO_SPEED_HIGH;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);


На любом другом порте проблема не наблюдается. Платы собраны в 2 экземплярах. Повторяемость 100%.
Куда копать?

Сообщение отредактировал rav38 - Sep 14 2015, 10:29
Go to the top of the page
 
+Quote Post
golf2109
сообщение Sep 15 2015, 02:07
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 66
Регистрация: 15-04-10
Из: Kiev
Пользователь №: 56 654



Я бы прежде всего зашел бы в отладчик и посмотрел на каком этапе инициализации появляется генерация
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 15 2015, 05:32
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(rav38 @ Sep 4 2015, 11:43) *
Как вариант попробовать подключить библиотеку CPAL (http://www.st.com/web/en/catalog/tools/PF258336) или сделать программную шину, но все же хочу понять почему не могу запустить HAL.

Сделайте программную шину, чтобы работало.

А после этого у Вас будет время, чтобы осознать, что никто еще не сваял работающий аппаратный модуль I2C. В течении десятков лет Вы будете встречать каждый новый процессор с надеждой "ну, вот оно, наконец свершилось". Но после некоторого ожидания (а иногда и сразу) в Еррате к этому "подающему надежды" обязательно появляется раздел, посвященный некорректной работе I2C: то битики какие-нибудь не устанавливаются, то зависает при определенных условиях, то еще что-нибудь. И, матюгнувшись в очередной раз, приклеете к новому проекту свою софтовую I2C либу, которая была написана еще для процессоров, о которых сейчас только воспоминания остались.
Да-да.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Sep 15 2015, 07:38
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Ruslan1 @ Sep 15 2015, 08:32) *
Сделайте программную шину, чтобы работало.

Так не работает же у него! Генерация появляется сразу при настройке ноги на выход.
Можно только посоветовать взять большой ножик и резать дорожки на плате, чтоб хоть что-то понять...

Да, rav38, а у Вас при настройке ноги как вход уровень высокий?
И push-pull ногу настраивать не надо, надо открытый коллектор делать (STM'ка позволяет).


Цитата(Ruslan1 @ Sep 15 2015, 08:32) *
А после этого у Вас будет время, чтобы осознать, что никто еще не сваял работающий аппаратный модуль I2C.

Ну почему же? На AVR работает, на LPC работает, на ST'шках (с бааальшим бубном, правда) работает...
К ногодрыгу сложно привязать прерывания, например :-)


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Sep 15 2015, 08:36
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Попробуйте проверить, не настроен ли (в глубинах HAL/SPL) таймер TIM2 на работу с этим выходом... Просто выключите его как периферийный блок. Будет ли "генерация" на выходе?

Сообщение отредактировал Genadi Zawidowski - Sep 15 2015, 08:39
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 15 2015, 12:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(esaulenka @ Sep 15 2015, 10:38) *
Так не работает же у него! Генерация появляется сразу при настройке ноги на выход.

Я под "сделайте программную шину" имел в виду софтовое исполнение ручками, то есть "выпиливание" состояний на выводах МК программой, без привлечения аппаратных ресурсов I2C модуля.


Цитата(esaulenka @ Sep 15 2015, 10:38) *
Ну почему же? На AVR работает, на LPC работает, на ST'шках (с бааальшим бубном, правда) работает...

Ну, значит, мне просто еще не повезло в этой жизни. sm.gif
А бубен это да, вещь для пользователей аппаратного I2C нужная.
Go to the top of the page
 
+Quote Post
esaulenka
сообщение Sep 15 2015, 13:01
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Цитата(Ruslan1 @ Sep 15 2015, 15:54) *
Я под "сделайте программную шину" имел в виду софтовое исполнение ручками, то есть "выпиливание" состояний на выводах МК программой, без привлечения аппаратных ресурсов I2C модуля.

Я понимаю. Но во вчерашнем сообщении rav38 есть код. Там переключается нога на GPIO, обычный push-pull выход. И якобы сразу начинается генерация.


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Obam
сообщение Sep 15 2015, 13:18
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



"…Там переключается нога на GPIO, обычный push-pull выход…"
А должен быть ОК (ОС)… Так ведь?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Sep 15 2015, 13:38
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(Obam @ Sep 15 2015, 16:18) *
"…Там переключается нога на GPIO, обычный push-pull выход…"
А должен быть ОК (ОС)… Так ведь?

Угу. обязан быть ОК. Клок может быть захвачен внешним слейвом и принудительно утянут им в "0" на неопределенное время- может, оно и происходит. А данный меандр есть "битва выходов", если мастер клок пин не ОК и установлен в "1", а слейв утянул своим ОК в "0"
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 04:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01439 секунд с 7
ELECTRONIX ©2004-2016