1. 程式人生 > >14-HAL庫之I2C通訊

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中的函式進行理解。