板子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