PIC單片機與串行閃存的SPI接口設計
3 SPI硬件設計
PIC16F877A單片機具有非常完善的SPI接口(RC3/SCK、RC4/SDI、RC5/SDO、RA5/SS),只有PIC16F877A作為從機時,RA5/SS引腳才作為SPI腳,PIC16F877A為主機時,SS可作為普通I/O使用。通過該接口,可比較容易地實現PIC16F877A與SPI Flash的通信。PIC16F877A與M25P16的硬件接口如圖2所示。其中,SCK、SDI、SDO為MCU的SPI專用引腳,分別與存儲器的對應引腳相連,可選MCU的任意I/O腳作為存儲器的片選信號,圖中選取RC2腳與存儲器的片選S相連,這樣,在SPI通信時只涉及MCU的C口,便于操作。M25P16的HOLD和W直接接高電平,表示不允許在S有效的情況下暫停SPI通信且整個存儲區都沒有寫保護。
圖2中,VDD為+5 V,由于PIC16F877A工作在5 V電壓下,而M25P16的工作電壓范圍為2.7~3.6 V,二者不能直接相連。這里采用電阻分壓的方式,保證輸入M25P16的S、C、D腳的電壓在存儲器能承受且能識別的范圍內,通過在M25P16向PIC16F877A輸入數據的SDO腳加上拉電阻,保證MCU可以識別M25P16輸出的高電壓,從而保證正常的SPI通信。如果MCU工作于3.3 V,則直接將二者的對應引腳相連即可。

4 SPI軟件設計
在硬件連線正確的基礎上,要進行SPI通信,還要對M25P16編寫驅動程序,包括SPI初始化、讀M25P16的數據、向M25P16寫人數據、數據的擦除等,這里使用C語言編程,編譯器選擇PICC,開發環境為MPLAB IDE8.10。
PIC16F877A的SPI通信涉及4個寄存器:控制寄存器SSPCON、狀態寄存器SSPSTAT串行接收/發送緩沖器SSPBUF和移位寄存器SSPSR。其中,SSPCON的8位都是可讀可寫的,用于設置SSP處于主/從模式、時鐘頻率、時鐘極性、SSP使能以及寫沖突檢測;SSPSTAT只有高2位可讀寫,低6位是只讀的。PIC16F877A處于接收模式時,SSPSR和SSPBUF構成2級緩沖的接收器,SSPSR每收到1個完整的字節,就將該字節傳給SSPBUF,并將中斷標志位SSPIF置1,可通過讀SSPBUF得到數據;877A處于發送模式時,寫SSPBUF操作會同時將數據寫入SSPSR,觸發傳輸。下面結合具體的代碼進行詳細闡述。
(1)SPI初始化與讀寫函數

從SendByte和RcvByte函數的代碼中,可以看出數據發送和接收是否完成,都是通過判斷STAT_BF標志位(SSPSTAT寄存器的BF位,STAT_BF是在頭文件pic1687x.h中定義的名稱)來實現的,而數據手冊中關于BF位的描述僅用于接收模式。這是由于PIC16F877A通過SDO發送數據的同時,會通過SDI讀人數據,當1字節發送完成時,剛好接收1字節到SSPBUF,這時SSPBUF滿,BY被置為1,故可通過STAT_BF標志判斷1字節是否發送完成。
(2)連續寫函數
M25P16的PP指令允許1次連續寫入不超過1頁(256字節)的數據。寫人數據之前,首先要發出寫允許命令,然后才能執行數據寫入操作。數據寫入函數參數包括address(32位地址)、block(寫入數據緩沖區指針)、n(一次連續寫入的字節數,n256)。如果address的低8位不全為0,即不是從頁起始處寫,并且需要寫入的數據超出該頁剩余空間,則超出部分被丟棄。代碼如下:
評論