神舟IV學(xué)習(xí)筆記(六)I2C接口EEPROM-軟硬件實(shí)現(xiàn)
EEPROM又稱為電可擦可編程只讀存儲(chǔ)器,掉電后數(shù)據(jù)不丟失。廣泛用于少量數(shù)據(jù)的保存,一些增強(qiáng)型51單片機(jī)和AVR都有芯片內(nèi)部集成EEPROM。開(kāi)發(fā)板使用的是I2C接口ATMEL的24C02芯片,芯片容量是2Kbit,也就是256字節(jié)。硬件連接如圖所示,與STM32芯片上的I2C1硬件接口相連。
I2C的時(shí)序我這里就不介紹了,大家可以上網(wǎng)查查。I2C最大的優(yōu)點(diǎn)就是有硬件地址,可以通過(guò)不同的硬件地址,掛載不同功能的I2C芯片。缺點(diǎn)就是速度慢,我們常使用到400kbps。
一硬件實(shí)現(xiàn)
STM32官方給的范例中給出了兩個(gè)封裝好的文件:I2C_EE.C和I2C_EE.H
給了這樣幾個(gè)函數(shù)
void I2C_EE_Init(void);
//I2C端口和I2C模塊初始化
void I2C_EE_ByteWrite(uint8_t* pBuffer, uint8_t WriteAddr);
//單個(gè)字節(jié)寫(xiě)入
void I2C_EE_PageWrite(uint8_t* pBuffer, uint8_t WriteAddr, uint8_t NumByteToWrite);
//頁(yè)寫(xiě),這款24C02能夠支持8個(gè)字節(jié)同時(shí)寫(xiě),能夠提高寫(xiě)入時(shí)間。其他的EEPROM比如24C04/08/16支持16字節(jié)每頁(yè),24C32/64支持32字節(jié)每頁(yè)
void I2C_EE_BufferWrite(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite);
//緩存寫(xiě)入,會(huì)調(diào)用上面兩個(gè)子函數(shù),根據(jù)當(dāng)前的位置和寫(xiě)入的大小,調(diào)用是字節(jié)寫(xiě)還是頁(yè)寫(xiě)
void I2C_EE_BufferRead(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead);
//緩存讀,和上面類似
void I2C_EE_WaitEepromStandbyState(void);
//EEPROM內(nèi)部也有編程時(shí)間,使用要等到內(nèi)部完成才能進(jìn)行下一個(gè)步驟。
需要注意的是:官方這兩個(gè)文件有點(diǎn)BUG,有時(shí)候會(huì)卡在讀文件的時(shí)候,需要做些修改。二是24C02總共有256頁(yè),也就是0X00到0XFF。
二軟件實(shí)現(xiàn)
最后說(shuō)明下,我在使用STM32103VCT6的時(shí)候發(fā)現(xiàn),硬件I2C有點(diǎn)問(wèn)題。所以這里還用軟件模擬I2C的功能實(shí)現(xiàn)同樣的功能。我提供兩個(gè)文件IIC_SOFT.C和IIC_SOFT.H文件。里面的函數(shù)為
void I2C_Configuration(void);
bool I2C_Write(u8 address,u8 data);
bool I2C_Writes(u8 *buff,u8 address,u8 length);
//bool I2C_Writes(u8 address,u8 *buff,u8 length);//只能寫(xiě)一頁(yè)的內(nèi)容
void I2C_BufferWrite(u8* pBuffer, u8 WriteAddr, u16 NumByteToWrite);
//仿照I2C_EE寫(xiě)的,數(shù)據(jù)不受限制
u8 I2C_Read(u8 address);
bool I2C_Reads(u8 address,u8 *buff,u8 length);