|
|
  |
STM32F103CBT и I2C2, нет генерации старта |
|
|
|
Sep 4 2015, 08:43
|
Участник

Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Sep 14 2015, 10:25
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Sep 15 2015, 02:07
|
Участник

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

|
Я бы прежде всего зашел бы в отладчик и посмотрел на каком этапе инициализации появляется генерация
|
|
|
|
|
Sep 15 2015, 05:32
|
Гуру
     
Группа: Свой
Сообщений: 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 либу, которая была написана еще для процессоров, о которых сейчас только воспоминания остались. Да-да.
|
|
|
|
|
Sep 15 2015, 07:38
|

Профессионал
    
Группа: Свой
Сообщений: 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'шках (с бааальшим бубном, правда) работает... К ногодрыгу сложно привязать прерывания, например :-)
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
Sep 15 2015, 12:54
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(esaulenka @ Sep 15 2015, 10:38)  Так не работает же у него! Генерация появляется сразу при настройке ноги на выход. Я под "сделайте программную шину" имел в виду софтовое исполнение ручками, то есть "выпиливание" состояний на выводах МК программой, без привлечения аппаратных ресурсов I2C модуля. Цитата(esaulenka @ Sep 15 2015, 10:38)  Ну почему же? На AVR работает, на LPC работает, на ST'шках (с бааальшим бубном, правда) работает... Ну, значит, мне просто еще не повезло в этой жизни.  А бубен это да, вещь для пользователей аппаратного I2C нужная.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|