STM32F103RET6 标准库配置 I2C的代码
时间: 2024-05-25 07:19:58 浏览: 16
你可以在ST官网上找到STM32F103RET6的标准库,然后按照以下步骤进行I2C的配置:
1.在工程中添加i2c.c和i2c.h文件。
2.在头文件中包含i2c.h文件。
3.定义I2C_TypeDef结构体。
4.设置I2C的GPIO引脚和I2C速度。
5.初始化I2C。
6.发送I2C启动信号,向从设备发送数据或接收数据。
代码如下:
#include "stm32f10x.h"
#include "i2c.h"
#define I2C_SPEED 100000UL
void I2C_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_Init(GPIOB, &GPIO_InitStructure);
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
I2C_InitStructure.I2C_OwnAddress1 = 0x00;
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
I2C_InitStructure.I2C_ClockSpeed = I2C_SPEED;
I2C_Init(I2C1, &I2C_InitStructure);
I2C_Cmd(I2C1, ENABLE);
}
int main(void)
{
uint8_t dev_addr, reg_addr, data;
int i;
I2C_Configuration();
/*从设备发送数据*/
dev_addr = 0xA0;
reg_addr = 0x00;
data = 0x01;
//发送Start信号
I2C_GenerateSTART(I2C1, ENABLE);
//等待EV5
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
;
//发送从设备地址+写信号
I2C_Send7bitAddress(I2C1, dev_addr, I2C_Direction_Transmitter);
//等待EV6
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
;
//发送寄存器地址
I2C_SendData(I2C1, reg_addr);
//等待EV8
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
;
//发送数据
I2C_SendData(I2C1, data);
//等待EV8
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
;
//发送Stop信号
I2C_GenerateSTOP(I2C1, ENABLE);
/*从设备接收数据*/
dev_addr = 0xA0;
reg_addr = 0x01;
//发送Start信号
I2C_GenerateSTART(I2C1, ENABLE);
//等待EV5
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
;
//发送从设备地址+写信号
I2C_Send7bitAddress(I2C1, dev_addr, I2C_Direction_Transmitter);
//等待EV6
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))
;
//发送寄存器地址
I2C_SendData(I2C1, reg_addr);
//等待EV8
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED))
;
//发送Repeat Start信号
I2C_GenerateSTART(I2C1, ENABLE);
//等待EV5
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT))
;
//发送从设备地址+读信号
I2C_Send7bitAddress(I2C1, dev_addr, I2C_Direction_Receiver);
//等待EV6
while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED))
;
//关闭ACK
I2C_AcknowledgeConfig(I2C1, DISABLE);
//读取数据
for (i = 0; i < 10000; i++) {
if (I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)) {
data = I2C_ReceiveData(I2C1);
break;
}
}
//发送Stop信号
I2C_GenerateSTOP(I2C1, ENABLE);
return 0;
}