Добрый день. Проблемы с шиной I2C. SDA и SCL всегда в H. Не выдаёт вообще ничего. Настройки приложу ниже. У кого был опыт подскажите пожалуйста в чём может быть проблема или ошибка. Контролер " STM32F030F4P6" Спасибо!
void RCC_mk(void){ // Настройки тактирования МК без внешнего кварца 48 мГц. // ---------- Настройка регистра RCC_CR ---------- // 1) MODIFY_REG(FLASH->ACR, FLASH_ACR_LATENCY_Msk, 0b010 << FLASH_ACR_LATENCY_Pos); // 1 такт ожидания 48 мГц SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBE); // Буфер предварительной выборки ВКЛ. SET_BIT(FLASH->ACR, FLASH_ACR_PRFTBS); // Буфер предварительной выборки ВКЛ.
SET_BIT(RCC->CR, RCC_CR_HSION); // Генератор HSI Вкл. while(READ_BIT(RCC->CR, RCC_CR_HSIRDY) == RESET); // Ожидание флага готовности тактовой частоты HSI
CLEAR_BIT(RCC->CR, RCC_CR_HSEON); // Выключить HSE ( отсоеденить кварц ) CLEAR_BIT(RCC->CR, RCC_CR_CSSON); // CSS OFF.
// ---------- Настройка регистра RCC_CFRG ---------- // 2) MODIFY_REG(RCC->CFGR, RCC_CFGR_SW_Msk, 0b10 << RCC_CFGR_SW_Pos); // PLL тактирование MK MODIFY_REG(RCC->CFGR, RCC_CFGR_SWS_Msk, 0b10 << RCC_CFGR_SWS_Pos); // PLL тактирование MK
MODIFY_REG(RCC->CFGR, RCC_CFGR_HPRE_Msk, 0b0000 << RCC_CFGR_HPRE_Pos); // Шина APB /1 MODIFY_REG(RCC->CFGR, RCC_CFGR_PPRE_Msk, 0b000 << RCC_CFGR_PPRE_Pos); // Шина APB1 /1
CLEAR_BIT(RCC->CFGR, RCC_CFGR_PLLSRC); // источник PLL это HSI делённый /2 бит = 0.
MODIFY_REG(RCC->CFGR, RCC_CFGR_PLLMUL_Msk, 0b1010 << RCC_CFGR_PLLMUL_Pos); // Умножитель на 12.
SET_BIT(RCC->CR, RCC_CR_PLLON); // PLL ВКЛ. while(READ_BIT(RCC->CR, RCC_CR_PLLRDY) == RESET); // Ожидаем готовности PLL }
void I2C_init(void){ // Настройки шины I2C SET_BIT(RCC->AHBENR, RCC_AHBENR_GPIOAEN); // Запустим тактирование порта A SET_BIT(RCC->APB1ENR, RCC_APB1ENR_I2C1EN); // Включччить тактирование I2C SET_BIT(RCC->CFGR3, RCC_CFGR3_I2C1SW_SYSCLK); // Тактирование шины от SYSCLK 48 мГц. (RCC_CFRG3 регистр)
CLEAR_BIT(I2C1->CR1,I2C_CR1_PE); // Отключить шину while(READ_BIT(I2C1->CR1, I2C_CR1_PE)); // Ждём пока отключится I2C SET_BIT(I2C1->CR1, I2C_CR1_ANFOFF); // Аналоговый фильтр OFF SET_BIT(I2C1->CR1, I2C_CR1_NOSTRETCH); // Растяжение тактов ОТКЛ. CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_I2C_FMP_PA9); // Обычный режим без Fast+ CLEAR_BIT(SYSCFG->CFGR1, SYSCFG_CFGR1_I2C_FMP_PA10); // Обычный режим без Fast+ SET_BIT(I2C1->CR2, I2C_CR2_AUTOEND); // Автостоп ВКЛ. // ---------- Настройки порта PA9 I2C ---------- // ---------- SCL ---------- //MODIFY_REG(I2C1->CR1, I2C_CR1_DNF_Msk, 0b0001 << I2C_CR1_DNF_Pos); // Цифровой фильтр ВКЛ.
MODIFY_REG(GPIOA->AFR[4], GPIO_AFRH_AFSEL9_Msk, 0b0100 << GPIO_AFRH_AFSEL9_Pos); // Тактиров.альт.функц. №4 MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER9_Msk, 0b10 << GPIO_MODER_MODER9_Pos); // Альтернат_функции SET_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_9); // В режиме открытый "СТОК" MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDR_OSPEEDR9_Msk, 0b11 << GPIO_OSPEEDR_OSPEEDR9_Pos); // Высокая скорость MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR9_Msk, 0b01 << GPIO_PUPDR_PUPDR9_Pos); // Резисторы ОТКЛ.
// ---------- Насройки порта PA10 I2C ---------- // ---------- SDA ---------- MODIFY_REG(GPIOA->AFR[4], GPIO_AFRH_AFSEL10_Msk, 0b0100 << GPIO_AFRH_AFSEL10_Pos); // Тактиров.альт.функц. №4 MODIFY_REG(GPIOA->MODER, GPIO_MODER_MODER10_Msk, 0b10 << GPIO_MODER_MODER10_Pos); // Альтернат_функции SET_BIT(GPIOA->OTYPER, GPIO_OTYPER_OT_10); // В режиме открытый "СТОК" MODIFY_REG(GPIOA->OSPEEDR, GPIO_OSPEEDR_OSPEEDR10_Msk, 0b11 << GPIO_OSPEEDR_OSPEEDR10_Pos); // Высокая скорость MODIFY_REG(GPIOA->PUPDR, GPIO_PUPDR_PUPDR10_Msk, 0b01 << GPIO_PUPDR_PUPDR10_Pos); // Резисторы ОТКЛ. // ---------- Настройки таймингов I2C ---------- I2C1->TIMINGR = (uint32_t)0x20303E5D; // 48MHz 100kHz SET_BIT(I2C1->CR1,I2C_CR1_PE); // Включить шину while(READ_BIT(I2C1->CR1, I2C_CR1_PE) == RESET); // Ждём пока включится I2C }
|