【STM32】STM32CubeIDE HAL庫硬件IIC驅動OLED例程

板子G474RE。

IIC協議就不說了。模擬IIC也習慣了,看看官方的硬件IIC。

Master  features  主模式特性

I2C Speed Mode: IIC模式設置 快速模式和標準模式。實際上也就是速率的選擇。

I2C Clock Speed:I2C傳輸速率,默認爲100KHz

Slave  features  從模式特性

Clock No Stretch Mode: 時鐘沒有擴展模式

Primary Address Length selection: 從設備地址長度 設置從設備的地址是7bit還是10bit 大部分爲7bit

Primary slave address:  從設備初始地址

Dual Address Acknowledged: 雙地址確認

暫時瞭解1,2,3,4即可。默認配置

在xxx_hal_i2c.h文件中

/******* Blocking mode: Polling */
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);

重點: 

HAL_I2C_Mem_Write(&hi2c3,OLED_ADDRESS,0x00,I2C_MEMADD_SIZE_8BIT,pData,1,100);

*hi2c: I2C設備號指針,設置使用的是那個IIC 

DevAddress: 從設備地址 從設備的IIC地址 例E2PROM的設備地址 0xA0

MemAddress: 從機寄存器地址 ,每寫入一個字節數據,地址就會自動+1

MemAddSize: 從機寄存器地址字節長度 8位或16位

寫入數據的字節類型 8位還是16位
I2C_MEMADD_SIZE_8BIT
I2C_MEMADD_SIZE_16BIT

*pData:所要傳輸的數據

Size:參數爲傳輸數據的大小

Timeout:參數爲操作超時時間 

如何修改:

修改兩個函數:

void Write_IIC_Command(unsigned char I2C_Command)//寫命令

void Write_IIC_Data(unsigned char IIC_Data)//寫數據

void Write_IIC_Command(unsigned char I2C_Command)//寫命令
{

    uint8_t *pData;
    pData = &I2C_Command;
	HAL_I2C_Mem_Write(&hi2c3,OLED_ADDRESS,0x00,I2C_MEMADD_SIZE_8BIT,pData,1,100);
}

void Write_IIC_Data(unsigned char IIC_Data)//寫數據
{

    uint8_t *pData;
    pData = &IIC_Data;
	HAL_I2C_Mem_Write(&hi2c3,OLED_ADDRESS,0x40,I2C_MEMADD_SIZE_8BIT,pData,1,100);
}

 

/*
 * 第1個參數爲I2C操作句柄
   第2個參數爲從機設備地址
   第3個參數爲從機寄存器地址
   第4個參數爲從機寄存器地址長度
   第5個參數爲發送的數據
   第6個參數爲傳輸數據的大小
   第7個參數爲操作超時時間   */

注意:這個不太常用,可以瞭解。簡單認爲HAL_I2C_Mem_Write一次發送=兩次 HAL_I2C_Master_Transmit發送(一次設備地址,一次數據地址)。

HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
如果只往某個外設中寫數據,則用Master_Transmit。 
如果是外設裏面還有子地址,例如我們的E2PROM,有設備地址,還有每個數據的寄存器存儲地址,
則用Mem_Write。
Mem_Write是2個地址,Master_Transmit只有從機地址。

工程代碼:

鏈接:https://pan.baidu.com/s/1gw4TVz6t0tJwapB6iEmbJw 
提取碼:bqdk 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章