欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2412|回復: 1
打印 上一主題 下一主題
收起左側(cè)

IIC-DMA讀寫at24c1024例程分享與解析-基于stc32g12k128單片機的應用

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1039438 發(fā)表于 2023-2-26 17:24 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
      分享該例程是因為雖然網(wǎng)上已經(jīng)有很多關(guān)于at24c芯片的讀寫程序,可是我在不停查資料的情況下還是用了十天時間才把程序調(diào)通。查到的每個資料都對我有幫助,但仍不夠用。考慮到其它新人或者會遇到同樣的情況,決定把程序分享出來,希望對初學者有所幫助。
      關(guān)于芯片的接法,只說三點,一個是寫保護口wp,可以接在一個IO口上,寫芯片前要拉低,如果不希望芯片內(nèi)容被改變,就拉高。第二個是A1腳,也就是芯片的2腳。這是器件的地址選擇腳,可以接VCC或地,對應器件地址不同,我的程序中是直接接地。有資料說該腳懸空與接地等效,我偷懶就沒接。結(jié)果不穩(wěn)定。所以最后還是接地了。第三是SCL與SDA線應接上拉電阻。我偷懶沒接。把stc32g12k128內(nèi)置的上拉電阻打開了,語句是P1PU=0x30;
本例程提供了四個讀寫at24c1024的函數(shù),下面分別介紹:
      一、頁寫函數(shù)
void Page_Write(unsigned char addr,unsigned char SLAW)  /*  WordAddress,First Data Address,Byte lenth   */

功能:向at24c1024寫入一頁數(shù)據(jù)
參數(shù)1:SLAW-器件地址加頁地址首位(P0);在A1腳接地時,常用的是兩個值,0xa0和0xa2,分別表示芯片的前256頁和后256頁
參數(shù)2:addr-器件的頁地址,與參數(shù)1共同決定數(shù)據(jù)寫入的位置,取值0-255間.
     這個函數(shù)很簡潔好用,只是它在寫入時要占用最前面的兩個字節(jié),分別寫入的是上述兩個參數(shù)值。在寫入相對獨立的數(shù)據(jù),很方便,但寫入大批量數(shù)據(jù)時,因每頁插入了兩個字節(jié)。所以讀出時多了點麻煩。
     這個函數(shù)還有一個優(yōu)點,是使用了IIC-DMA功能,運行時占用mcu時間少。有利提高mcu使用效率。
     二、隨機寫函數(shù)
void WriteNbyte(unsigned int addr, unsigned char *p, unsigned int number,unsigned char SLAW)  //

功能:向at24c1024指定地址寫入數(shù)據(jù)。
參數(shù)1:SLAW-與上一個函數(shù)相同,器件地址加頁地址首位(P0);在A1腳接地時,常用的是兩個值,0xa0和0xa2,分別表示芯片的前256頁和后256頁
參數(shù)2:addr-這是個16位地址,高位是頁地址,與前面的相同,低位是字節(jié)地址。這使得該函數(shù)能在任意位置寫入內(nèi)容。靈活方便。
參數(shù)3:number-寫入字節(jié)數(shù),如果前面的字節(jié)地址是0的話,number最大可以是256.如果字節(jié)地址不是0,則number一般設的小與256,例字節(jié)地址是0x09(addr的低位),則number最大可以是246,如果超過這個數(shù)值,則地址到255后,寫入的數(shù)據(jù)不是依次后延存儲,而是反回本頁地址0處開始存放。并依次向后存儲。這不方便提取,也容易覆蓋其它數(shù)據(jù)。(就是說芯片的地址指針不會自動跨頁)
參數(shù)4:p-這是緩沖區(qū)地址,在本例程中。寫數(shù)據(jù)緩沖區(qū)使用的DmaTxBuffer[256],大了沒用。在前面的頁寫函數(shù)中也需要用到這個緩沖區(qū),只是默認是它。沒有當參數(shù)寫出來。
      三、隨機讀函數(shù)
void ReadNbyte(unsigned int addr, unsigned char *p, unsigned int number,unsigned char SLAW)

