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;