Как настройть I2C для STM32F103 с использованием регистров?
я соеденил 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 организован? В коде его не видно.
Ответы:
Подтягивающие резисторы на шине I2C установлены?
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для настройки 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 с использованием регистров. Пожалуйста, убедитесь, что вы корректно настроили частоту тактирования, скорость передачи и другие параметры в соответствии с вашими требованиями. Если возникнут дополнительные вопросы, не стесняйтесь задавать их.