I2C - инициализация в микроконтроллере STM32F10x


Порядок инициализации второго контроллера I2C

1. Отключить интерфейс сбросив бит PE в регистре I2C_CR1:

  I2C2->CR1 &= ~I2C_CR1_PE;

2. Настроить SCL и SDA как: выходы общего назначения 2 МГц, открытый сток, высокий уровень

  //- PB11: SDA
  GPIOB->CRH &= ~GPIO_CRH_MODE11_0;     //- mode = 0b10 - выход, 2 МГц
  GPIOB->CRH |=  GPIO_CRH_MODE11_1;      
  GPIOB->CRH |= GPIO_CRH_CNF11_0;       //- config = 0b01 - general, open-drain
  GPIOB->CRH &= ~GPIO_CRH_CNF11_1;
  
  //- PB10: SCL
  GPIOB->CRH &= ~GPIO_CRH_MODE10_0;      //- mode = 0b10 - выход, 2 МГц
  GPIOB->CRH |=  GPIO_CRH_MODE10_1;
  GPIOB->CRH |=  GPIO_CRH_CNF10_0;       //- config = 0b01 - general, open-drain
  GPIOB->CRH &= ~GPIO_CRH_CNF10_1;
  
  GPIOB->BSRR = GPIO_BSRR_BS10 | GPIO_BSRR_BS11;

3. Проверить установленный высокий уровень на SDA и SCL

  while (!(GPIOB->IDR &(GPIO_IDR_IDR10 | GPIO_IDR_IDR11)));

4. Перевести выход SDA на низкий уровень

  GPIOB->BSRR = GPIO_BSRR_BR11;

5. Проверить установленный низкий уровень на SDA

  while (GPIOB->IDR & GPIO_IDR_IDR11);

6. Перевести выход SDL на низкий уровень

  GPIOB->BSRR = GPIO_BSRR_BR10;

7. Проверить установленный низкий уровень на SDL

  while (GPIOB->IDR & GPIO_IDR_IDR10);

8. Перевести выход SDA на высокий уровень

  GPIOB->BSRR = GPIO_BSRR_BS11;

9. Проверить установленный высокий уровень на SDA

  while (!(GPIOB->IDR & GPIO_IDR_IDR11));

10. Перевести выход SDL на высокий уровень

  GPIOB->BSRR = GPIO_BSRR_BS10;

11. Проверить установленный высокий уровень на SDL

  while (!(GPIOB->IDR & GPIO_IDR_IDR10));

12. Настроить SCL и SDA как: выходы альтернативной функции, открытый сток

  //- PB11: SDA
  GPIOB->CRH |= GPIO_CRH_MODE11_0;      //- mode = 0b11 - выход, 50 МГц
  GPIOB->CRH |= GPIO_CRH_MODE11_1;      
  GPIOB->CRH |= GPIO_CRH_CNF11_1;       //- config = 0b11 - alternative, open-drain
  GPIOB->CRH |= GPIO_CRH_CNF11_0;
  
  //- PB10: SCL
  GPIOB->CRH |= GPIO_CRH_MODE10_0;      //- mode = 0b11 - выход, 50 МГц
  GPIOB->CRH |= GPIO_CRH_MODE10_1;
  GPIOB->CRH |= GPIO_CRH_CNF10_1;       //- config = 0b11 - alternative, open-drain
  GPIOB->CRH |= GPIO_CRH_CNF10_0;

13. Программный сброс интерфейса I2C

  I2C2->CR1 |=  I2C_CR1_SWRST;          //- программный сброс интерфейса I2C_2
  I2C2->CR1 &= ~I2C_CR1_SWRST;