rav38 0 4 сентября, 2015 Опубликовано 4 сентября, 2015 (изменено) · Жалоба Здравствуйте все! Пытаюсь сделать опрос датчика по I2C2, используя HAL библиотеки stm32cubef1. При попытке что либо сделать на шине (запись, чтение) получаю ошибку выполнения ф-ции и картинку на линии SDA (в прищепке). Под отладчиком по шагам запускаю ф-цию HAL_I2C_IsDeviceReady. Вся работа заканчивается моментом генерации стартового бита. /* Generate Start */ SET_BIT(hi2c->Instance->CR1, I2C_CR1_START); После выполнения этой строчки на SDA появляется шум. Инициализация I2C2(взял из примеров): 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. В общем прошу помощи. Изменено 4 сентября, 2015 пользователем rav38 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 4 сентября, 2015 Опубликовано 4 сентября, 2015 · Жалоба Почему-то на осциллографе отчётливо видны 25 МГц, а ноги второго I2C перекрываются с эзернетом. Этот чудо-HAL случайно тактирование на модуль MAC не включил? :-) UPD. Глупость говорю, попутал со 105-м. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rav38 0 14 сентября, 2015 Опубликовано 14 сентября, 2015 (изменено) · Жалоба В общем проблему с интерфейсом так и не решил, но уперся в какие-то другие грабли, связанные с портом 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%. Куда копать? Изменено 14 сентября, 2015 пользователем rav38 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
golf2109 0 15 сентября, 2015 Опубликовано 15 сентября, 2015 · Жалоба Я бы прежде всего зашел бы в отладчик и посмотрел на каком этапе инициализации появляется генерация Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 15 сентября, 2015 Опубликовано 15 сентября, 2015 · Жалоба Как вариант попробовать подключить библиотеку CPAL (http://www.st.com/web/en/catalog/tools/PF258336) или сделать программную шину, но все же хочу понять почему не могу запустить HAL. Сделайте программную шину, чтобы работало. А после этого у Вас будет время, чтобы осознать, что никто еще не сваял работающий аппаратный модуль I2C. В течении десятков лет Вы будете встречать каждый новый процессор с надеждой "ну, вот оно, наконец свершилось". Но после некоторого ожидания (а иногда и сразу) в Еррате к этому "подающему надежды" обязательно появляется раздел, посвященный некорректной работе I2C: то битики какие-нибудь не устанавливаются, то зависает при определенных условиях, то еще что-нибудь. И, матюгнувшись в очередной раз, приклеете к новому проекту свою софтовую I2C либу, которая была написана еще для процессоров, о которых сейчас только воспоминания остались. Да-да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 15 сентября, 2015 Опубликовано 15 сентября, 2015 · Жалоба Сделайте программную шину, чтобы работало. Так не работает же у него! Генерация появляется сразу при настройке ноги на выход. Можно только посоветовать взять большой ножик и резать дорожки на плате, чтоб хоть что-то понять... Да, rav38, а у Вас при настройке ноги как вход уровень высокий? И push-pull ногу настраивать не надо, надо открытый коллектор делать (STM'ка позволяет). А после этого у Вас будет время, чтобы осознать, что никто еще не сваял работающий аппаратный модуль I2C. Ну почему же? На AVR работает, на LPC работает, на ST'шках (с бааальшим бубном, правда) работает... К ногодрыгу сложно привязать прерывания, например :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 15 сентября, 2015 Опубликовано 15 сентября, 2015 (изменено) · Жалоба Попробуйте проверить, не настроен ли (в глубинах HAL/SPL) таймер TIM2 на работу с этим выходом... Просто выключите его как периферийный блок. Будет ли "генерация" на выходе? Изменено 15 сентября, 2015 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 15 сентября, 2015 Опубликовано 15 сентября, 2015 · Жалоба Так не работает же у него! Генерация появляется сразу при настройке ноги на выход. Я под "сделайте программную шину" имел в виду софтовое исполнение ручками, то есть "выпиливание" состояний на выводах МК программой, без привлечения аппаратных ресурсов I2C модуля. Ну почему же? На AVR работает, на LPC работает, на ST'шках (с бааальшим бубном, правда) работает... Ну, значит, мне просто еще не повезло в этой жизни. :) А бубен это да, вещь для пользователей аппаратного I2C нужная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 15 сентября, 2015 Опубликовано 15 сентября, 2015 · Жалоба Я под "сделайте программную шину" имел в виду софтовое исполнение ручками, то есть "выпиливание" состояний на выводах МК программой, без привлечения аппаратных ресурсов I2C модуля. Я понимаю. Но во вчерашнем сообщении rav38 есть код. Там переключается нога на GPIO, обычный push-pull выход. И якобы сразу начинается генерация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 37 15 сентября, 2015 Опубликовано 15 сентября, 2015 · Жалоба "…Там переключается нога на GPIO, обычный push-pull выход…" А должен быть ОК (ОС)… Так ведь? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 15 сентября, 2015 Опубликовано 15 сентября, 2015 · Жалоба "…Там переключается нога на GPIO, обычный push-pull выход…" А должен быть ОК (ОС)… Так ведь? Угу. обязан быть ОК. Клок может быть захвачен внешним слейвом и принудительно утянут им в "0" на неопределенное время- может, оно и происходит. А данный меандр есть "битва выходов", если мастер клок пин не ОК и установлен в "1", а слейв утянул своим ОК в "0" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться