I2C完整讲解(二)

库函数介绍

现在我们来看下I2C库函数的时候以及相关知识点
I2C_InitTypedef(I2C初始化结构体)

typedef struct
{
  uint32_t I2C_ClockSpeed;          /*!< Specifies the clock frequency.
                                         This parameter must be set to a value lower than 400kHz */

  uint16_t I2C_Mode;                /*!< Specifies the I2C mode.
                                         This parameter can be a value of @ref I2C_mode */

  uint16_t I2C_DutyCycle;           /*!< Specifies the I2C fast mode duty cycle.
                                         This parameter can be a value of @ref I2C_duty_cycle_in_fast_mode */

  uint16_t I2C_OwnAddress1;         /*!< Specifies the first device own address.
                                         This parameter can be a 7-bit or 10-bit address. */

  uint16_t I2C_Ack;                 /*!< Enables or disables the acknowledgement.
                                         This parameter can be a value of @ref I2C_acknowledgement */

  uint16_t I2C_AcknowledgedAddress; /*!< Specifies if 7-bit or 10-bit address is acknowledged.
                                         This parameter can be a value of @ref I2C_acknowledged_address */
}I2C_InitTypeDef;

I2C_ClockSpeed:
设置I2C的传输速率,在调用初始化函数时,函数会根据我们输入的数值经过运算后把时钟因子写入到I2C的时钟控制寄存器CCR.而我们写入的这个参数值不得高于400KHz. 实际上由于CCR寄存器能写入小数类型的时钟因子,影响到 SCL的实际频率可能会低于本成员设置的参数值,这时除了通讯稍慢一点 以外,不会对I2C的标准通讯造成其它影响,直接赋值就可以配置相应的时钟(大于100khz小于400khz),调用库函数I2C_Init()时会把时钟的值转化为I2C_CCR[11:0]的值并设置F/S位决定在工作在快速模式还是标准模式,不用我们手动去算,I2C_Init()要选择初始化I2C1或者I2C2,

I2C_Mode:该参数并不是决定I2C工作在快速模式还是标准模式(这是由I2C_ClockSpeed决定的),这里决定的模式是I2C模式I2C_Mode_I2C 还是2C_Mode_SMBusHost还是I2C_Mode_SMBusDevice,我们选择I2C_Mode_I2C

I2C_DutyCycle:设置I2C的SCL线时钟的占空比.该配置有两个选择,分别为低电平时间比高电平时间为2:1 ( I2C_DutyCycle_2)和16:9 (I2C_DutyCycle_16_9),用来设置I2C_CCR的DUTY位

I2C_OwnAddress1:==从我们的I2C框图可以知道一个设备是可以有两个地址的,这里标识1说明设置的是第一个地址,此地址可以设置成7位或者10位地址,只要该地址是I2C总线上唯一的即可, ==若需要设置第二个地址寄存器OAR2,可使I2C_OwnAddress2Config函数来配置,OAR2不支持10位地址.

I2C_Ack:配置I2C应答是否使能,设置为使能则可以发送响应信号.一般 配置为允许应答(I2C_Ack_Enable),这是绝大多数遵循I2C标准的设备的通讯要求,改为禁止应答(I2C_Ack_Disable)往往会导致通讯错误,是配置I2C_CR1的第10位

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

I2C_GeneralCallCmd库函数
该函数原型为void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx,FunctionalState NewStare),用来产生I2CX的起始信号,第一参数可以选择I2C1或者I2C2,第二个参数可以选择ENBALE或者DISABLE用来设置是否产生起始信号

I2C_GenerateSTOP库函数
该函数原型为voidI2C_GenerateSTOP(I2C_TypeDef* I2Cx,FunctionalState NewStare),用来产生I2CX的停止信号,第一参数可以选择I2C1或者I2C2,第二个参数可以选择ENBALE或者DISABLE用来设置是否产生停止信号

