點擊上方“嵌入式從0到1”,選擇“置頂/星標公眾號”
干貨福利,第一時間送達!
“202007每月一練” 的板子上還有一個24C02芯片沒有寫教程,今天介紹一下24C02這個芯片的驅動方法。
有的時候我們在程序中會改變一些參數的值,我們希望這些參數可以固化,掉電重啟之后仍舊能夠使用最新的值,這種需求,我們就可以使用E2PROM來實現。
24CXX屬于串行E2PROM, 是基于I2C總線的存儲器件,遵循二線制協議,I2C總線上可以外掛多個器件,每個器件對應不同的地址,通過地址將不同器件進行分開,保證不同芯片之間數據傳輸的獨立性。
由于其具有接口方便,體積小,數據掉電不丟失等特點,在儀器儀表及工業自動化控制中得到大量的應用。
24C02的應用場景:
存儲硬件的默認參數,這樣開機上電之后讀取這些參數,就可以按照默認參數運行了,比如存儲PID自整定之后的參數; 保存計費、計量的一些應用的余額; 類似血壓計、血糖儀之類保存一定次數的檢測結果,實現歷史回溯功能。
24CXX系列E2PROM為I2C總線的掉電存儲數據芯片。對于I2C總線的介紹可以參考下面網文:
I2C總線主要注意以下幾點:
數據有效性要求

在輸入數據時,當SCL是高電平時,SDA上的信號必須保持不變;只有SCL上的時鐘信號為低電平時,SDA上的信號才能改變。
數據的開始和結束條件

SDA、SCL默認為高電平,表示總線處于空閑狀態。
數據輸入的開始條件是SCL為高電平時,SDA由高變低;
結束條件是SCL為高電平時,SDA由低電平變為高電平,即SDA出現一個上升沿的跳變,即為終止信號。
I2C的應答信號ACK

數據傳輸帶有應答信號ACK,在傳輸數據的過程中,在時鐘線SCL的第九個脈沖時,從機芯片內部會產生一個應答信號ACK將SDA管腳拉低。
引腳定義

引腳 | 功能描述 |
---|---|
A0-A2 | 器件地址定義引腳,通過高低電平對應的二進制代表不同的地址 |
SDA | 串行數據 |
SCL | 串行時鐘輸入 |
WP | 寫保護,接地:可讀可寫; 接Vcc只讀,即寫保護 |
GND | Ground |
Vcc | Power Supply |
24C02模塊的原理圖

本文對應實例,CON1跳線短接,24C02的地址為0,故24C02的寫地址為0xA0,讀地址為0xA1。
24C02,尾數02代表著內部有256*8(2K bits)空間。
上拉電阻必需有,否則可能無法對24C02進行正確讀寫。
24C02器件操作流程
單字節寫

單字節寫流程
在字節寫模式下,主器件發送起始命令和從器件地址信息、此時R/W位置0(寫地址)發給從器件,在從器件產生應答信號后,主器件發送24C02的地址信息,然后等待從器件返回的另一個應答信號后,再發送數據到24C02,然后再接收一次Ack應答信號后,主芯片產生一個停止信號,從器件收到停止信號后,開始內部數據的擦寫,在內部擦寫過程中,24C02不再應答主器件的任何請求,從而完成整個單字節的寫流程。
注: 當上一個數據寫完之后,即發送停止信號之后,需延時至少10ms以上,才能再發送下一次寫操作的起始信號。
讀操作

1. 單字節讀
讀操作允許主器件對24C02的任意字節進行讀操作。主器件首先通過發送起始信號、從器件地址和寫操作(寫地址)的標志位0。
在從器件應答之后,主器件發送目標地址,并等待返回應答信號。
主器件重新發送起始信號和從器件地址,此時R/W位置1(讀操作,讀數據),從器件響應應答信號,然后主器件獲取一個8位數據字節,主器件不用發送應答信號但需要產生一個停止信號,即完成單字節讀過程。
2. 多字節連續讀
在從機給主機發送完一個8位字節數據后,主器件產生一個應答信號來響應,告訴從機主器件請求更多的數據,對應每個主機產生的應答信號,從機將發送一個8位數據字節。當主器件不發送應答信號而發送停止位時結束操作。

const u8 TEXT_Buffer[]={"0123456789ABCDEF"};
// 寫入16個字節數據
AT24CXX_Write(0,(u8*)TEXT_Buffer,SIZE);
memset(arrDataTemp, 0, sizeof(arrDataTemp));
// 讀取280個字節的數據
AT24CXX_Read(0,arrDataTemp,280);
// 將讀取到的數據串口打印輸出
USART_OUT(arrDataTemp,280);
上面代碼執行,輸出結果如下所示:

從上面截圖,我們可以看出來,兩個紅色圈選部分的內容是一樣的,即當讀取的字節數超過N(對于24C02,N=255),讀取的數據指針將返回存儲空間的前面,從頭往后輸出剩余字節。
出現這樣的原因主要是我們在讀取函數中,發送地址的時候,將讀取地址對存儲空間大小取余了,所以又從頭開始輸出剩余字節了。
IIC_Send_Byte(ReadAddr%256);
紫色的55,就是程序初始化的時候,檢查24C02芯片是否存在時,AT24CXX_Check()函數中寫入的數據:
while(AT24CXX_Check()) //檢測24C02是否存在
{
printf("24C02 Check Failed!\r\n");
delay_ms(500);
printf("Please Check! \r\n");
delay_ms(500);
}
資料獲取

代碼工程中有兩個文件,其中myiic為I2C總線相關操作函數所在文件,24cxx為24C02操作函數所在文件。
微信公眾號后臺回復“24C02”,可以下載本文對應的工程源碼。
注:
代碼工程使用的Keil版本為:V5.20
我用的PCB設計軟件版本為:Altium Designer 14.2
如果沒有特殊說明,軟件環境都為以上兩個版本。
有問題可以加我微信:
chengxuyuanxiaoha(程序員小哈的全拼),
我可以拉你進技術交流群,有問題隨時交流。


傳統美德不能丟,
偷偷摸摸請點贊,
明目張膽請在看。