首页 理论教育 STM32固件库编程:I2C结构体详解

STM32固件库编程:I2C结构体详解

时间:2023-10-21 理论教育 版权反馈
【摘要】:跟其他外设一样,STM32固件库提供了I2C初始化结构体及初始化函数来配置I2C外设。与前面学习的内容一致,关于I2C的固件库初始化结构体及函数定义在库文件stm32f4xx_i2c.h及stm32f4xx_i2c.c中。·I2C_OwnAddress1:STM32的I2C设备自己的地址。地址可设置为7位或10位,只要该地址是I2C总线上唯一的即可。STM32的I2C外设可同时使用两个地址,即同时对两个地址做出响应。图10-15I2C_GenerateSTART()函数说明相对应的I2C停止信号也有停止函数。使用该函数时,需要输入形参I2C号与检测的事件。

STM32固件库编程:I2C结构体详解

跟其他外设一样,STM32固件库提供了I2C初始化结构体及初始化函数来配置I2C外设。与前面学习的内容一致,关于I2C的固件库初始化结构体及函数定义在库文件stm32f4xx_i2c.h及stm32f4xx_i2c.c中。下面对常用的函数进行说明。对其他更多的函数,读者可以尝试查看说明来理解其使用方法。

1.I2C初始化结构体I2C-InitTypeDef

结构体成员说明如下:

·I2C_ClockSpeed:I2C的传输速率。在调用初始化函数时,函数会根据我们输入的数值经过运算后把时钟因子写入I2C的时钟控制寄存器CCR。这个传输速度参数值不得高于400kHz。前面学习到CCR寄存器不能写入小数类型的时钟因子,固件库计算出CCR值后会向下取整,因此SCL的实际频率可能会低于输入的参数值,但不会影响工作。

·I2C_Mode:选择I2C的使用方式。使用方式有:I2C模式(I2C_Mode_I2C)和SMBus主、从模式(I2C_Mode_SMBusHost、I2C_Mode_SMBusDevice)。I2C不需要在此处区分主从模式,直接设置I2C_Mode_I2C即可。

·I2C_DutyCycle:设置I2C的SCL时钟的占空比。该配置有两个选择,低电平时间∶高电平时间分别为2∶1(I2C_DutyCycle_2)和16∶9(I2C_DutyCycle_16_9)。一般地,对没有特殊要求的器件,这两种占空比差别不大,可以任选一个。

·I2C_OwnAddress1:STM32的I2C设备自己的地址。每个连接到I2C总线上的设备都要有一个自己的地址,主设备也不例外。地址可设置为7位或10位,只要该地址是I2C总线上唯一的即可。STM32的I2C外设可同时使用两个地址,即同时对两个地址做出响应。I2C_OwnAddress1配置的是默认的、OAR1寄存器存储的地址。若需要设置第二个地址寄存器OAR2,可使用I2C_OwnAddress2Config函数来配置。OAR2不支持10位地址。

·I2C_Ack:I2C应答使能设置。作用是使能发送响应信号。该成员值一般配置为允许应答(I2C_Ack_Enable),这是绝大多数遵循I2C标准的设备的通信要求。若改为禁止应答(I2C_Ack_Disable),往往会导致通信错误

·I2C_AcknowledgeAddress:选择I2C的寻址模式是7位还是10位地址。这需要根据实际连接到I2C总线上设备的地址进行选择。这个成员的配置也影响到I2C_OwnAddress1成员,只有这里设置成10位模式时,I2C_OwnAddress1才支持10位地址。

配置完这些结构体成员值,调用库函数I2C_Init(),即可把结构体的配置写入寄存器中。

2.I2C初始化函数I2C-Init()

I2C初始化函数在stm32f4xx_i2c.c中可找到,如图10-13所示。

图10-13 I2C_Init()函数说明

由函数说明得知,该函数有两个形参,第一个形参是I2C号,第二个形参是I2C初始化结构体。另外,在函数说明中要注意:在使用400kHz频率(高速模式)时,PCLK1的频率应该是10MHz的倍数。这说明要保障高速模式,需要有足够高的PCLK1的频率。

