1.硬件I2C的初始化流程
<1>建立GPIO、I2C初始化结构体
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
<2>打开GPIO和I2C挂载的时钟
/*启动时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
<3>配置GPIO、I2C结构体
//GPIO配置省略
I2C_InitStructure.I2C_ClockSpeed = I2C_Speed; //频率
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; //I2C模式
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //占空比
I2C_InitStructure.I2C_OwnAddress1=0x0A; //主机地址
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //启用或禁用确认
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //7位地址模式
I2C_Init(I2C1, &I2C_InitStructure); //初始化
<4>调用函数完成初始化
I2C_Cmd(I2C1, ENABLE); //使能
I2C_AcknowledgeConfig(I2C1, ENABLE); //启用或禁用指定的I2C确认特性。
2.硬件I2C的结构体
typedef struct
{
uint32_t I2C_ClockSpeed; /*时钟频率,通信速率*/
uint16_t I2C_Mode; /*指定I2C模式*/
uint16_t I2C_DutyCycle; /*I2C快速模式占空比*/
uint16_t I2C_OwnAddress1; /*指定第一个设备自己的地址*/
uint16_t I2C_Ack; /*启用或禁用确认*/
uint16_t I2C_AcknowledgedAddress; /*指定确认7位或10位地址*/
}I2C_InitTypeDef;
/*I2C模式宏定义*/
#define I2C_Mode_I2C ((uint16_t)0x0000)
#define I2C_Mode_SMBusDevice ((uint16_t)0x0002)
#define I2C_Mode_SMBusHost ((uint16_t)0x000A)
/*I2C占空比选择宏定义*/
#define I2C_DutyCycle_16_9 ((uint16_t)0x4000) /*!< I2C fast mode Tlow/Thigh = 16/9 */
#define I2C_DutyCycle_2 ((uint16_t)0xBFFF) /*!< I2C fast mode Tlow/Thigh = 2 */
/*I2C启用或禁用宏定义*/
#define I2C_Ack_Enable ((uint16_t)0x0400)
#define I2C_Ack_Disable ((uint16_t)0x0000)
/**/
#define I2C_Direction_Transmitter ((uint8_t)0x00)
#define I2C_Direction_Receiver ((uint8_t)0x01)
/*地址位数宏定义*/
#define I2C_AcknowledgedAddress_7bit ((uint16_t)0x4000)
#define I2C_AcknowledgedAddress_10bit ((uint16_t)0xC000)
3.硬件I2C的初始化例程
#include "i2c.h"
/*硬件I2C初始化配置*/
static void i2c_1_onfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
I2C_InitTypeDef I2C_InitStructure;
/*启动时钟*/
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);
/* Config :PB6-I2C1_SCL;PB7-I2C1_SDA*/
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_ClockSpeed = I2C_Speed; //频率
I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; /* I2C模式 */
I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; //占空比
I2C_InitStructure.I2C_OwnAddress1=0x0A; /* 这个地址只要与STM32外挂的I2C器件地址不一样即可 */
I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; //启用或禁用确认
I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; //I2C的寻址模式
I2C_Init(I2C1, &I2C_InitStructure); //初始化
I2C_Cmd(I2C1, ENABLE); //使能
I2C_AcknowledgeConfig(I2C1, ENABLE); //使能或者失能指定的I2C应答功能。
}
void i2c_1_init(void)
{
i2c_1_onfig();
}
4.硬件I2C相关函数
- 初始化相关
void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);
void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState);
- 通信协议相关
/*产生起始位*/
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState);
/*产生停止位*/
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState);
/*启用或禁用指定的I2C应答特性*/
void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);
/*使能或者失能指定的I2C应答功能*/
void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
- 中断
/*I2C配置函数*/
void I2C_ITConfig(I2C_TypeDef* I2Cx, uint16_t I2C_IT, FunctionalState NewState);
- 基本的收发函数
/*I2C发送数据*/
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);
/*I2C接收数据**/
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);
/*广播地址*/
void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);
5.软件I2C相关例程
等待实现