Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

STM32F103 + I2C на PB6/7

Ср ноя 14, 2018 17:54:27

Доброго вечера всем откликнувшимся. Совершенно не могу понять в чём проблема, и вроде как загуглить тоже ничего не могу. А ситуация следующая:

BMP280 подключён к I2C1 на выводах PB6/PB7. Код сгенерирован Кубом, подключена библиотека, пока ничего не делаю кроме чтения с датчика и отправки в порт. Никакой другой периферии, таймеров, ничего не взведено и не трогается. И... оно не работает. Вообще никак. Оба вывода в состоянии лог.1 и ничего не происходит.

Если тем же Кубом собрать тот же проект, но I2C1 назначить на соседние выводы PB8/PB9, то всё прекрасно стартует, читается и шлётся. Но... у меня уже пара десятков плат, на которых датчик разведён на выводы рядом. Перемычек честно говоря не охота.

Собственно вопрос -- что делать? На используемых мной выводах (PB6/PB7) ещё возможен USART1. Но я его не использую, использую USART2. Он тоже работает штатно, никаких косяков. Если в коде инициализации I2C руками заменить GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; на GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; то осциллографом становятся видны попытки к посылкам. Но естественно в режиме пуш-пулл ничего работать не будет. И дело явно не в датчике/проводах, потому что такой же датчик подключенный на макетке к другим выводам работает нормально. Воооот... Я в растерянности, товарищи. Микроконтроллер вроде один из самых популярных, а вот найти ничего не смог. :beer:
Последний раз редактировалось просто КОТ Чт ноя 15, 2018 10:17:20, всего редактировалось 1 раз.

Re: STM32F103 + I2C на PB6/7

Ср ноя 14, 2018 18:38:10

PB6/PB7 это I2C1, PB10/PB11 это I2C2. Разница только в этом.

Re: STM32F103 + I2C на PB6/7

Ср ноя 14, 2018 19:17:57

BMP280 подключён к I2C1 на выводах PB6/PB7. Код сгенерирован Кубом,

Давайте, мож на файл кубовского проекта глянем? И, да, I2C1 можно "перевесить" на PB8/PB9, но не на PB10/PB11. Где-то у вас не стыкуется.

Re: STM32F103 + I2C на PB6/7

Чт ноя 15, 2018 00:08:56

Не искать гуглить надо, а читать и изучать референс мануал и программировать его согласно описанию. В основном инженеры программируют через CMSIS интерфейс. Использование HAL имеет свои трудности и он мало популярен среди опытных.
Когда спрашиваете помощь нужно выкладывать код инициализации, проект еще лучше будет.

I2C1 может подключаться только к PB6/PB7 (I2C1_REMAP = 0 ), PB8/PB9 (I2C1_REMAP = 1 )

Ноги периферии I2C должны конфигурироваться:

I2Cx_SCL I2C clock - Alternate function open drain
I2Cx_SDA I2C Data I/O - Alternate function open drain

Re: STM32F103 + I2C на PB6/7

Чт ноя 15, 2018 10:27:56

Ещё раз спасибо всем откликнувшимся. Продолжим:

1. По поводу выводов. Те на которых работает -- PB8\PB9. Ближайшие соседние. Перепутал, когда пост писал. Поправил.
СпойлерИзображение


2. По поводу выбора библиотек. Искренне понимаю что HAL это подводные камни, и опытному инженеру следует работать на CMSIS. Но... я пока не могу назвать себя опытным разработчиком под микроконтроллеры. А задача в целом позволяет решить её HAL малой кровью. Только вот что-то пошло не так.

3. Код инициализации I2C сейчас приложу. Если пересобирать кубом, насколько я заметил, меняются только номера выводов.:
Код:
#include "i2c.h"
#include "gpio.h"

I2C_HandleTypeDef hi2c1;

void MX_I2C1_Init(void)
{ hi2c1.Instance = I2C1;
  hi2c1.Init.ClockSpeed = 100000;
  hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  hi2c1.Init.OwnAddress1 = 0;
  hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  hi2c1.Init.OwnAddress2 = 0;
  hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  if (HAL_I2C_Init(&hi2c1) != HAL_OK)  _Error_Handler(__FILE__, __LINE__);
}

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{ GPIO_InitTypeDef GPIO_InitStruct;
  if(i2cHandle->Instance==I2C1)
  { /**I2C1 GPIO Configuration   
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA */
    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    __HAL_RCC_I2C1_CLK_ENABLE();
  }
}

void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)
{ if(i2cHandle->Instance==I2C1)
  { __HAL_RCC_I2C1_CLK_DISABLE();
    /**I2C1 GPIO Configuration   
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA */
    HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7);
  }
}

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Вложения
CubeMX.png
(111.68 KiB) Скачиваний: 761

Re: STM32F103 + I2C на PB6/7

Чт ноя 15, 2018 10:44:27

Микроконтроллер вроде один из самых популярных, а вот найти ничего не смог. :beer:


Плохо искал , с минимальными правками (настройки пинов) и для 103его работает.
Ну и естественно -читать еерату

http://mcu.goodboard.ru/viewtopic.php?id=14

Re: STM32F103 + I2C на PB6/7

Чт ноя 15, 2018 11:09:12

просто КОТ писал(а):понимаю что HAL это подводные камни, и опытному инженеру следует работать на CMSIS. Но... я пока не могу назвать себя опытным разработчиком под микроконтроллеры.
Используйте SPL. Просто как с HAL но без подводных камней (багов не нашел). И размер кода меньше.

Re: STM32F103 + I2C на PB6/7

Чт ноя 15, 2018 11:49:36

Огромнейшее спасибо всем Вам, и товарищу Досикусу в частности. Нашёл по его ссылке код, и методом исключения вычислил недостающие строки в инициализации. Теперь эта функция выглядит так:

Код:
void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)
{ GPIO_InitTypeDef GPIO_InitStruct;
  if(i2cHandle->Instance==I2C1)
  { /**I2C1 GPIO Configuration   
    PB6     ------> I2C1_SCL
    PB7     ------> I2C1_SDA */
    GPIOB->CRL |= GPIO_CRL_MODE6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF6 | GPIO_CRL_CNF7;
    __HAL_RCC_I2C1_CLK_ENABLE();
    I2C1->CR1 |= I2C_CR1_SWRST;
    I2C1->CR1 &= ~I2C_CR1_SWRST;
  }
}


Датчик откликнулся, а это уже очень неплохо. надеюсь вскоре решусь перейти на взрослые библиотеки. Всем удачного кодинга, 73!
Ответить