在STM32上通過I2C接口(注意:在標準STM32庫中,I2C接口通常被寫為"I2C"而不是"IIC")與EEPROM芯片通信時,你需要遵循I2C通信協議,并使用STM32的HAL庫或標準外設庫(如果適用)中的函數。
下面是一個簡化的示例代碼,展示了如何使用STM32的HAL庫通過I2C接口與EEPROM(假設是24LC系列,通常起始地址是0xA0或0xA2,這取決于特定的EEPROM芯片和配置)進行通信。
首先,確保你已經正確配置了I2C接口,包括時鐘、引腳和中斷(如果需要)。
以下是一個簡化的示例,展示如何讀取和寫入EEPROM芯片:
#include "stm32f1xx_hal.h" // 或者你使用的STM32系列的頭文件 // 假設I2C句柄已經定義為hi2c1
extern I2C_HandleTypeDef hi2c1; // EEPROM的I2C地址(對于某些EEPROM,這可能是0xA0或0xA2,具體取決于A0/A1/A2引腳的狀態)
#define EEPROM_I2C_ADDRESS 0xA2 << 1 // 左移一位,因為I2C地址需要是7位的(最低位用于讀寫操作) // 寫入EEPROM的函數
HAL_StatusTypeDef EEPROM_WriteByte(uint16_t DevAddress, uint8_t MemAddress, uint8_t *pData) { HAL_StatusTypeDef status = HAL_OK; // 創建一個I2C_MemAddSize結構體來保存寫入的參數 I2C_MemTypeDef mem; mem.MemoryAddress = MemAddress; // EEPROM中的地址 mem.MemorySize = I2C_MEMADD_SIZE_8BIT; // 寫入8位數據 mem.Reg = I2C_REGISTER_MEM; // 我們正在寫入EEPROM的內存 mem.Data = pData; // 要寫入的數據的指針 mem.Timeout = HAL_MAX_DELAY; // 超時設置 mem.NewAddress = I2C_MEM_ADD_MODE_INC; // 每次傳輸后地址遞增 // 發送START條件,寫入EEPROM地址,寫入內存地址,寫入數據,發送STOP條件 status = HAL_I2C_Mem_Write(&hi2c1, DevAddress, (uint16_t)mem.MemoryAddress, I2C_MEMADD_SIZE_8BIT, mem.Data, 1, mem.Timeout); return status;
} // 從EEPROM讀取字節的函數
HAL_StatusTypeDef EEPROM_ReadByte(uint16_t DevAddress, uint8_t MemAddress, uint8_t *pData) { HAL_StatusTypeDef status = HAL_OK; // 創建一個I2C_MemAddSize結構體來保存讀取的參數 I2C_MemTypeDef mem; mem.MemoryAddress = MemAddress; // EEPROM中的地址 mem.MemorySize = I2C_MEMADD_SIZE_8BIT; // 讀取8位數據 mem.Reg = I2C_REGISTER_MEM; // 我們正在從EEPROM的內存讀取 mem.Data = pData; // 用于存儲讀取數據的緩沖區的指針 mem.Timeout = HAL_MAX_DELAY; // 超時設置 mem.NewAddress = I2C_MEM_ADD_MODE_NO_CHANGE; // 地址在讀取后保持不變 // 發送START條件,寫入EEPROM地址,寫入內存地址,讀取數據,發送STOP條件 status = HAL_I2C_Mem_Read(&hi2c1, DevAddress, (uint16_t)mem.MemoryAddress, I2C_MEMADD_SIZE_8BIT, mem.Data, 1, mem.Timeout); return status;
} // 示例用法:
int main(void) { // 初始化代碼(包括I2C和其他必要的硬件)... uint8_t writeData = 0xAB; uint8_t readData; // 寫入EEPROM if (EEPROM_WriteByte(EEPROM_I2C_ADDRESS, 0x00, &writeData) == HAL_OK) { // 寫入成功 } else { // 寫入失敗 } // 讀取EEPROM if (EEPROM_ReadByte(EEPROM_I2C_ADDRESS, 0x00, &readData) == HAL_OK) { // 讀取成功,現在readData