久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

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

IIC-DMA讀寫at24c1024例程分享與解析-基于stc32g12k128單片機(jī)的應(yīng)用

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
      分享該例程是因?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),歡迎吐槽。

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

實(shí)際電路.jpg

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

圖像效果.jpg

at24c1024_rd.zip

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

評(píng)分

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

查看全部評(píng)分

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

使用道具 舉報(bào)

沙發(fā)
ID:38662 發(fā)表于 2023-3-1 08:09 | 只看該作者
效果不錯(cuò),下載下來(lái)學(xué)習(xí)學(xué)習(xí),謝謝!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频观看 | 欧美一级黄色片免费观看 | 欧美不卡视频一区发布 | 四虎影院免费在线 | 成人亚洲网站 | 精品国产乱码一区二区三 | 综合网视频 | 狠狠操狠狠操 | 亚洲高清视频一区 | 日韩精品一区二区三区在线播放 | 91麻豆精品国产91久久久久久久久 | 三级黄色片在线播放 | 欧美一区二区三区在线观看视频 | 激情网五月天 | 理伦毛片 | 日韩在线不卡视频 | 日韩在线欧美 | 欧美影院久久 | 99国产视频| 亚洲午夜精品 | 一区| 久久国产亚洲精品 | 国产一区日韩在线 | 精品国产一区二区三区日日嗨 | 亚洲视频手机在线 | 国产美女精品 | www.亚洲 | 91精品国产91久久久久久 | 久久精品日产第一区二区三区 | 色婷婷精品国产一区二区三区 | 成人av大全| 特级做a爰片毛片免费看108 | 黄色免费在线观看网址 | 超碰在线人 | 成人欧美一区二区 | 国产不卡视频 | 久久99视频这里只有精品 | 午夜一区二区三区在线观看 | 久久亚洲二区 | 国产成人在线免费 | 91在线精品视频 |