STM32F103如何配置I2C通信?
时间: 2024-09-10 18:24:22 浏览: 125
STM32F103硬件I2C主机收发数据,亲测可用
在STM32F103中配置I2C通信主要涉及以下几个步骤:
1. **启用并配置I2C模块**:
- 首先需要在STM32CubeMX或Keil的HAL库配置工具中打开STM32F103的I2C设备。选择你要使用的I2C接口(如I2C1、I2C2等),然后配置时钟速度(SCL频率)和其他必要的选项,比如是否使能中断。
```c
I2C_HandleTypeDef hi2c1;
hi2c1.Instance = I2C1; // 替换为你使用的I2C实例
hi2c1.Init.ClockSpeed = 100000; // 设置I2C总线速度,单位Hz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; // 可选,默认为低电平拉长
hi2c1.Init.OwnAddress1 = I2C_ADDRESSING_MODE_7BIT; // 地址模式
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; // 或者改为I2C_ADDRESSINGMODE_10BIT
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);
```
2. **设置设备地址**:
- 如果你的I2C设备支持7位或10位寻址,你需要设置I2C初始化结构中的AddressingMode和OwnAddress1或OwnAddress2属性。
3. **开启中断**:
- 如果你想利用中断接收来自I2C设备的数据,需要开启相应的中断,并在系统服务函数中处理中断请求。
```c
HAL_NVIC_EnableIRQ(I2C1_IRQn); // 启动中断
HAL_NVIC_SetPriority(I2C1_IRQn, 0, 0); // 设置中断优先级
```
4. **发送和接收数据**:
- 对于发送数据,你可以使用`HAL_I2C_Master_Transmit()`函数,对于接收数据,则使用`HAL_I2C_Master收到了数据后,会自动保存在内部的缓冲区中,你可以通过`HAL_I2C_Master_GetData()`获取。
```c
uint8_t tx_data[] = {0x01, 0x02, 0x03}; // 数据发送数组
HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(&hi2c1, SLAVE_ADDRESS, tx_data, sizeof(tx_data), &numBytesWritten);
if(status == HAL_OK)
printf("Sent %d bytes to slave\n", numBytesWritten);
```
5. **关闭I2C**:
- 完成操作后,记得关闭I2C以释放资源。
```c
HAL_I2C_DeInit(&hi2c1);
```
阅读全文