新聞中心

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

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

        作者: 時間:2010-05-27 來源:網絡 收藏


        3 硬件

        16F877A具有非常完善的(RC3/SCK、RC4/SDI、RC5/SDO、RA5/SS),只有16F877A作為從機時,RA5/SS引腳才作為腳,16F877A為主機時,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,即不是從頁起始處寫,并且需要寫入的數據超出該頁剩余空間,則超出部分被丟棄。代碼如下:


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 东乡县| 措勤县| 邢台市| 尼勒克县| 金川县| 赣榆县| 兰考县| 凌源市| 兴化市| 鸡泽县| 中卫市| 保靖县| 孝感市| 洞头县| 永清县| 大方县| 南汇区| 通渭县| 太和县| 定结县| 富阳市| 大方县| 宝清县| 新龙县| 乳源| 通化县| 彭水| 河津市| 原阳县| 溆浦县| 盐亭县| 玉林市| 比如县| 剑河县| 和平县| 建瓯市| 寿阳县| 曲麻莱县| 定边县| 壤塘县| 江陵县|