Как настройть I2C для STM32F103 с использованием регистров?

Ссылка скопирована
1 ответ

я соеденил Arduino и Stm32 по шине I2C и когда запускаю простой скетч из примера i2c_scanner ардуино его не находит. что надо сделать чтобы ардуино его увидел?

#include "stm32f1xx.h"  void I2C_Configuration(void) {     // Включение тактирования I2C1     RCC->APB1ENR |= RCC_APB1ENR_I2C1EN;      // Настройка PB6 (SCL) и PB7 (SDA) как альтернативной функции     GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF7);     GPIOB->CRL |= (GPIO_CRL_MODE6 | GPIO_CRL_MODE7); // Режим выхода 50 МГц     GPIOB->CRL |= (GPIO_CRL_CNF6_1 | GPIO_CRL_CNF7_1); // Альтернативная функция Open-Drain      // Настройка скорости передачи данных     I2C1->CR2 |= (36 << 0); // HSI (8 MHz) делится на 36 -> FREQ = 222 kHz      // Установка адреса устройства (если STM32F103 является устройством, а не мастером)     I2C1->OAR1 |= (0x30 << 1); // Адрес устройства = 0x30      // Включение I2C1     I2C1->CR1 |= I2C_CR1_PE; }  int main(void) {     I2C_Configuration();      // Далее можно выполнять операции передачи и приема данных по шине I2C }

#include "stm32f1xx.h" void I2C_Configuration(void) { // Включение тактирования I2C1 RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // Настройка PB6 (SCL) и PB7 (SDA) как альтернативной функции GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF7); GPIOB->CRL |= (GPIO_CRL_MODE6 | GPIO_CRL_MODE7); // Режим выхода 50 МГц GPIOB->CRL |= (GPIO_CRL_CNF6_1 | GPIO_CRL_CNF7_1); // Альтернативная функция Open-Drain // Настройка скорости передачи данных I2C1->CR2 |= (36 << 0); // HSI (8 MHz) делится на 36 -> FREQ = 222 kHz // Установка адреса устройства (если STM32F103 является устройством, а не мастером) I2C1->OAR1 |= (0x30 << 1); // Адрес устройства = 0x30 // Включение I2C1 I2C1->CR1 |= I2C_CR1_PE; } int main(void) { I2C_Configuration(); // Далее можно выполнять операции передачи и приема данных по шине I2C }

Дополнительно:

Ну и второй вопрос, бесконечный цикл на STM организован? В коде его не видно.

  • kriptonus, я если честно новичок а этот код просто взят с chatgpt. но подтягивающие резисторы установлены. помогите новичку пожалуйста. есть ли готовый семпл
  • vladgromch, после i2c_configuration есть какой-то код в функции main?
  • Ответы:

    Подтягивающие резисторы на шине I2C установлены?

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Андрей PHP Ответ

    Для настройки I2C для STM32F103 с использованием регистров, вам потребуется выполнить следующие шаги:

    1. Настройка GPIO для соединения SDA и SCL с пинами микроконтроллера:
    ```c
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // Включение тактирования порта B
    GPIOB->CRL &= ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF7); // Сброс режимов и конфигураций для пинов 6 и 7
    GPIOB->CRL |= (GPIO_CRL_MODE6_1 | GPIO_CRL_MODE7_1); // Режим Output mode, max speed 2 MHz
    GPIOB->CRL |= (GPIO_CRL_CNF6_1 | GPIO_CRL_CNF7_1); // Alternate function output Open-drain
    ```

    2. Настройка регистров I2C:
    ```c
    RCC->APB1ENR |= RCC_APB1ENR_I2C1EN; // Включение тактирования I2C1
    I2C1->CR1 &= ~I2C_CR1_PE; // Отключение I2C
    I2C1->CR2 = 0x08; // Частота тактирования APB1
    I2C1->CCR = 0x28; // Установка скорости передачи
    I2C1->TRISE = 0x09; // Установка задержки на SDA и SCL
    I2C1->CR1 |= I2C_CR1_PE; // Включение I2C
    ```

    3. Настройка режима работы I2C:
    ```c
    I2C1->CR1 |= I2C_CR1_ACK; // Включение генерации подтверждения
    I2C1->CR2 |= I2C_CR2_ITEVTEN; // Включение прерывания по событию
    I2C1->CR2 |= I2C_CR2_ITERREN; // Включение прерывания по ошибке
    ```

    4. Отправка данных по шине I2C:
    ```c
    void I2C_SendData(uint8_t address, uint8_t data)
    {
    while(I2C1->SR2 & I2C_SR2_BUSY); // Ожидание освобождения шины
    I2C1->CR1 |= I2C_CR1_START; // Генерация старт условия
    while(!(I2C1->SR1 & I2C_SR1_SB)); // Ожидание завершения передачи старт условия
    (void)I2C1->SR1; // Сброс флага SB
    I2C1->DR = address; // Отправка адреса устройства
    while(!(I2C1->SR1 & I2C_SR1_ADDR)); // Ожидание подтверждения адреса
    (void)I2C1->SR1; // Сброс флага ADDR
    (void)I2C1->SR2; // Сброс флага ADDR
    I2C1->DR = data; // Отправка данных
    while(!(I2C1->SR1 & I2C_SR1_BTF)); // Ожидание окончания передачи
    I2C1->CR1 |= I2C_CR1_STOP; // Генерация стоп условия
    }
    ```

    Это базовая настройка I2C для STM32F103 с использованием регистров. Пожалуйста, убедитесь, что вы корректно настроили частоту тактирования, скорость передачи и другие параметры в соответствии с вашими требованиями. Если возникнут дополнительные вопросы, не стесняйтесь задавать их.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно