14-HAL庫之I2C通訊
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中的函式進行理解。