Перейти к содержанию
    

STM32F103CBT и I2C2

Здравствуйте все!

Пытаюсь сделать опрос датчика по 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.

 

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

post-72275-1441354834_thumb.jpg

Изменено пользователем rav38

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Этот чудо-HAL случайно тактирование на модуль MAC не включил? :-)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В общем проблему с интерфейсом так и не решил, но уперся в какие-то другие грабли, связанные с портом 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы прежде всего зашел бы в отладчик и посмотрел на каком этапе инициализации появляется генерация

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

А после этого у Вас будет время, чтобы осознать, что никто еще не сваял работающий аппаратный модуль I2C. В течении десятков лет Вы будете встречать каждый новый процессор с надеждой "ну, вот оно, наконец свершилось". Но после некоторого ожидания (а иногда и сразу) в Еррате к этому "подающему надежды" обязательно появляется раздел, посвященный некорректной работе I2C: то битики какие-нибудь не устанавливаются, то зависает при определенных условиях, то еще что-нибудь. И, матюгнувшись в очередной раз, приклеете к новому проекту свою софтовую I2C либу, которая была написана еще для процессоров, о которых сейчас только воспоминания остались.

Да-да.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Можно только посоветовать взять большой ножик и резать дорожки на плате, чтоб хоть что-то понять...

 

Да, rav38, а у Вас при настройке ноги как вход уровень высокий?

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

 

 

А после этого у Вас будет время, чтобы осознать, что никто еще не сваял работающий аппаратный модуль I2C.

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

К ногодрыгу сложно привязать прерывания, например :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Genadi Zawidowski

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

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

Ну, значит, мне просто еще не повезло в этой жизни. :)

А бубен это да, вещь для пользователей аппаратного I2C нужная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"…Там переключается нога на GPIO, обычный push-pull выход…"

А должен быть ОК (ОС)… Так ведь?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"…Там переключается нога на GPIO, обычный push-pull выход…"

А должен быть ОК (ОС)… Так ведь?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...