功能:讀取指定地址處的數(shù)據(jù)
參數(shù)1:SLAW-與前面的函數(shù)相同,表示芯片地址和區(qū)地址(分辨前256和后156頁)
參數(shù)2:addr-字節(jié)地址,16位的,與SLAW里的p0值共同決定要讀的字節(jié)的具體地址
參數(shù)3:number-本次讀取的字節(jié)數(shù),在讀取數(shù)據(jù)時芯片的內(nèi)部地址指針能不能自動跨頁我沒有試過。權(quán)當不能跨頁使用,就是說每次調(diào)用讀函數(shù),讀取的數(shù)據(jù)不超過256,原理與寫函數(shù)類似。
參數(shù)4:p-讀緩沖區(qū),本例程中用DmaRxBuffer[6400],雖然每次調(diào)用讀函數(shù),讀取的數(shù)據(jù)不超過256字節(jié),但在循環(huán)語句調(diào)用讀函數(shù)時,如果緩沖區(qū)指針不復位,則可以繼續(xù)依次向后存放讀出的數(shù)據(jù)。所以我用了一個很大的緩沖區(qū)。減少向屏傳送數(shù)據(jù)的次數(shù)。
    四、使用IIC-DMA的讀函數(shù)
void read_iicbydma(unsigned int addr,unsigned int number,unsigned char *p,unsigned char SLAW)

這個函數(shù)的功能與參數(shù)與上一個相同,不做重復說明了。寫這個函數(shù)是因為它使用了IIC-DMA功能,因而工作時對mcu的占用少。提高mcu使用效能。
前面介紹的四個函數(shù),兩個基本讀寫,兩個采用了IIC-DMA功能讀寫。比較一下發(fā)現(xiàn)論單任務完成速度,基本函數(shù)快些,但占用mcu時間多。
     為了展示前面四個函數(shù)的用法,又寫了兩個函數(shù),一個往at24c1024里寫入批量圖像數(shù)據(jù),一個從at24c1024里讀出數(shù)據(jù)并送屏幕顯示出來
void transfer_image(unsigned int addr,unsigned char *p,unsigned char number_page,unsigned char SLAW)//向芯片送圖像數(shù)據(jù)number_page是頁數(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表示在屏上顯示的起始位置,我把屏分成四份,用四個數(shù)組文件(pic01.h;pic02.h;pic03.h;pic04.h)放圖像數(shù)據(jù),顯示屏為320x240。單個圖的尺寸為160x100。這兩個函數(shù)屬于普通編程,不多說了。
     在規(guī)劃at24c1024空間時,我在前區(qū)存入兩個圖像,其SLAW值為0xa0;在后區(qū)存入兩個圖像文件,其SLAW值為0xa2.在例程中可以注意一下。
這里分區(qū)存放數(shù)據(jù)。沒有選擇連續(xù)存放,是考慮編程簡單些。一個不常用的程序,寫得復雜了沒益處。
     下面是主程序:
#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();
//因為內(nèi)存空間有限,寫圖像數(shù)據(jù)進at24c1024時,分四次寫入(兩次也能行)每次打開一個寫語句,并修改對應的頭文件例pic01.h
        //transfer_image(0,pic01,125,0xa0);//從地址0x00開始,存入125頁數(shù)據(jù),打開時要有頭文件pic01.h配合
        //transfer_image(32000,pic04,125,0xa0);//從地址32000開始,存入125頁數(shù)據(jù),打開時要有頭文件pic04.h配合
   //transfer_image(32000,pic02,125,0xa2);//這是在后區(qū)。,打開時要有頭文件pic02.h配合
    //transfer_image(0,pic03,125,0xa2);//這個也是后區(qū),打開時要有頭文件pic03.h配合
disp_32x32(32,64,pin,red, yellow);//寫入完成標志
        
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);
}

     運行時先分批打開寫入數(shù)據(jù)函數(shù),把圖像數(shù)據(jù)寫進芯片。就可以看到完整的圖像顯示了。
考慮到寫入速度比較慢。在寫入時加了計數(shù)顯示。能看到寫入的進程。
     例程采用了lcm功能,lcm_dma功能和iic_dma功能。所以運行相關(guān)函數(shù)前要做好 相關(guān)設置,具體設置多數(shù)放在mcu_initial.c模式中了。少數(shù)在函數(shù)里。
      考慮到寫at24c1024的速度可能比讀慢些。所以讀寫函數(shù)采用了不同的iic速度設置。讀程序時可以注意一下。主要是IIC_DMA頁寫時速度快了好像不行。所以用了230K,其它用了800k.
       附圖是顯示的圖像效果和整機實況,看整機實況請不要仔細看,因為我的at24c1024芯片是用鐵絲綁在洞洞板上,然后飛線連接的。老師看到會踢死我的。
      完整例程見附件,歡迎指點,歡迎吐槽。

實際電路.jpg (3.57 MB, 下載次數(shù): 118)

實際電路.jpg

圖像效果.jpg (4.1 MB, 下載次數(shù): 123)

圖像效果.jpg

at24c1024_rd.zip

308.44 KB, 下載次數(shù): 26, 下載積分: 黑幣 -5

評分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:38662 發(fā)表于 2023-3-1 08:09 | 只看該作者
效果不錯,下載下來學習學習,謝謝!
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表