新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于PIC單片機與串行閃存的SPI接口設計

        基于PIC單片機與串行閃存的SPI接口設計

        作者: 時間:2011-11-26 來源:網絡 收藏

        3 SPI硬件設計

        PIC16F877A單片機具有非常完善的(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,即不是從頁起始處寫,并且需要寫入的數據超出該頁剩余空間,則超出部分被丟棄。代碼如下:



        關鍵詞: PIC單片機 SPI接口

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 紫金县| 鄂伦春自治旗| 华宁县| 靖安县| 瑞安市| 贵德县| 平遥县| 随州市| 锦屏县| 阜新| 依安县| 衢州市| 五指山市| 易门县| 海安县| 肥乡县| 泽普县| 巴林左旗| 凌海市| 阳原县| 盈江县| 茌平县| 治县。| 莫力| 恩平市| 富锦市| 巴塘县| 宣化县| 桂林市| 巴楚县| 大冶市| 托克逊县| 思茅市| 偏关县| 莱芜市| 潼南县| 中卫市| 杂多县| 和田市| 威宁| 搜索|