STM32F030F4P6 проблемы с шиной I2C.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
aleksey chilov
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

STM32F030F4P6 проблемы с шиной I2C.

Сообщение aleksey chilov »

Добрый день.
Проблемы с шиной 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
}
Реклама
Adrift
Вымогатель припоя
Сообщения: 553
Зарегистрирован: Вт окт 01, 2024 15:22:33

Re: STM32F030F4P6 проблемы с шиной I2C.

Сообщение Adrift »

[uquote="aleksey chilov",url="/forum/viewtopic.php?p=4670451#p4670451"]

Код: Выделить всё

MODIFY_REG(GPIOA->AFR[4], GPIO_AFRH_AFSEL9_Msk, 0b0100 << GPIO_AFRH_AFSEL9_Pos);
[/uquote]
Там всего 2 регистра: AFR[0] и AFR[1].
Реклама
aleksey chilov
Нашел транзистор. Понюхал.
Сообщения: 167
Зарегистрирован: Вс мар 27, 2022 09:38:17

Re: STM32F030F4P6 проблемы с шиной I2C.

Сообщение aleksey chilov »

Сейчас пересмотрю

Добавлено after 6 minutes 34 seconds:
Спасибо большое! Завелась! Там получается что Рег 0 это AFRL, а рег 1 это AFRН, мой был 1. Спасибо!
Ответить

Вернуться в «ARM»