FlagStatus I2C_GetFlagStatus库函数
该函数原型为FlagStatus I2C_GetFlagStatus( I2C_TypeDef * I2Cx, uint32_t I2C_FLAG),该函数用来查询标志位,标志想要进行的工作是否完成,返回值为RESET和SET对应未完成和完成
I2C_FLAG可以配置为以下宏,用于检测不同的动作
I2C_FLAG_DUALF: Dual flag (Slave mode)
I2C_FLAG_SMBHOST: SMBus host header (Slave mode)
I2C_FLAG_SMBDEFAULT: SMBus default header (Slave mode)
I2C_FLAG_GENCALL: General call header flag (Slave mode)
I2C_FLAG_TRA: Transmitter/Receiver flag
I2C_FLAG_BUSY: Bus busy flag
I2C_FLAG_MSL: Master/Slave flag
I2C_FLAG_SMBALERT: SMBus Alert flag
I2C_FLAG_TIMEOUT: Timeout or Tlow error flag
I2C_FLAG_PECERR: PEC error in reception flag
I2C_FLAG_OVR: Overrun/Underrun flag (Slave mode)
I2C_FLAG_AF: Acknowledge failure flag
I2C_FLAG_ARLO: Arbitration lost flag (Master mode)
I2C_FLAG_BERR: Bus error flag
I2C_FLAG_TXE: Data register empty flag (Transmitter)
I2C_FLAG_RXNE: Data register not empty (Receiver) flag
I2C_FLAG_STOPF: Stop detection flag (Slave mode)
I2C_FLAG_ADD10: 10-bit header sent flag (Master mode)
I2C_FLAG_BTF: Byte transfer finished flag
I2C_FLAG_ADDR: Address sent flag (Master mode) “ADSL” Address matched flag (Slave mode)“ENDA”
I2C_FLAG_SB: Start bit flag (Master mode)

I2C_Send7bitAddress库函数
该库函数函数原型为void I2C_Send7bitAddress ( I2C_TypeDef * I2Cx,uint8_t Address,uint8_t I2C_Direction),用来发送地址,地址存在第二个参数,方向用第三个参数设置

I2C_SendData
该库函数原型为void I2C_SendData ( I2C_TypeDef * I2Cx,uint8_t Data ) ,用来发送数据,数据放在第二个参数

I2C_ReceiveData库函数
uint8_t I2C_ReceiveData( I2C_TypeDef * I2Cx ),用来接收数据,数据存在返回值

I2C_AcknowledgeConfig库函数
该函数原型为void I2C_AcknowledgeConfig ( I2C_TypeDef * I2Cx, FunctionalState NewState ) ,第二个参数可以设置为ENBALE或者DISABLE用来产生应答信号或者非应答信号

EEPROM介绍

在这里插入图片描述
可以看出5,6号引脚接有上拉电阻,其他挂载在I2C总线上的设备就不用接上拉电阻了,E0到E2是地址引脚,EERROM有5种不同的容量芯片,AT24C01A/02/04/08A/16A对应1024/2048/4096/8192/16384字节,AT24C01A/02设备地址由"4+3+1"决定,前面4位是固定的1010,后面3位由E0到E2决定,最后一位决定读或者写
框图
在这里插入图片描述
DEVICE ADDRESS COMPARATOR为地址比较器,和总线上广播的地址进行比较,如果一致则应答,可以根据行地址和列地址进行访问,

在这里插入图片描述
在这里插入图片描述
编程思路:
1.初始化IIC相关的GPIO(包括)
2.配置IIC外设的工作模式
3.编写IIC写入EEPROM的Byte write函数
4.编写IIC读取EEPROM的RANDOM read函数
5.使用read函数和write函数进行校验
6.编写page write和seq read函数并校验

发布了83 篇原创文章 · 获赞 3 · 访问量 1251

猜你喜欢

转载自blog.csdn.net/qq_41936794/article/details/105075522
I2C