3.I2C使能函数I2C-Cmd()

I2C_Cmd()用于使能I2C,函数说明如图10-14所示。形参有两个,第一个形参是I2C号,第二个形参是使能ENABLE或者DISABLE。

图10-14 I2C_Cmd()函数说明

4.I2C起始信号产生函数I2C-GenerateSTART()与停止函数I2C-GenerateSTOP()

I2C_GenerateSTART()函数说明如图10-15所示。该函数用于发送起始信号S,形参有两个,第一个形参是I2C号,第二个形参是使能ENABLE或者DISABLE。

图10-15 I2C_GenerateSTART()函数说明

相对应的I2C停止信号也有停止函数。I2C_GenerateSTOP(I2C_TypeDef*I2Cx,FunctionalState NewState)函数的说明,其用法与I2C_GenerateSTART()一样,这里不再描述。

5.发送7位地址函数I2C-Send7bitAddress()

I2C在发送起始信号S后开始发送7位地址与1位读写信号,共同组成地址信号。I2C_Send7bitAddress()函数说明如图10-16所示。函数有三个形参:第一个形参是I2C号;第二个形参是需要发送数据的从设备地址;第三个形参是读写的方向,参数可以是I2C_Direction_Transmitter,代表发送者模式,即写模式,也可以是I2C_Direction_Receiver,代表接收者模式,即读模式。

图10-16 I2C_Send7bitAddress()函数说明

比如,要往I2C1总线(从器件地址为0xA8)发送地址码0xA8,函数如下:

I2C_Send7bitAddress(I2C1,0xA8,I2C_Direction_Transmitter);

6.应答使能函数I2C-AcknowledgeConfig()

I2C_AcknowledgeConfig()函数说明如图10-17所示,该函数有两个形参,用法很简单:第一个形参是I2C号,第二个形参是使能ENABLE或者DISABLE。

(www.xing528.com)

图10-17 I2C_AcknowledgeConfig()函数说明

7.事件检测函数I2C-CheckEvent()

函数说明如图10-18所示,用于通信过程中事件的检测,参考图10-10与图10-11。

图10-18 I2C_CheckEvent()函数说明

事件列表如函数说明。使用该函数时,需要输入形参I2C号与检测的事件。比如要检测I2C1上的EV5,函数如下:

if(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));

就可以完成判断。

8.I2C发送数据函数I2C-SendData()

I2C最基本的数据发送函数I2C_SendData(),其函数说明如图10-19所示。其使用方法非常简单,主要是对数据寄存器DR操作,只需在形参处写入I2C号与要写入的数据(单字节)。

图10-19 I2C_SendData()函数说明

9.I2C读取数据函数I2C-ReceiveData()

该函数与I2C_SendData()对应,作为最基本的读取I2C数据函数。函数有一个形参,带返回值。使用时,写入I2C号,函数读取DR中的数据后返回读取的单字节数。

图10-20 I2C_SendData()函数说明

10.标志位读取函数I2C-GetFlagStatus()

该函数用于读取I2C状态标志,函数说明如图10-21所示。图中列出了各种状态标志。

图10-21 I2C_GetFlagStatus()函数说明

函数有两个形参,第一个形参是I2C号,第二个形参是需要查询的状态标志。函数带返回值SET或者RESET。比如要查询I2C1是否忙,函数如下:

if(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));

11.清除状态标志位函数I2C-ClearFlag()

该函数可以将状态标志清除,函数说明如图10-22所示。可以清除的标志如函数说明的形参列表所示。函数有两个形参,第一个形参是I2C号,第二个形参是需要清除的标志。

图10-22 I2C_Clear Flag()函数说明

比如要清除I2C1的应答失败标志,函数如下:

I2C_ClearFlag(I2C1,I2C_FLAG_AF);

12.使能应答函数I2C-AcknowledgeConfig()

利用该函数,用户可以手动关闭或开启I2C的应答,函数说明如图10-23所示。

图10-23 I2C_AcknowledgeConfig()函数说明

该函数有两个形参,第一个形参是I2C号,第二个形参是使能ENABLE与DISABLE。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