根據AT24C02的 Datasheet 可知AT24C02有2K bit,即256B,分為32頁,每頁8個字節,結合數據手冊和原理圖可以得知,板載AT24C02的讀地址為0xA2
,寫地址為0xA3
:
#define AT24C02_ADDR_WRITE 0xA2
#define AT24C02_ADDR_READ 0xA3
- MSB(Most Significant Bit):即最高有效位,是二進制數中權重最大的位。在一個二進制數里,它位于最左邊,對數值大小的影響最大。例如,在二進制數?
1010
?中,最左邊的?1
?就是 MSB,它代表的權重是?23=8。 - LSB(Least Significant Bit):也就是最低有效位,是二進制數中權重最小的位。它處于二進制數的最右邊,對數值大小的影響最小。比如在二進制數?
1010
?中,最右邊的?0
?就是 LSB,它代表的權重是?20=1。
圖中展示的是 AT24C02(I2C 接口的 EEPROM 芯片)的 “字節寫” 操作時序,以下是對該時序的詳細解釋:
1. 起始信號(START)
? 作用:主設備通過拉低 SDA 線(在 SCL 為高電平時)發起通信,標志一次 I2C 傳輸的開始。
? 圖示:圖中 “SDA LINE” 波形的第一個跳變,由高變低,觸發起始條件。
2. 設備地址(DEVICE ADDRESS)
? 內容:7 位 AT24C02 設備地址(MSB 先傳輸) + 1 位讀寫控制位(R/W)。寫操作時,R/W = 0。
? 意義:主設備通過發送設備地址,選中總線上的 AT24C02 從設備,告知其即將進行寫操作。
3. 字地址(WORD ADDRESS)
? 內容:8 位地址(MSB 到 LSB 依次傳輸),用于指定 AT24C02 中要寫入數據的存儲單元位置。
? 作用:AT24C02 有 256 字節存儲空間,需通過字地址精準定位目標存儲單元。
4. 數據(DATA)
? 內容:主設備發送的 8 位數據(MSB 先,LSB 后),即實際寫入 AT24C02 的數據內容。
? 傳輸:數據跟隨在字地址之后,按 I2C 協議的字節傳輸格式發送。
5. 應答位(ACK)
? 機制:每傳輸完一個字節(設備地址、字地址、數據),接收方(AT24C02)需在第 9 個時鐘周期拉低 SDA 線,返回 ACK 信號,表示成功接收。
? 圖示:每個字節傳輸后標注的 “ACK”,體現 I2C 通信的應答確認機制。
6. 停止信號(STOP)
? 作用:主設備通過拉高 SDA 線(在 SCL 為高電平時)結束本次通信,釋放 I2C 總線。
? 圖示:圖中最后 SDA 線由低變高的跳變,標志字節寫操作完成。
完整流程總結
主設備先發送起始信號,接著發送含寫控制位的設備地址,等待 AT24C02 應答;再發送字地址(指定存儲位置),再次等待應答;最后發送數據字節,待 AT24C02 應答后,主設備發送停止信號,完成一次字節寫操作。整個過程嚴格遵循 I2C 協議的時序規范,確保數據準確寫入 AT24C02 的指定地址。
看原理圖? ?
擴展板
核心板引腳
STM32Cubemax?
寫入
/*** @brief AT24C02任意地址寫一個字節數據* @param addr —— 寫數據的地址(0-255)* @param dat —— 存放寫入數據的地址* @retval 成功 —— HAL_OK
*/
uint8_t At24c02_Write_Byte(uint16_t addr, uint8_t* dat)
{return HAL_I2C_Mem_Write(&hi2c1, AT24C02_ADDR_WRITE, addr, I2C_MEMADD_SIZE_8BIT, dat, 1, 0xFFFF);
}
讀
/*** @brief AT24C02任意地址讀一個字節數據* @param addr —— 讀數據的地址(0-255)* @param read_buf —— 存放讀取數據的地址* @retval 成功 —— HAL_OK
*/
uint8_t At24c02_Read_Byte(uint16_t addr, uint8_t* read_buf)
{return HAL_I2C_Mem_Read(&hi2c1, AT24C02_ADDR_READ, addr, I2C_MEMADD_SIZE_8BIT, read_buf, 1, 0xFFFF);
}
測試
uint8_t write_dat = 0xa5;uint8_t recv_buf = 0;if(HAL_OK == At24c02_Write_Byte(10,&write_dat)){printf("Write ok\n");}else{printf("Write fail\n");}HAL_Delay(50); //寫一次和讀一次之間需要短暫的延時if(HAL_OK == At24c02_Read_Byte(10,&recv_buf)){printf("Read ok, recv_buf = 0x%02X\n", recv_buf);}else{printf("Read fail\n");}
串口測試?
這款芯片的讀寫比較簡單 只需要配置好相關的協議就可以直接進行讀寫操作