張曼 緱麗敏

摘 要:介紹了嵌入式PowerPC處理器MPC8270的體系架構和串行外設接口(SPI)控制器的工作原理。基于VxWorks和MPC8270嵌入式系統開發平臺,詳細介紹了MPC8270處理器芯片自帶的SPI驅動程序的設計實現過程,描述了SPI的初始化、中斷處理以及數據發送、數據接收等關鍵技術。基于MPC8270的SPI設計具有較強的實用性。
關鍵詞:MPC8270;SPI;VxWorks操作系統;串行外設接口
MPC8270是廣泛應用于通信和網絡系統的一款通用處理器,具有強大的接口能力,其中自帶的SPI接口可以應用于EEPROM、FLASH、實時時鐘、AD轉換器,還有數字信號處理器和數字信號解碼器之間。本文在基于VxWorks操作系統的嵌入式處理器模塊上實現了通過SPI與AD轉換器通信,采集AD信號的功能。
本文基于VxWorks操作系統的SPI驅動開發,使得MPC8270上的SPI做為主設備,與SPI從設備AD7940進行AD模擬量數據采集。
1 MPC8270處理器SPI硬件功能模型
MPC8270處理器的SPI硬件功能模型如圖1所示:
從硬件功能模型可以看出,SPI硬件接口通過配置的外部復用管腳收發SPI信號,通過SPI BRG時鐘從MPC8270處理器獲取時鐘,當接收數據時,交換寄存器將從SPI總線上將接收的數據獲取出來,放入接收寄存器中,當發送數據時,將發送數據寄存器中的數放入交換寄存器中,通過交換寄存器送給SPI總線,發送出去。發送寄存器和接收寄存器通過MPC8270處理器內的外部總線連接到通訊處理器內核(CP)中。SPI總線的工作狀態包括發送接收數據長度、時鐘相位和極性設置等通過SPI模式寄存器進行設置,SPI模式寄存器通過60x總線與CPU內核連接。
2 SPI驅動的設計與實現
2.1 SPI初始化
SPI初始化的具體步驟如下:
1)分配管腳,配置PD16、PD17、PD18、PD19管腳對應的PPAR寄存器對應位為1,PDIR寄存器對應位為0,PSOR對應位為1。
2)分配并初始化SPI操作所需的內存空間。Internal data ram memory map定義了內部RAM空間,SPI parameter ram 的參數定義在這部分空間內,接收和發送BD的數據結構也定義在這部分空間內,而BD的buffer pointer不定義在這部分空間內,使用的memory空間。本項目中SPI parameter ram對應的internal Data Ram地址為0xF00089FC,在此地址上配置SPI parameter ram對應的地址為0xf0000100,接收緩存描述符(Receive Buffer Descriptor,RxBD)表的基地址和指針配置地址為0xf0000140,發送緩存描述符(Transmit Buffer Descriptor,TxBD)表的基地址和指針配置地址為0xf0000148。BD的個數 為1,接收緩存描述符配置的buffer pointer大小為32字節,發送緩存描述符配置的buffer pointer大小為32字節。
3)初始化SPI模式配置寄存器。SPI模式配置寄存器會配置SPI波特率、SPI傳輸數據長度、SPI主/從模式、SPI數據方向(按照從高字節到低字節,或者低字節到高字節順序發送)
4)初始化接收發送BD。初始化接收和發送BD時,需要將最后一個BD描述符的控制狀態字設置為0x2000表示這是BD table中的最后一個BD。
5)初始化SPI parameter ram。在初始化SPI parameter ram時,需要將接收BD基地址和指針設置為0xf0000140,再將發送BD基地址和指針設置為0xf0000148。
6)設置SPI Event Register和SPI Mask Register,清中斷狀態寄存器。
7)設置SPI mode 寄存器,使能SPI操作。
2.2 SPI的接收處理實現
SPI的接收處理是首先初始化RxBD和TxBD,雖然是接收操作,但是對于MPC8270 SPI來說接收數據的同時,會發送數據;發送數據和接收數據是在一個時鐘周期不同的沿完成的,因此,接收數據時也要初始化發送BD。設置接收BD的控制狀態字為READY,發送BD的控制狀態字為EMPTY。然后,設置SPISEL信號為零;之后,設置SPI mode寄存器為發送數據開始。
通過查詢SPI Event寄存器和SPI Mask寄存器判斷接收是否結束,并查詢接收緩沖區是否正確。如果接收正確設置SPISEL信號為1,并從接收BD中讀取有效數據。如果出錯則返回錯誤。
SPI接收處理實現如下。
2.3 SPI的發送處理實現
SPI的發送處理是首先初始化RxBD和TxBD,將需要發送的數據拷貝到發送BD的buffer中,設置發送BD的控制狀態字為EMPTY,接收BD的控制狀態字為READY。然后,設置SPISEL信號為零;之后,設置SPI mode寄存器為發送數據開始。
通過查詢SPI Event寄存器和SPI Mask寄存器判斷發送是否結束,并查詢發送數據是否正確。如果發送正確設置SPISEL信號為1。如果出錯則返回錯誤。
SPI發送實現處理實現如下。
2.4 中斷處理
MPC8270 SPI在連續收發數據時,每完成一次發送或者接收數據后,都需要清中斷狀態標志寄存器SPI Event寄存器和SPI Mask寄存器,否則連續傳輸時,會出現錯誤。
3 性能測試結果分析
通過測試設備對SPI進行測試,在25M波特率下,連續收發數據3600s,收發數據正確,丟包率為0。在12.5M波特率下,連續收發數據3600s,收發數據正確,丟包率為0。在6.25M波特率下,連續收發數據3600s,收發數據正常,丟包率為0。通過長時間的數據收發測試,驗證了SPI驅動程序的穩定性和可靠性。
4 結語
通過性能測試說明,利用低功耗,通訊處理能力強的MPC8270的SPI接口,可以比較容易的實現SPI通訊處理。本文介紹了MPC8270內部的SPI的通訊原理及驅動程序設計方法,對其他的設計應用有一定的借鑒作用。
參考文獻:
[1] Freescale.MPC8280Power QUICCII Family Reference Manual[EB/OL].[2013-03-18].http://www.freescale.com.
[2] Freescale.PowerQUICCⅡ Family Hardware Specifications[EB/OL].[2013-03-25].http://www.freescale.com.
作者簡介:
張曼(1982-),女,陜西西安人,碩士,工程師,嵌入式計算機軟硬件開發;
緱麗敏(1986-),女,陜西西安人,碩士,工程師,研究方向為嵌入式計算機設計等。