提供了單片機外部存儲芯片EEPROM的底層讀寫的代碼,不足之處請指點
單片機源程序如下:
- // =============================== EEPROM 說明 ===============================//
- /*******************************************************************************
- The CAV24C64 is a 64.Kb CMOS Serial EEPROM device,
- internally organized as 8192 words of 8 bits each.
- It features a 32.byte page write buffer and supports the Standard
- (100 kHz) and Fast (400 kHz) I2C protocol.
- External address pins make it possible to address up to eight
- CAV24C64 devices on the same bus.
- *******************************************************************************/
- // Page Range:0x00 - 0xFF
- // Page Write Buffer range:0x00 - 0x01F
- // 寫數據和讀數據之間需要有5ms的延時
-
-
- #include "Common_Hdf_Address.h"
- #include STD_DEFS_H
- #include MAIN_H
- #include IO_H
- #include HW_GPT_COMMON_H
- #include EEPROM_H
- #include DBG_MAIN_H
- u8 bufWrite[32];
- u8 bufRead[32];
- // 函數名稱:set_sdaDir(u8 dir)
- // 函數說明:設置SDA數據線方向(利用普通IO實現IIC,需要手動設置數據線的方向)
- void set_sdaDir(u8 dir)
- {
- switch(dir)
- {
- case output: sdaDir |= 0x00C0; break;
- case input: sdaDir &= 0xFF7F; break;
- default:
- break;
- }
- }
- // 函數名稱:EEPROM_I2C_Start_v()
- // 函數說明:IIC start
- void EEPROM_I2C_Start_v()
- {
- FUN_HW_Time_Delayus(1);
- set_sdaDir(output); // 設置SDA數據線方向為輸出
- eepromSDA_OUT = 1; // 設置SDA為高電平
- eepromSCL = 1; // 設置SCL為高電平
- FUN_HW_Time_Delayus(1); // SDA和SCL至少保持高電平4.7us
- eepromSDA_OUT = 0; // 設置SDA為低電平,此時SCL為高電平,SDA由高電平變?yōu)榈碗娖,觸發(fā)開始條件
- FUN_HW_Time_Delayus(1); // SDA置低后,SCL至少保持4us的高電平時間
- eepromSCL = 0; // 設置SCL為低電平,防止數據誤入;I2C總線空閑時,SDA和SCL均為高電平
- }
- // 函數名稱:eeprom_I2C_Stop_v()
- // 函數說明:IIC stop
- void EEPROM_I2C_Stop_v()
- {
- FUN_HW_Time_Delayus(1);
- set_sdaDir(output); // 設置SDA數據線方向為輸出
- eepromSDA_OUT = 0; // 設置SDA為高電平
- eepromSCL = 1; // 設置SCL為高電平
- FUN_HW_Time_Delayus(1);
- eepromSDA_OUT = 1; // 設置SDA為高電平,此時SCL為高電平,SDA由低電平變?yōu)楦唠娖,觸發(fā)停止條件
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- }
- // 函數名稱:EEPROM_I2C_readASK()
- // 函數說明:I2C讀取ACK信號(主設備寫數據時使用)
- void EEPROM_I2C_readASK()
- {
- FUN_HW_Time_Delayus(1);
- set_sdaDir(input);
- eepromSCL = 0; // 設置SCL為低電平
- FUN_HW_Time_Delayus(1);
- eepromSCL = 1; // 設置SCL為高電平
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- }
- // 函數名稱:eeprom_I2C_sendASK()
- // 函數說明:I2C寫入ACK信號(主設備讀數據時使用)
- void EEPROM_I2C_sendASK()
- {
- FUN_HW_Time_Delayus(1);
- set_sdaDir(output); // 設置SDA數據線方向為輸出
- eepromSCL = 0; // 設置SCL為低電平
- eepromSDA_OUT = 0;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 1;
- }
- // 函數名稱:EEPROM_I2C_writeByte(u8 byte)
- // 函數說明:寫數據
- void EEPROM_I2C_writeByte(u8 byte)
- {
- u8 i;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- set_sdaDir(output); // 設置SDA數據線方向為輸出
- for (i = 0; i < 8; i ++)
- {
- if (byte & 0x80) eepromSDA_OUT = 1;
- else eepromSDA_OUT = 0;
- eepromSCL = 1;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- FUN_HW_Time_Delayus(1);
- byte <<= 1;
- }
- EEPROM_I2C_readASK();
- }
- // 函數名稱:EEPROM_I2C_readByte()
- // 函數說明:讀數據
- u8 EEPROM_I2C_readByte(u8 ask)
- {
- u8 i;
- u8 tempSDA_Read = 0;
- FUN_HW_Time_Delayus(1);
- set_sdaDir(input); // 設置SDA數據線方向為輸入
- for (i = 0; i < 8; i ++)
- {
- tempSDA_Read <<= 1;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 1; // 設置SCL為高電平
- FUN_HW_Time_Delayus(1);
- tempSDA_Read |= (u8)eepromSDA_IN;
- eepromSCL = 0; // 設置SCL為低電平
-
- }
- set_sdaDir(output);
- eepromSDA_OUT = ask;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 1;
- FUN_HW_Time_Delayus(1);
- eepromSCL = 0;
- eepromSDA_OUT = 1;
- return tempSDA_Read;
- }
- // 函數名稱:void EEPROM_I2C_write_oneByte(u8 addrH, u8 addrL, u8 One_ByteData)
- // 函數說明:寫單字節(jié)數據
- void EEPROM_I2C_write_oneByte(u8 addrH, u8 addrL, u8 One_ByteData)
- {
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- EEPROM_I2C_writeByte(One_ByteData);
- EEPROM_I2C_Stop_v();
- }
- // 函數名稱:u8 eeprom_I2C_read_oneByte(u8 addrH, u8 addrL)
- // 函數說明:讀單字節(jié)數據
- u8 EEPROM_I2C_read_oneByte(u8 addrH, u8 addrL)
- {
- u8 receiveData;
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- EEPROM_I2C_Stop_v();
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA1);
- receiveData = EEPROM_I2C_readByte(1);
- return (receiveData);
- }
- // 函數名稱:void EEPROM_I2C_write_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufWrite, u8 length)
- // 函數說明:寫多字節(jié)數據
- // pageAddr:頁地址;byteAddr:字節(jié)地址;buf:寫緩沖區(qū);length:字節(jié)長度
- void EEPROM_I2C_write_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufWrite, u8 length)
- {
- u8 i;
- u8 addrH = 0;
- u8 addrL = 0;
- addrH = (pageAddr >> 3);
- addrL = (pageAddr << 5);
- addrL |= byteAddr;
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- if(length > 32) length = 32;
- for (i = 0; i < length; i ++)
- {
- EEPROM_I2C_writeByte(bufWrite[i]);
- FUN_HW_Time_Delayus(1);
- }
- EEPROM_I2C_Stop_v();
-
- // p_tx[0] = (u8)(pageAddr);
- // p_tx[1] = (u8)(byteAddr);
- // p_tx[2] = (u8)(length);
- // p_tx[3] = (u8)(*bufWrite);
- // p_tx[4] = (u8)(*(bufWrite+1));
- // p_tx[5] = (u8)(*(bufWrite+2));
- // p_tx[6] = (u8)(*(bufWrite+3));
- // p_tx[7] = (u8)(*(bufWrite+4));
- // FUN_CAN_DBG_send_OBJ_i(21,p_tx);
- }
- // 函數名稱:EEPROM_I2C_read_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufRead, u8 length)
- // 函數說明:讀多字節(jié)數據
- // pageAddr:頁地址;byteAddr:字節(jié)地址;buf:讀緩沖區(qū);length:字節(jié)長度
- void EEPROM_I2C_read_mulByte(u8 pageAddr, u8 byteAddr, u8 *bufRead, u8 length)
- {
- u8 i;
- u8 addrH = 0;
- u8 addrL = 0;
- addrH = (pageAddr >> 3);
- addrL = (pageAddr << 5);
- addrL |= byteAddr;
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- EEPROM_I2C_Stop_v();
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA1);
- if(length > 32) length = 32;
- for (i = 0; i < length - 1; i ++)
- {
- bufRead[i] = (~ EEPROM_I2C_readByte(0));
- }
- bufRead[i] = (~ EEPROM_I2C_readByte(1));
- EEPROM_I2C_Stop_v();
- // p_tx[0] = (u8)(pageAddr);
- // p_tx[1] = (u8)(byteAddr);
- // p_tx[2] = (u8)(length);
- // p_tx[3] = (u8)(*bufRead);
- // p_tx[4] = (u8)(*(bufRead+1));
- // p_tx[5] = (u8)(*(bufRead+2));
- // p_tx[6] = (u8)(*(bufRead+3));
- // p_tx[7] = (u8)(*(bufRead+4));
- // FUN_CAN_DBG_send_OBJ_i(21,p_tx);
- }
- // 函數名稱:EEPROM_vEraseDataBlock(void)
- // 函數說明:擦除數據,一共256頁,從第0頁到第255頁,每頁32個字節(jié),從第0個字節(jié)到第31個字節(jié)
- // pageAddr: 頁地址; byteAddr: 字節(jié)地址; byteNum: 從byteAddr開始,擦除的字節(jié)數
- void EEPROM_vEraseDataBlock(u8 pageAddr, u8 byteAddr, u8 byteNum)
- {
- u8 i;
- u8 addrH = 0;
- u8 addrL = 0;
- addrH = (pageAddr >> 3);
- addrL = (pageAddr << 5);
- addrL |= byteAddr;
- EEPROM_I2C_Start_v();
- EEPROM_I2C_writeByte(0xA0);
- EEPROM_I2C_writeByte(addrH);
- EEPROM_I2C_writeByte(addrL);
- if(byteNum > 32) byteNum = 32;
- for (i = 0; i < byteNum; i ++)
- {
- EEPROM_I2C_writeByte(0xFF);
- FUN_HW_Time_Delayus(10);
- }
- EEPROM_I2C_Stop_v();
- }
復制代碼
所有資料51hei提供下載:
EEPROM——CAV24C64讀寫代碼.zip
(2.39 KB, 下載次數: 9)
2019-10-18 16:00 上傳
點擊文件名下載附件
EEPROM 下載積分: 黑幣 -5
|