stm32 i2C通信代码
时间: 2023-08-21 11:08:05 浏览: 114
基于stm32的i2c通信
以下是一个基本的STM32 I2C通信代码示例,用于通过I2C总线与从设备进行通信:
```c
#include "stm32fxxx.h"
// I2C初始化
void I2C_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;
I2C_InitTypeDef I2C_InitStruct;
// 使能I2C时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2Cx, ENABLE);
// 配置I2C引脚
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_SCL | GPIO_Pin_SDA;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_Init(GPIOx, &GPIO_InitStruct);
// 配置I2C
I2C_InitStruct.I2C_ClockSpeed = 100000; // 设置I2C时钟速度
I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStruct.I2C_OwnAddress1 = 0x00; // 设置本地设备地址
I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_Init(I2Cx, &I2C_InitStruct);
// 使能I2C
I2C_Cmd(I2Cx, ENABLE);
}
// I2C发送数据
void I2C_SendData(uint8_t slaveAddr, uint8_t* data, uint8_t len){
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); // 等待总线空闲
I2C_GenerateSTART(I2Cx, ENABLE); // 生成起始信号
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); // 等待起始信号发送完毕
I2C_Send7bitAddress(I2Cx, slaveAddr, I2C_Direction_Transmitter); // 发送从设备地址
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // 等待从设备地址发送完毕
for(uint8_t i = 0; i < len; i++){
I2C_SendData(I2Cx, data[i]); // 发送数据
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 等待数据发送完毕
}
I2C_GenerateSTOP(I2Cx, ENABLE); // 生成停止信号
}
// I2C接收数据
void I2C_ReceiveData(uint8_t slaveAddr, uint8_t* data, uint8_t len){
while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY)); // 等待总线空闲
I2C_GenerateSTART(I2Cx, ENABLE); // 生成起始信号
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT)); // 等待起始信号发送完毕
I2C_Send7bitAddress(I2Cx, slaveAddr, I2C_Direction_Receiver); // 发送从设备地址
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // 等待从设备地址发送完毕
for(uint8_t i = 0; i < len; i++){
if(i == len - 1){
I2C_AcknowledgeConfig(I2Cx, DISABLE); // 最后一个数据字节前禁止ACK
}
while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)); // 等待数据接收完毕
data[i] = I2C_ReceiveData(I2Cx); // 读取数据
}
I2C_AcknowledgeConfig(I2Cx, ENABLE); // 使能ACK
I2C_GenerateSTOP(I2Cx, ENABLE); // 生成停止信号
}
```
请注意,上述代码中的一些宏和函数需要根据您的实际硬件配置进行修改,例如`RCC_APB1PeriphClockCmd`和`GPIO_Init`等函数中的参数。此外,还需要根据您的具体应用程序进行适当的修改和调整。
阅读全文