|
分享該例程是因?yàn)殡m然網(wǎng)上已經(jīng)有很多關(guān)于at24c芯片的讀寫程序,可是我在不停查資料的情況下還是用了十天時(shí)間才把程序調(diào)通。查到的每個(gè)資料都對(duì)我有幫助,但仍不夠用。考慮到其它新人或者會(huì)遇到同樣的情況,決定把程序分享出來(lái),希望對(duì)初學(xué)者有所幫助。
關(guān)于芯片的接法,只說(shuō)三點(diǎn),一個(gè)是寫保護(hù)口wp,可以接在一個(gè)IO口上,寫芯片前要拉低,如果不希望芯片內(nèi)容被改變,就拉高。第二個(gè)是A1腳,也就是芯片的2腳。這是器件的地址選擇腳,可以接VCC或地,對(duì)應(yīng)器件地址不同,我的程序中是直接接地。有資料說(shuō)該腳懸空與接地等效,我偷懶就沒(méi)接。結(jié)果不穩(wěn)定。所以最后還是接地了。第三是SCL與SDA線應(yīng)接上拉電阻。我偷懶沒(méi)接。把stc32g12k128內(nèi)置的上拉電阻打開(kāi)了,語(yǔ)句是P1PU=0x30;
本例程提供了四個(gè)讀寫at24c1024的函數(shù),下面分別介紹:
一、頁(yè)寫函數(shù)
void Page_Write(unsigned char addr,unsigned char SLAW) /* WordAddress,First Data Address,Byte lenth */
功能:向at24c1024寫入一頁(yè)數(shù)據(jù)
參數(shù)1:SLAW-器件地址加頁(yè)地址首位(P0);在A1腳接地時(shí),常用的是兩個(gè)值,0xa0和0xa2,分別表示芯片的前256頁(yè)和后256頁(yè)
參數(shù)2:addr-器件的頁(yè)地址,與參數(shù)1共同決定數(shù)據(jù)寫入的位置,取值0-255間.
這個(gè)函數(shù)很簡(jiǎn)潔好用,只是它在寫入時(shí)要占用最前面的兩個(gè)字節(jié),分別寫入的是上述兩個(gè)參數(shù)值。在寫入相對(duì)獨(dú)立的數(shù)據(jù),很方便,但寫入大批量數(shù)據(jù)時(shí),因每頁(yè)插入了兩個(gè)字節(jié)。所以讀出時(shí)多了點(diǎn)麻煩。
這個(gè)函數(shù)還有一個(gè)優(yōu)點(diǎn),是使用了IIC-DMA功能,運(yùn)行時(shí)占用mcu時(shí)間少。有利提高mcu使用效率。
二、隨機(jī)寫函數(shù)
void WriteNbyte(unsigned int addr, unsigned char *p, unsigned int number,unsigned char SLAW) //
功能:向at24c1024指定地址寫入數(shù)據(jù)。
參數(shù)1:SLAW-與上一個(gè)函數(shù)相同,器件地址加頁(yè)地址首位(P0);在A1腳接地時(shí),常用的是兩個(gè)值,0xa0和0xa2,分別表示芯片的前256頁(yè)和后256頁(yè)
參數(shù)2:addr-這是個(gè)16位地址,高位是頁(yè)地址,與前面的相同,低位是字節(jié)地址。這使得該函數(shù)能在任意位置寫入內(nèi)容。靈活方便。
參數(shù)3:number-寫入字節(jié)數(shù),如果前面的字節(jié)地址是0的話,number最大可以是256.如果字節(jié)地址不是0,則number一般設(shè)的小與256,例字節(jié)地址是0x09(addr的低位),則number最大可以是246,如果超過(guò)這個(gè)數(shù)值,則地址到255后,寫入的數(shù)據(jù)不是依次后延存儲(chǔ),而是反回本頁(yè)地址0處開(kāi)始存放。并依次向后存儲(chǔ)。這不方便提取,也容易覆蓋其它數(shù)據(jù)。(就是說(shuō)芯片的地址指針不會(huì)自動(dòng)跨頁(yè))
參數(shù)4:p-這是緩沖區(qū)地址,在本例程中。寫數(shù)據(jù)緩沖區(qū)使用的DmaTxBuffer[256],大了沒(méi)用。在前面的頁(yè)寫函數(shù)中也需要用到這個(gè)緩沖區(qū),只是默認(rèn)是它。沒(méi)有當(dāng)參數(shù)寫出來(lái)。
三、隨機(jī)讀函數(shù)
void ReadNbyte(unsigned int addr, unsigned char *p, unsigned int number,unsigned char SLAW)
功能:讀取指定地址處的數(shù)據(jù)
參數(shù)1:SLAW-與前面的函數(shù)相同,表示芯片地址和區(qū)地址(分辨前256和后156頁(yè))
參數(shù)2:addr-字節(jié)地址,16位的,與SLAW里的p0值共同決定要讀的字節(jié)的具體地址
參數(shù)3:number-本次讀取的字節(jié)數(shù),在讀取數(shù)據(jù)時(shí)芯片的內(nèi)部地址指針能不能自動(dòng)跨頁(yè)我沒(méi)有試過(guò)。權(quán)當(dāng)不能跨頁(yè)使用,就是說(shuō)每次調(diào)用讀函數(shù),讀取的數(shù)據(jù)不超過(guò)256,原理與寫函數(shù)類似。
參數(shù)4:p-讀緩沖區(qū),本例程中用DmaRxBuffer[6400],雖然每次調(diào)用讀函數(shù),讀取的數(shù)據(jù)不超過(guò)256字節(jié),但在循環(huán)語(yǔ)句調(diào)用讀函數(shù)時(shí),如果緩沖區(qū)指針不復(fù)位,則可以繼續(xù)依次向后存放讀出的數(shù)據(jù)。所以我用了一個(gè)很大的緩沖區(qū)。減少向屏傳送數(shù)據(jù)的次數(shù)。
四、使用IIC-DMA的讀函數(shù)
void read_iicbydma(unsigned int addr,unsigned int number,unsigned char *p,unsigned char SLAW)
這個(gè)函數(shù)的功能與參數(shù)與上一個(gè)相同,不做重復(fù)說(shuō)明了。寫這個(gè)函數(shù)是因?yàn)樗褂昧薎IC-DMA功能,因而工作時(shí)對(duì)mcu的占用少。提高mcu使用效能。
前面介紹的四個(gè)函數(shù),兩個(gè)基本讀寫,兩個(gè)采用了IIC-DMA功能讀寫。比較一下發(fā)現(xiàn)論單任務(wù)完成速度,基本函數(shù)快些,但占用mcu時(shí)間多。
為了展示前面四個(gè)函數(shù)的用法,又寫了兩個(gè)函數(shù),一個(gè)往at24c1024里寫入批量圖像數(shù)據(jù),一個(gè)從at24c1024里讀出數(shù)據(jù)并送屏幕顯示出來(lái)
void transfer_image(unsigned int addr,unsigned char *p,unsigned char number_page,unsigned char SLAW)//向芯片送圖像數(shù)據(jù)number_page是頁(yè)數(shù)
void disp_at24c1024(unsigned int x,unsigned int y,unsigned int addr,unsigned char number_page,unsigned char SLAW)//讀出數(shù)據(jù)并送屏顯示
函數(shù)中x,y表示在屏上顯示的起始位置,我把屏分成四份,用四個(gè)數(shù)組文件(pic01.h;pic02.h;pic03.h;pic04.h)放圖像數(shù)據(jù),顯示屏為320x240。單個(gè)圖的尺寸為160x100。這兩個(gè)函數(shù)屬于普通編程,不多說(shuō)了。
在規(guī)劃at24c1024空間時(shí),我在前區(qū)存入兩個(gè)圖像,其SLAW值為0xa0;在后區(qū)存入兩個(gè)圖像文件,其SLAW值為0xa2.在例程中可以注意一下。
這里分區(qū)存放數(shù)據(jù)。沒(méi)有選擇連續(xù)存放,是考慮編程簡(jiǎn)單些。一個(gè)不常用的程序,寫得復(fù)雜了沒(méi)益處。
下面是主程序:
#include "STC32G.H"
#include "mcu_initial.h"
#include "tft_320_drv.h"
#include "pic00.h"
//#include "pic01.h"
//#include "pic02.h"
//#include "pic03.h"
//#include "pic04.h"
unsigned char extern xdata DmaRxBuffer[];
unsigned char extern xdata DmaTxBuffer[];
bit extern busy;
//unsigned int cnt;
void main(void)
{
mcu_initial();
lcd_initial();
display_black();
//因?yàn)閮?nèi)存空間有限,寫圖像數(shù)據(jù)進(jìn)at24c1024時(shí),分四次寫入(兩次也能行)每次打開(kāi)一個(gè)寫語(yǔ)句,并修改對(duì)應(yīng)的頭文件例pic01.h
//transfer_image(0,pic01,125,0xa0);//從地址0x00開(kāi)始,存入125頁(yè)數(shù)據(jù),打開(kāi)時(shí)要有頭文件pic01.h配合
//transfer_image(32000,pic04,125,0xa0);//從地址32000開(kāi)始,存入125頁(yè)數(shù)據(jù),打開(kāi)時(shí)要有頭文件pic04.h配合
//transfer_image(32000,pic02,125,0xa2);//這是在后區(qū)。,打開(kāi)時(shí)要有頭文件pic02.h配合
//transfer_image(0,pic03,125,0xa2);//這個(gè)也是后區(qū),打開(kāi)時(shí)要有頭文件pic03.h配合
disp_32x32(32,64,pin,red, yellow);//寫入完成標(biāo)志
disp_at24c1024(0,0,0,125,0xa0);
disp_at24c1024(160,100,32000,125,0xa0);
disp_at24c1024(0,100,0,125,0xa2);
disp_at24c1024(160,0,32000,125,0xa2);
Delay10ms();
display_image(0, 200,320,40,pic00);
while(1);
}
運(yùn)行時(shí)先分批打開(kāi)寫入數(shù)據(jù)函數(shù),把圖像數(shù)據(jù)寫進(jìn)芯片。就可以看到完整的圖像顯示了。
考慮到寫入速度比較慢。在寫入時(shí)加了計(jì)數(shù)顯示。能看到寫入的進(jìn)程。
例程采用了lcm功能,lcm_dma功能和iic_dma功能。所以運(yùn)行相關(guān)函數(shù)前要做好 相關(guān)設(shè)置,具體設(shè)置多數(shù)放在mcu_initial.c模式中了。少數(shù)在函數(shù)里。
考慮到寫at24c1024的速度可能比讀慢些。所以讀寫函數(shù)采用了不同的iic速度設(shè)置。讀程序時(shí)可以注意一下。主要是IIC_DMA頁(yè)寫時(shí)速度快了好像不行。所以用了230K,其它用了800k.
附圖是顯示的圖像效果和整機(jī)實(shí)況,看整機(jī)實(shí)況請(qǐng)不要仔細(xì)看,因?yàn)槲业腶t24c1024芯片是用鐵絲綁在洞洞板上,然后飛線連接的。老師看到會(huì)踢死我的。
完整例程見(jiàn)附件,歡迎指點(diǎn),歡迎吐槽。
|
評(píng)分
-
查看全部評(píng)分
|