新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > PIC單片機與串行閃存的SPI接口設(shè)計

PIC單片機與串行閃存的SPI接口設(shè)計

作者: 時間:2010-05-27 來源:網(wǎng)絡(luò) 收藏


3 硬件

16F877A具有非常完善的(RC3/SCK、RC4/SDI、RC5/SDO、RA5/SS),只有16F877A作為從機時,RA5/SS引腳才作為腳,16F877A為主機時,SS可作為普通I/O使用。通過該,可比較容易地實現(xiàn)PIC16F877A與SPI Flash的通信。PIC16F877A與M25P16的硬件如圖2所示。其中,SCK、SDI、SDO為MCU的SPI專用引腳,分別與存儲器的對應(yīng)引腳相連,可選MCU的任意I/O腳作為存儲器的片選信號,圖中選取RC2腳與存儲器的片選S相連,這樣,在SPI通信時只涉及MCU的C口,便于操作。M25P16的HOLD和W直接接高電平,表示不允許在S有效的情況下暫停SPI通信且整個存儲區(qū)都沒有寫保護。

圖2中,VDD為+5 V,由于PIC16F877A工作在5 V電壓下,而M25P16的工作電壓范圍為2.7~3.6 V,二者不能直接相連。這里采用電阻分壓的方式,保證輸入M25P16的S、C、D腳的電壓在存儲器能承受且能識別的范圍內(nèi),通過在M25P16向PIC16F877A輸入數(shù)據(jù)的SDO腳加上拉電阻,保證MCU可以識別M25P16輸出的高電壓,從而保證正常的SPI通信。如果MCU工作于3.3 V,則直接將二者的對應(yīng)引腳相連即可。



4 SPI軟件

在硬件連線正確的基礎(chǔ)上,要進行SPI通信,還要對M25P16編寫驅(qū)動程序,包括SPI初始化、讀M25P16的數(shù)據(jù)、向M25P16寫人數(shù)據(jù)、數(shù)據(jù)的擦除等,這里使用C語言編程,編譯器選擇PICC,開發(fā)環(huán)境為MPLAB IDE8.10。

PIC16F877A的SPI通信涉及4個寄存器:控制寄存器SSPCON、狀態(tài)寄存器SSPSTAT接收/發(fā)送緩沖器SSPBUF和移位寄存器SSPSR。其中,SSPCON的8位都是可讀可寫的,用于設(shè)置SSP處于主/從模式、時鐘頻率、時鐘極性、SSP使能以及寫沖突檢測;SSPSTAT只有高2位可讀寫,低6位是只讀的。PIC16F877A處于接收模式時,SSPSR和SSPBUF構(gòu)成2級緩沖的接收器,SSPSR每收到1個完整的字節(jié),就將該字節(jié)傳給SSPBUF,并將中斷標(biāo)志位SSPIF置1,可通過讀SSPBUF得到數(shù)據(jù);877A處于發(fā)送模式時,寫SSPBUF操作會同時將數(shù)據(jù)寫入SSPSR,觸發(fā)傳輸。下面結(jié)合具體的代碼進行詳細(xì)闡述。

(1)SPI初始化與讀寫函數(shù)


從SendByte和RcvByte函數(shù)的代碼中,可以看出數(shù)據(jù)發(fā)送和接收是否完成,都是通過判斷STAT_BF標(biāo)志位(SSPSTAT寄存器的BF位,STAT_BF是在頭文件pic1687x.h中定義的名稱)來實現(xiàn)的,而數(shù)據(jù)手冊中關(guān)于BF位的描述僅用于接收模式。這是由于PIC16F877A通過SDO發(fā)送數(shù)據(jù)的同時,會通過SDI讀人數(shù)據(jù),當(dāng)1字節(jié)發(fā)送完成時,剛好接收1字節(jié)到SSPBUF,這時SSPBUF滿,BY被置為1,故可通過STAT_BF標(biāo)志判斷1字節(jié)是否發(fā)送完成。

(2)連續(xù)寫函數(shù)

M25P16的PP指令允許1次連續(xù)寫入不超過1頁(256字節(jié))的數(shù)據(jù)。寫人數(shù)據(jù)之前,首先要發(fā)出寫允許命令,然后才能執(zhí)行數(shù)據(jù)寫入操作。數(shù)據(jù)寫入函數(shù)參數(shù)包括address(32位地址)、block(寫入數(shù)據(jù)緩沖區(qū)指針)、n(一次連續(xù)寫入的字節(jié)數(shù),n256)。如果address的低8位不全為0,即不是從頁起始處寫,并且需要寫入的數(shù)據(jù)超出該頁剩余空間,則超出部分被丟棄。代碼如下:


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