EEPROM可以隨機訪問和修改其中的任何一個字節,可以往每個bit中寫入0或者1,掉電后數據不丟失,可以保存100年,可以擦寫100w次。具有較高的可靠性,但是電路復雜/成本也高。因此目前的EEPROM都是幾十千字節到幾百千字節的,絕少有超過512K的,常用來保存用戶數據,運行過程中可以改變。
下面在MSP430平臺下以AT24C02為例說明該類可擦除ROM的使用。AT24C02的存儲容量為2K bits,內容分成32頁,每頁8 bytes,共256 bytes。
AT24C02對外以I2C總線形式傳輸數據,外觀如下圖所示:
A0、A1和A2三個引腳作尋址用;SDA和SCL即I2C總線的數據與時鐘引腳;WP作寫保護用,即WP在保持高電平時,MCU對AT24C02 的讀寫操作無效;VCC和GND分別接電源和接地。
MCU在掛載多片AT24C02時,其器件地址由8位構成,除A0、A1和A2三位外,其他位都被鎖定為如下所示:
最低位為R/W,進行讀操作時,該位 = 1,寫操作時,該位 = 0。地址寫入正確時,AT24C02將會應答以”0”。
AT24C02的讀寫遵循I2C總線的相關規范,所以有傳輸的開始條件和停止條件。每一次正常的讀寫均以開始條件開始,停止條件結束,這兩者的時序如下圖所示:
其軟件模擬的實現為:
void start(void)
{
SCL_H;
SDA_H;
_NOP();
SDA_L;
_NOP();
SCL_L;
_NOP();
}
void stop(void)
{
SDA_L;
_NOP();
SCL_H;
_NOP();
SDA_H;
_NOP();
}
SCL_H、SDA_H、SDA_L和SCL_L均為宏定義,分別表示MCU向AT24C02相應引腳輸出高電平和低電平。
AT24C02的寫操作分兩種模式,分別為字節寫入和頁寫入兩種。
1、字節寫入
該寫操作需要以MCU寫入開始條件開始,繼以器件地址,收到AT24C02的應答后繼續寫入要進行寫操作的字地址(即要將數據寫入該AT24C02的什么位置),收到應答后才正式寫入一個字節的數據,收到應答后寫入停止條件,一個完整的字節寫入才算完成。
其軟件模擬的實現為:
uchar Write_1Byte(uchar wdata,uchar dataaddress)
{
start();
write1byte(deviceaddress);
if(check())
write1byte(dataaddress);
else
return 0;
if(check())
write1byte(wdata);
else
return 0;
if(check()) stop();
else return 0;
delay_10ms(); //等待EEPROM完成內部寫入
return 1;
}
delay_10ms()是因為AT24C02的每兩次寫操作之間存在一個寫入時間周期tWR,其最大值為5 ms。check()檢查AT24C02的應答操作,收到AT24C02回復的0,則應答正確,其軟件模擬實現為:
uchar check(void)
{
uchar slaveack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_in;
_NOP(); _NOP();
slaveack = SDA_val; //讀入SDA數值
SCL_L;
_NOP();
SDA_out;
if(slaveack) return FALSE;
else return TRUE;
}
SDA_in和SDA_out分別表示MCU(MSP430)連接AT24C02的I/O引腳方向改為輸入或輸出,此處SDA_in的作用是為MCU接收AT24C02的應答信號做準備,接收完成后改回SDA_out。SDA_val = P2IN&BIT5,P2.5連接AT24C02的SDA引腳,接收應答信號。
write1byte()向I2C總線寫一個字節的數據,其軟件模擬實現為:
void write1byte(uchar wdata)
{
uchar i;
for(i = 8;i > 0;i--)
{
if(wdata & 0x80) write1();
else write0();
wdata <<= 1;
}
SDA_H;
_NOP();
}
write1()向I2C總線寫一位“1”的數據,其軟件模擬實現為:
void write1(void)
{
SDA_H;
_NOP();
SCL_H;
_NOP();
SCL_L;
_NOP();
}
write0()向I2C總線寫一位“0”的數據,其軟件模擬實現為:
void write0(void)
{
SDA_L;
_NOP();
SCL_H;
_NOP();
SCL_L;
_NOP();
}
2、頁寫入
AT24C02可以實現8位的頁寫入操作。頁寫入的形式大體和字節寫入類似,只是在MCU寫入第一個字節的數據后將會繼續寫入第二個數據,而不會像字節寫入一樣寫入停止條件。如果寫入AT24C02的數據超過8位,超過的數據將會覆蓋已被寫入的部分。
其軟件模擬的實現為:
uchar Write_NByte(uchar * outbuf,uchar n,uint dataaddress)
{
uchar flag,dataaddressl,dataaddressh;
dataaddressl = dataaddress;
dataaddressh = dataaddress>>8;
start();
write1byte(deviceaddress); //寫入器件地址
if(check() == 1)
write1byte(dataaddressh); //寫入數據字地址
else
return 0;
if(check())
write1byte(dataaddressl);
else
return 0;
if(check())
flag=writeNbyte(outbuf,n);
else
return 0;
delay_10ms(); //等待EEPROM完成內部寫入
if(flag)
return 1;
else
return 0;
}
writeNbyte()向I2C總線寫N個字節(對于AT24C02,N = 8)的數據,其軟件模擬實現為:
uchar writeNbyte(uchar * outbuffer,uchar n)
{
uchar i;
for(i = 0;i < n;i++)
{
write1byte(* outbuffer);
if(check())
{
outbuffer++;
}
else
{
stop();
return FALSE;
}
}
stop();
return TRUE;
}
AT24C02的讀操作分三種模式,分別為當前地址讀取、隨機讀取和順序讀取。
1、當前地址讀取
上一次讀寫操作完成后,數據地址計數器加1,并停留在當前位置。這一位置只要不掉電就會一直有效。當R/W = 1時,就可以將當前地址位置的數據讀出。
其軟件模擬的實現為:
uchar Read_1Byte_currentaddress(void)
{
uchar temp;
start();
write1byte((deviceaddress|0x01));
if(check())
temp = read1byte();
else
return 0;
mnack();
stop();
return temp;
}
uchar Read_NByte_currentaddress(uchar * readbuf,uchar n)
{
start();
write1byte((deviceaddress|0x01));
if(check())
readNbyte(readbuf,n);
else
return 0;
return 1;
}
read1byte()從I2C總線讀取一個字節,其軟件模擬的實現為:
uchar read1byte(void)
{
uchar rdata = 0x00,i;
uchar flag;
for(i = 0;i < 8;i++)
{
SDA_H;
_NOP();
SCL_H;
SDA_in;
_NOP();
flag = SDA_val;
rdata <<= 1;
if(flag) rdata |= 0x01;
SDA_out;
SCL_L;
_NOP();
}
return rdata;
}
readNbyte()從I2C總線讀取一個字節,其軟件模擬的實現為:
void readNbyte(uchar * inbuffer,uchar n)
{
uchar i;
for(i = 0;i < n;i++)
{
inbuffer[i] = read1byte();
if(i < (n-1)) mack();
else mnack();
}
stop();
}
mack()完成I2C的MCU應答操作,其軟件模擬的實現為:
void mack(void)
{
SDA_L;
_NOP(); _NOP();
SCL_H;
_NOP();
SCL_L;
_NOP();_NOP();
SDA_H;
_NOP();
}
mnack()完成I2C的MCU無應答操作,其軟件模擬的實現為:
void mnack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP();
SCL_L;
_NOP(); _NOP();
SDA_L;
_NOP();
}
2、隨機讀取
從AT24C02的指定地址讀取1個字節的數據。隨機讀取的操作先發送一個寫操作來騙過AT24C02器件,使其內部的數據地址值修改,但是發送完畢數據地址后并不發送數據,而是發送一個開始信號,此時AT24C02中的數據地址值已經被修改了,然后通過“當前地址讀取”去讀取此地址上的數據。如下圖所示:
其軟件模擬的實現為:
uchar Read_1Byte_Randomaddress(unsigned int dataaddress)
{
uchar temp,dataaddressh,dataaddressl;
dataaddressl = dataaddress;
dataaddressh = dataaddress>>8;
start();
write1byte(deviceaddress);
if(check())
write1byte(dataaddressh);
else
return 0;
if(check())
write1byte(dataaddressl);
else
return 0;
if(check())
{
start();
write1byte((deviceaddress|0x01));
}
else
return 0;
if(check())
上一篇:MSP430F249EEprom讀寫
下一篇:調試MFRC522時遇到的問題記錄
推薦閱讀
史海拾趣
DEM Manufacturing一直注重技術創新和產品升級。在合并后的幾年里,公司投入大量資源用于研發,推出了一系列具有創新性的電子產品。這些產品不僅滿足了市場的多樣化需求,還為公司贏得了良好的口碑和廣泛的客戶基礎。
近年來,隨著科技的不斷進步和市場的不斷變化,驊訊公司也積極尋求創新轉型和拓展市場。在保持其在音頻芯片設計領域領先地位的同時,驊訊還積極開發新的業務領域,如軟件研發、數字內容供應等。這些創新舉措不僅為驊訊帶來了新的增長點,也為其在電子行業中保持領先地位提供了有力支持。
以上是關于驊訊(Cmedia)公司在電子行業中發展起來的相關故事簡要概述。這些故事展示了驊訊如何憑借其技術實力和市場洞察力在競爭激烈的電子行業中不斷發展壯大。
面對日新月異的市場需求和不斷變化的技術趨勢,Concurrent Logic始終堅持創新驅動的發展戰略。他們投入大量資源在研發上,不斷探索新的并行計算技術和應用。通過持續的創新和市場的不斷拓展,Concurrent Logic逐漸鞏固了其在電子行業中的領導地位,成為了并行計算領域的一面旗幟。他們的產品被廣泛應用于云計算、大數據分析、人工智能等多個前沿領域,為整個電子行業的發展注入了新的活力。
以上是關于電子行業里Concurrent Logic公司發展起來的相關故事,每個故事都反映了該公司在不同發展階段所面臨的關鍵節點和決策。
為了確保產品質量和滿足客戶需求,Fair Rite引入了嚴格的質量管理體系,并通過了ISO/TS 16949認證。此外,公司還積極拓展國際市場,在美國、中國等地建立了生產基地和銷售網絡。通過全球布局和本土化策略,Fair Rite為全球客戶提供高品質、高性能的電子元器件。
在附件中Q1使用P溝道的MOS管,主要是為了防止電池反接。 利用mos管的寄生二極管,造成VGS大于柵源閾值而導通。 電流流向是由MOS管的D流向S,對于PMOS管一般的電流都是從S流向D, 對于襯底電平和源極連一起的PMOS管來說,一般不建議這么用吧。 對 ...… 查看全部問答∨ |
|
一個小問題困惑了我,求高手指點(反映打不開電路圖,再發一次) 大家好 我是想從手機的耳機孔取信號,來推動一個單穩態電路 (看不到電路圖的話,附件中也有) 從左往右把門電路分別稱為門1、門2、門3、門4. 門3、門4.組成的單穩態電路,很成功 ,用手指碰門2的輸入端可使單穩態翻轉。 門1組成 ...… 查看全部問答∨ |
|
高薪聘Windows Mobile 底層驅動開發工程師(深圳南山) 高薪聘Windows Mobile 底層驅動開發工程師 公司網址:www.bitland.com.cn ,偶QQ549503575 ;E-mail:yangsq@bitland.com.cn 有興趣的可以加我細聊 待 ...… 查看全部問答∨ |
--有如下語句: ... ... GENERIC(CONSTANT BUS_WIDTH: INTEGER := 15); --總線寬度定義 ... ... po1: INOUT STD_LOGIC_VECTOR(BUS_WIDTH DOWNTO 0); ... ... po1 <= "1111111111 ...… 查看全部問答∨ |
請問:如何在用C語言寫的程序中加入CPL和EFLAGS這兩個關鍵字 編譯的時候總是說CPL和EFLAGS是undeclared identifier.是不是應該Link什么庫? 謝謝!… 查看全部問答∨ |
|
本帖最后由 ddllxxrr 于 2016-1-7 16:55 編輯 大四了,倒騰了三年,這塊NXP幾乎還是新的,低價出了吧,有愿意的可以聊聊.QQ:990678775 資料不像ST那么多,但功能非常強大,源碼啥的都有,資料比較齊。 概述 EK-LPC178 8 是萬利電子有限公司為 ...… 查看全部問答∨ |
配置ADC10DTC進行雙通道AD轉換時數據只能采樣n次,傳送一次。請問如何配置DTC才能實現每次按鍵輸入控制時,AD都能進行采樣n次,并且都能通過DTC傳送??… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 有獎直播 | 德州儀器基于 Arm 的 AM62 處理器簡介
- 最后一周:免費獲取Pasternack《RF產品選型指南》2018 印刷版!
- 有獎直播|如何借助Mentor Xpedition AMS對汽車CAN總線進行仿真優化分析?
- 如何用3個關鍵步驟,來確保下一代設計安全性,深入解讀嵌入式設備DeepCover加密控制器,看視頻答題贏好禮!
- 好書共讀:《硬件設計指南:從器件認知到手機基帶設計》
- 【預約有禮】全球測量圈大咖直播:驗證5G核心網,確保最佳性能
- 中秋“國宴“ :拍攝板卡上的國產元器件,抽開心小禮品
- Keysight教你如何提高測試精度,答對問題還有禮品相送,速速參與!
- TI 培訓推薦有禮活動
- 【分享成長,10月有獎】EEWORLD優秀主題/回復第15期活動開始啦?。?!