1.I2C协议介绍
I2C是一个支持多设备的总线,可连接多个I2C通讯设备,每个总线包括一条双向串行数据线(SDA)和一条串行时钟线(SCL)。数据线用来表示数据,时钟线用来数据收发同步。通讯过程如下:
S:主机的I2C接口产生的传输开始信号,连接在I2C总线上的所有从机都会接收到。
SLAVE_ADDRESS:主机广播的从机地址信号,I2C总线上每个从机地址唯一。
R/W:读写方向,置1为读,置0为写。
A/A-:从机接收到匹配的地址后,主机或从机会返回一个应答信号或非应答信号,只有接收到应答信号主机才继续发送接收数据。写数据的时候,每次发送一个字节数据(DATA:8位)后,都要等待应答信号,重复这个过程可以发送N个数据。数据传输结束发送停止传输信号P。读数据时,主机向从机发应答信号,当主机希望停止接收数据时,发送非应答信号。
起始信号和停止信号见上图。
数据有效性见上图。
2.基于HAL库的I2C配置
步骤:时钟使能—GPIO管脚配置—I2C配置
初始化:
void MyI2C_Init(void){
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
//I2C_SCL config
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_MODE_AF_OD;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
HAL_GPIO_Init(GPIOB,&GPIO_InitStruct);
//I2C_SDA config
__HAL_RCC_I2C1_CLK_ENABLE();
I2C_HandleTypeDef MyI2C1;
MyI2C1.Instance=I2C1;
MyI2C1.Init.Timing=0x60201E2B;//100KHz
MyI2C1.Init.OwnAddress1=0;
MyI2C1.Init.AddressingMode=I2C_ADDRESSINGMODE_7BIT;
MyI2C1.Init.DualAddressMode=I2C_DUALADDRESS_DISABLE;
MyI2C1.Init.OwnAddress2=0;
MyI2C1.Init.OwnAddress2Masks=I2C_OA2_NOMASK;
MyI2C1.Init.GeneralCallMode=I2C_GENERALCALL_DISABLE;
MyI2C1.Init.NoStretchMode=I2C_NOSTRETCH_DISABLE;
MyI2C1.Mode=HAL_I2C_MODE_MASTER;
HAL_I2C_Init(&MyI2C1);
}
输入输出函数:
阻塞模式:
HAL_I2C_Master_Transmit(); HAL_I2C_Master_Receive(); HAL_I2C_Slave_Transmit(); HAL_I2C_Slave_Receive()
HAL_I2C_Mem_Write(); HAL_I2C_Mem_Read(); HAL_I2C_IsDeviceReady()
带中断非阻塞模式:
HAL_I2C_Master_Transmit_IT(); HAL_I2C_Master_Receive_IT(); HAL_I2C_Slave_Transmit_IT()
HAL_I2C_Slave_Receive_IT(); HAL_I2C_Mem_Write_IT(); HAL_I2C_Mem_Read_IT()
DMA传输非阻塞模式:
HAL_I2C_Master_Transmit_DMA(); HAL_I2C_Master_Receive_DMA(); HAL_I2C_Slave_Transmit_DMA(); HAL_I2C_Slave_Receive_DMA(); HAL_I2C_Mem_Write_DMA(); HAL_I2C_Mem_Read_DMA()
非阻塞模式下的回调函数:
HAL_I2C_MemTxCpltCallback(); HAL_I2C_MemRxCpltCallback(); HAL_I2C_MasterTxCpltCallback()
HAL_I2C_MasterRxCpltCallback(); HAL_I2C_SlaveTxCpltCallback(); HAL_I2C_SlaveRxCpltCallback(); HAL_I2C_ErrorCallback()
这部分可以参照USART中的函数进行理解。
上一篇:13-HAL库DMA系统总结
下一篇:15-HAL库之定时器学习
推荐阅读最新更新时间:2024-11-08 16:56
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LT1169 的参考设计
- LT3470ITS8 1.8V 降压转换器的典型应用电路
- LTC2260CUJ-12、12 位、105Msps 超低功耗 1.8V ADC 的典型应用
- FSA3000 两端口高速 MHL 交换机的典型移动 MHL 应用
- EVAL-ADUM5211EBZ,基于 ADuM5211 iCoupler 的评估板,150 mW isoPower
- DI-152 - 用于工业领域的3W、超宽范围输入电源
- 使用 ROHM Semiconductor 的 BD48L51G-TL 的参考设计
- LT3990HMSE-3.3 2.5V 降压转换器的典型应用
- CPLD-EPM240-STC8G1K08学习板
- LT1021DCN8-7 以 5V 电源工作在 5V 基准电压源的典型应用