STM32F1----I2C

本文详细介绍了STM32硬件I2C的初始化流程,包括建立结构体、开启时钟、配置GPIO和I2C参数、初始化及启用I2C功能。同时,展示了I2C初始化结构体的定义,以及I2C初始化例程的实现。此外,还列举了相关通信协议和中断处理的函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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相关例程

等待实现
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值