1. 程式人生 > >利用HAL庫硬體IIC驅動OLED

利用HAL庫硬體IIC驅動OLED

利用CubeMX生成工程文件就不用細說了,網上很多類似的教程.主要談一下自己將原來驅動OLED的庫例程 移植為HAL庫的驅動,本質上沒有多大的區別,只是幾個函式運用的問題.

  1.  利用CubeMX 選用I2C1,配置預設即可
  2. 生成工程之後,單獨建立oled.c  oled.h 檔案,在其中新增驅動程式碼,具體程式碼如下:
I2C_HandleTypeDef hi2c1;

void WriteCmd(unsigned char I2C_Command)//寫命令
{
//    uint8_t pData[1];
//    pData[0] = I2C_Command;
    uint8_t *pData;
    pData = &I2C_Command;
	HAL_I2C_Mem_Write(&hi2c1,OLED_ADDRESS,0x00,I2C_MEMADD_SIZE_8BIT,pData,1,100);
}

void WriteDat(unsigned char I2C_Data)//寫資料
{
//    uint8_t pData[1];
//    pData[0] = I2C_Data;
        uint8_t *pData;
    pData = &I2C_Data;
	HAL_I2C_Mem_Write(&hi2c1,OLED_ADDRESS,0x40,I2C_MEMADD_SIZE_8BIT,pData,1,100);
}

一般將這兩個函式修改之後,後面的驅動按照原商家提供的程式碼基本就沒什麼問題了,再就注意一下延時函式,需要呼叫HAL庫的延時函式HAL_Delay();

3. HAL_I2C_Mem_Write函式分析

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) 
函式原型看起來有點複雜,對比官方說明再仔細分析一下,發現也不難理解.

/**
  * @brief  Write an amount of data in blocking mode to a specific memory address
  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
  *                the configuration information for the specified I2C.
  * @param  DevAddress Target device address
  * @param  MemAddress Internal memory address
  * @param  MemAddSize Size of internal memory address
  * @param  pData Pointer to data buffer
  * @param  Size Amount of data to be sent
  * @param  Timeout Timeout duration
  * @retval HAL status
  */

I2C_HandleTypeDef *hi2c 定義你自己使用的具體哪個I2C 一般會自動生成 在main.c中的初始定義中可以找到

uint16_t DevAddress裝置的地址 即oled螢幕的地址,具體看廠家的說明,在給的驅動程式碼中應該是可以找到的, 類似

#define OLED_ADDRESS	0x78 //通過調整0R電阻,屏可以選擇0x78  0x7A兩個地址   預設為0x78
uint16_t MemAddress 裝置內部地址  可以參考原驅動程式碼

uint16_t MemAddSize 裝置內部地址編址方式,根據裝置決定是8位編址或者16位編址方式; 這個引數的填寫有兩種 I2C_MEMADD_SIZE_8BIT I2C_MEMADD_SIZE_16BIT,可以在庫程式碼中找到具體定義.

uint8_t *pData寫入的資料,因為定義為一個指標,在寫自己的驅動函式時需要略作修改,上面例子程式碼中兩種方式皆可

uint16_t Size寫入資料的位元組大小

uint32_t Timeout超時時間 可以靈活設定

其他驅動程式碼沒有什麼太大改變,HAL庫的使用主要是具體多看庫中函式的註釋,一般都有對函式的說明