Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F103CBT и I2C2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
rav38
Здравствуйте все!
Пытаюсь сделать опрос датчика по 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.

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

UPD. Глупость говорю, попутал со 105-м.
rav38
В общем проблему с интерфейсом так и не решил, но уперся в какие-то другие грабли, связанные с портом 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%.
Куда копать?
golf2109
Я бы прежде всего зашел бы в отладчик и посмотрел на каком этапе инициализации появляется генерация
Ruslan1
Цитата(rav38 @ Sep 4 2015, 11:43) *
Как вариант попробовать подключить библиотеку CPAL (http://www.st.com/web/en/catalog/tools/PF258336) или сделать программную шину, но все же хочу понять почему не могу запустить HAL.

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

А после этого у Вас будет время, чтобы осознать, что никто еще не сваял работающий аппаратный модуль I2C. В течении десятков лет Вы будете встречать каждый новый процессор с надеждой "ну, вот оно, наконец свершилось". Но после некоторого ожидания (а иногда и сразу) в Еррате к этому "подающему надежды" обязательно появляется раздел, посвященный некорректной работе I2C: то битики какие-нибудь не устанавливаются, то зависает при определенных условиях, то еще что-нибудь. И, матюгнувшись в очередной раз, приклеете к новому проекту свою софтовую I2C либу, которая была написана еще для процессоров, о которых сейчас только воспоминания остались.
Да-да.
esaulenka
Цитата(Ruslan1 @ Sep 15 2015, 08:32) *
Сделайте программную шину, чтобы работало.

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

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


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

Ну почему же? На AVR работает, на LPC работает, на ST'шках (с бааальшим бубном, правда) работает...
К ногодрыгу сложно привязать прерывания, например :-)
Genadi Zawidowski
Попробуйте проверить, не настроен ли (в глубинах HAL/SPL) таймер TIM2 на работу с этим выходом... Просто выключите его как периферийный блок. Будет ли "генерация" на выходе?
Ruslan1
Цитата(esaulenka @ Sep 15 2015, 10:38) *
Так не работает же у него! Генерация появляется сразу при настройке ноги на выход.

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


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

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

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

Угу. обязан быть ОК. Клок может быть захвачен внешним слейвом и принудительно утянут им в "0" на неопределенное время- может, оно и происходит. А данный меандр есть "битва выходов", если мастер клок пин не ОК и установлен в "1", а слейв утянул своим ОК в "0"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.