MSP430F5529 DriverLib 库函数学习笔记(九)SPI
目錄
- 硬知識
- USCI的同步模式
- SPI概述
- SPI特性及結構框圖
- 同步操作原理與操作
- USCI寄存器——SPI模式
- USCI_x_SPI API (機翻)
- 處理狀態和初始化的函數
- 參數
- 處理數據的函數
- 參數
- 管理中斷的函數
- 參數
- DMA相關
- 參數
平臺:Code Composer Studio 10.3.1
MSP430F5529 LaunchPad? Development Kit
(MSP?EXP430F5529LP)
硬知識
USCI的同步模式
SPI概述
???????SPI(Serial Peripheral Interface)為串行外設接口的簡稱,它是一種同步全雙工通信協議。MSP430F5xx/6xx系列單片機的USCI_A和USCI_B模塊都支持SPI通信模式。SPI通信模塊通過3線(SOMI、SIMO、CLK)或者4線(SOMI、SIMO、CLK及STE)同外界進行通信。下面對這4根線進行簡要說明。
???????① CLK:CLK為SPI通信時鐘線。該時鐘線由主機控制,即傳送的速率由主機編程決定。
???????② SOMI:SOMI(Slave Output Master Input)即主入從出引腳。如果設備工作在主機模式,該引腳為輸入;如果設備工作在從機模式,該引腳為輸出。
???????③ SIMO:SIMO(Slave Input Master Output)即從入主出引腳。如果設備工作在主機模式,該引腳為輸出;如果設備工作在從機模式,該引腳為輸入。
???????④ STE:STE(Slave Transmit Enable)即從機模式發送/接收控制引腳,控制多主或多從系統中的多個從機。在其他應用場合中,也經常被寫為片選CS(Chip Select)和從機選擇SS(Slave Select)。
???????SPI通信模塊硬件功能很強,致使SPI通信軟件實現相當簡單,使CPU有更多的時間處理其他事情。SPI通信原理也比較簡單,如圖所示。
SPI特性及結構框圖
???????當MSP430單片機USCI模塊控制寄存器UCAxCTL0或UCBxCTL0的UCSYNC控制位置位,USCI模塊工作在同步SPI模式,通過配置該寄存器中的UCMODEx控制位,可使SPI模塊工作在三線或四線SPI通信模式下。MSP430的同步通信模式具有如下特點:
? 7位或8位數據長度;
? 最高有效位在前或者最低有效位在前的數據發送和接收;
? 支持3線或4線SPI操作;
? 支持主機模式或從機模式;
? 具有獨立的發送和接收移位寄存器;
? 具有獨立的發送和接收緩沖寄存器;
? 具有連續發送和接收能力;
? 時鐘的極性和相位可編程;
? 主模式下,時鐘頻率可編程;
? 具有獨立的接收和發送中斷能力;
? LPM4下的從模式工作。
???????USCI模塊配置為SPI模式下的結構框圖如圖所示。
同步操作原理與操作
(1)SPI的主機模式
??????? MSP430單片機的USCI模塊作為SPI通信功能使用時,作為主機與另一具有SPI接口的SPI從機設備的連接圖如圖所示。
???????當控制寄存器UCAxCTL0/UCBxCTL0中的UCMST=1時,MSP430單片機的SPI通信模塊工作在主機模式。USCI模塊通過在UCxCLK引腳上的時鐘信號控制串行通信。串行通信發送工作由發送緩沖區UCxTXBUF、發送移位寄存器和UCxSIMO引腳完成。當移位寄存器為空,已寫入發送緩沖區的數據將移入發送移位寄存器,并啟動在UCxSIMO引腳的數據發送,該數據發送是最高有效位還是最低有效位在前,取決于UCMSB控制位的設置。串行通信接收工作由UCxSOMI引腳、接收移位寄存器和接收緩沖區UCxRXBUF完成。UCxSOMI引腳上的數據在與發送數據時相反的時鐘沿處移入接收移位寄存器,當接收完所有選定位數時,接收移位寄存器中的數據移入接收緩沖寄存器UCxRXBUF中,并置位接收中斷標志位UCRXIFG,這標志著數據的接收/發送已經完成。
(2)SPI的從機模式
???????MSP430單片機的USCI模塊作為SPI通信功能使用時,作為從機與另一具有SPI接口的SPI主機設備的連接圖如圖所示。
當控制寄存器UCAxCTL0/UCBxCTL0中的UCMST=0時,MSP430單片機的SPI通信模塊工作在從機模式。在從機模式下,SPI通信所用的串行時鐘來源于外部主機,從機的UCxCLK引腳為輸入狀態。數據傳輸速率由主機發出的串行時鐘決定,而不是內部的時鐘發生器。在UCxCLK開始前,由UCxTXBUF移入移位寄存器中的數據在主機UCxCLK信號的作用下,通過從機的UCxSOMI引腳發送給主機。同時,在UCxCLK時鐘的反向沿UCxSIMO引腳上的串行數據移入接收移位寄存器中。當數據從接收移位寄存器移入接收緩沖寄存器UCxRXBUF中時,UCRXIFG中斷標志位置位,表明數據已經接收完成。當新數據被寫入接收緩沖寄存器時,前一個數據還沒有被取出,則溢出標志位UCOE將被置位。
(3)串行時鐘控制
???????串行通信所需的時鐘線UCxCLK由SPI總線上的主機提供。當UCMST=1時,串行通信所需的時鐘由USCI時鐘發生器提供,通過UCSSELx控制位選擇用于產生串行通信時鐘的參考時鐘,最終串行通信時鐘由UCxCLK引腳輸出。當UCMST=0時,USCI時鐘由主機的UCxCLK引腳提供,此時USCI不使用時鐘發生器,不考慮UCSSELx控制位。SPI的接收器和發送器并行操作,且數據傳輸使用同一個時鐘源。
串行通信時鐘速率控制寄存器(UCxxBR1和UCxxBR0)組成的16位UCBRx的值,是USCI時鐘源BRCLK的分頻因子。在主模式下,USCI模塊能夠產生的最大串行通信時鐘是BRCLK。SPI模式下不可使用調制器,即SPI串行通信時鐘發生器不支持小數分頻,所以USCI工作在SPI模式下的時鐘發生器產生頻率計算公式為
(4)SPI通信時序圖
???????SPI通信時序圖如圖所示。其中,CKPH和CKPL為UCxCLK的極性和相位控制位,在此對這兩個控制位進行簡要介紹。CKPH為UCxCLK的相位控制位,CKPL為UCxCLK的極性控制位。兩個控制位如何設置對通信協議沒有什么影響,只是用來約定在UCxCLK的空閑狀態和從什么位置開始采樣信號。當CKPH=0時,意味著發送在以UCxCLK第一個邊沿開始采樣信號,反之則在第二個邊沿開始。當CKPL=0時,意味著時鐘總線低電平空閑,反之則是時鐘總線高電平空閑。當信號線穩定時,進行接收采樣,當接收采樣時,信號線不允許發生電平跳變。
(5)SPI中斷
???????USCI模塊只有一個中斷向量,發送和接收共用該向量。USCI_Ax和USCI_Bx不共用同一個中斷向量。
① SPI發送中斷操作
???????若UCTXIFG置位,表明發送緩沖寄存器UCxTXBUF為空,可以向其寫入新的字符。如果UCTXIE和GIE也置位,將產生發送中斷請求。如果將字符寫入UCxTXBUF緩沖區,UCTXIFG將會自動復位,因此可利用發送中斷服務程序不斷向發送緩沖寄存器UCxTXBUF寫入新的數據,完成數據的傳輸。注意當UCTXIFG=0時,寫數據到UCxTXBUF緩沖區,將可能會導致錯誤的數據發送。
② SPI接收中斷操作
???????每當接收到一個字符,并把字符裝載到接收緩沖寄存器UCxRXBUF時,將置位接收中斷標志位UCRXIFG。如果UCRXIE和GIE也置位時,將產生一個接收中斷請求。當接收緩沖寄存器UCxRXBUF被讀取時,UCRXIFG會自動復位。因此,可利用接收中斷服務程序完成數據的接收工作。
③ USCI中斷向量UCxIV
???????USCI中斷標志具有不同的優先級,它們組合共用一個中斷向量,即USCI為多源中斷。中斷向量寄存器UCxIV用來決定哪個中斷標志請求產生中斷。優先級最高的中斷將會在UCxIV寄存器內產生一個數字偏移量,這個偏移量累加到程序計數器PC上,程序自動跳轉到相應的軟件程序處。禁止中斷不會影響UCxIV的值。對UCxIV寄存器的任何讀或寫訪問,都會復位掛起優先級最高的中斷標志。如果另一個中斷標志置位,在響應完之前的中斷后,將會立即產生另一個中斷。
USCI寄存器——SPI模式
???????在SPI模式下可用的USCI寄存器如表所示。由于USCI_Ax寄存器和USCI_Bx寄存器類型和功能類似,在此只列出USCI_Ax寄存器并對其每位的含義進行講解。若用戶使用的為USCI_Bx模塊,可參考USCI_Ax寄存器進行理解和配置。
USCI_x_SPI API (機翻)
???????要將模塊配置為主機模式,用戶必須調用USCI_x_SPI_initMaster()來配置USCI_x_SPI 主機模式。接下來是使用USCI_x_SPI_enable()啟用USCI_x_SPI模塊。然后啟用中斷(如果需要)。建議在開啟中斷前先開啟USCI_x_SPI模塊。然后使用USCI_x_SPI_transmitData()初始化數據傳輸,然后當設置接收標志時,使用USCI_x_SPI_receiveData()讀取接收到的數據,這表明RX/TX操作已經完成。
???????要將模塊配置為從機模式,可以使用USCI_x_SPI_initSlave()進行初始化
然后使用USCI_x_SPI_enable()啟用模塊。在此之后,中斷可能
在需要時啟用。當設置接收標志時,首先使用USCI_x_SPI_transmitData()傳輸數據,然后使用USCI_x_SPI_receiveData()接收數據。
???????USCI_x_SPI API被分成3組函數:
處理狀態和初始化的函數,
處理數據的函數,
以及管理中斷的函數。
處理狀態和初始化的函數
USCI_A_SPI_initMaster(uint16_t baseAddress, USCI_A_SPI_initMasterParam ?param) //初始化SPI主機模式 USCI_A_SPI_initSlave(uint16_t baseAddress, uint8_t msbFirst, uint8_t clockPhase, uint8_t clockPolarity) //初始化SPI從機模式 USCI_A_SPI_disable(uint16_t baseAddress) //禁用SPI模塊 USCI_A_SPI_enable(uint16_t baseAddress) //啟用SPI模塊 USCI_A_SPI_changeMasterClock(uint16_t baseAddress, USCI_A_SPI_changeMasterClockParam ?param) //初始化SPI主時鐘。在這個函數調用的末尾,SPI模塊被保留為啟用狀態 USCI_A_SPI_isBusy(uint16_t baseAddress) //指示SPI總線是否繁忙 USCI_B_SPI_initMaster(uint16_t baseAddress, USCI_B_SPI_initMasterParam ?param) //初始化SPI主機模式 USCI_B_SPI_initSlave(uint16_t baseAddress, uint8_t msbFirst, uint8_t clockPhase, uint8_t clockPolarity) //初始化SPI從機模式 USCI_B_SPI_disable(uint16_t baseAddress) //禁用SPI模塊 USCI_B_SPI_enable(uint16_t baseAddress) //啟用SPI模塊 USCI_B_SPI_changeMasterClock(uint16_t baseAddress, USCI_B_SPI_changeMasterClockParam ?param) //初始化SPI主時鐘。在這個函數調用的末尾,SPI模塊被保留為啟用狀態 USCI_B_SPI_isBusy(uint16_t baseAddress) //指示SPI總線是否繁忙參數
baseAddress
USCI_A0_BASE USCI_A1_BASE USCI_B0_BASE USCI_B1_BASEUSCI_A_SPI_initMasterParam
//***************************************************************************** // //! \brief Used in the USCI_A_SPI_initMaster() function as the param parameter. // //***************************************************************************** typedef struct USCI_A_SPI_initMasterParam {//! Selects Clock source.//! \n Valid values are://! - \b USCI_A_SPI_CLOCKSOURCE_ACLK//! - \b USCI_A_SPI_CLOCKSOURCE_SMCLKuint8_t selectClockSource;//! Is the frequency of the selected clock sourceuint32_t clockSourceFrequency;//! Is the desired clock rate for SPI communicationuint32_t desiredSpiClock;//! Controls the direction of the receive and transmit shift register.//! \n Valid values are://! - \b USCI_A_SPI_MSB_FIRST//! - \b USCI_A_SPI_LSB_FIRST [Default]uint8_t msbFirst;//! Is clock phase select.//! \n Valid values are://! - \b USCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT [Default]//! - \b USCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXTuint8_t clockPhase;//! \n Valid values are://! - \b USCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH//! - \b USCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW [Default]uint8_t clockPolarity; } USCI_A_SPI_initMasterParam;USCI_B_SPI_initMasterParam
//***************************************************************************** // //! \brief Used in the USCI_B_SPI_initMaster() function as the param parameter. // //***************************************************************************** typedef struct USCI_B_SPI_initMasterParam {//! Selects Clock source.//! \n Valid values are://! - \b USCI_B_SPI_CLOCKSOURCE_ACLK//! - \b USCI_B_SPI_CLOCKSOURCE_SMCLKuint8_t selectClockSource;//! Is the frequency of the selected clock sourceuint32_t clockSourceFrequency;//! Is the desired clock rate for SPI communicationuint32_t desiredSpiClock;//! Controls the direction of the receive and transmit shift register.//! \n Valid values are://! - \b USCI_B_SPI_MSB_FIRST//! - \b USCI_B_SPI_LSB_FIRST [Default]uint8_t msbFirst;//! Is clock phase select.//! \n Valid values are://! - \b USCI_B_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT [Default]//! - \b USCI_B_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXTuint8_t clockPhase;//! \n Valid values are://! - \b USCI_B_SPI_CLOCKPOLARITY_INACTIVITY_HIGH//! - \b USCI_B_SPI_CLOCKPOLARITY_INACTIVITY_LOW [Default]uint8_t clockPolarity; } USCI_B_SPI_initMasterParam;msbFirst
//controls the direction of the receive and transmit shift register. Valid values are: USCI_A_SPI_MSB_FIRST USCI_A_SPI_LSB_FIRST //[Default]clockPhase
//is clock phase select. Valid values are: USCI_A_SPI_PHASE_DATA_CHANGED_ONFIRST_CAPTURED_ON_NEXT //[Default] USCI_A_SPI_PHASE_DATA_CAPTURED_ONFIRST_CHANGED_ON_NEXTclockPolarity
//Valid values are: USCI_A_SPI_CLOCKPOLARITY_INACTIVITY_HIGH USCI_A_SPI_CLOCKPOLARITY_INACTIVITY_LOW [Default]USCI_A_SPI_changeMasterClockParam
//***************************************************************************** // //! \brief Used in the USCI_A_SPI_changeMasterClock() function as the param //! parameter. // //***************************************************************************** typedef struct USCI_A_SPI_changeMasterClockParam {//! Is the frequency of the selected clock sourceuint32_t clockSourceFrequency;//! Is the desired clock rate for SPI communicationuint32_t desiredSpiClock; } USCI_A_SPI_changeMasterClockParam;USCI_B_SPI_changeMasterClockParam
//***************************************************************************** // //! \brief Used in the USCI_B_SPI_changeMasterClock() function as the param //! parameter. // //***************************************************************************** typedef struct USCI_B_SPI_changeMasterClockParam {//! Is the frequency of the selected clock sourceuint32_t clockSourceFrequency;//! Is the desired clock rate for SPI communicationuint32_t desiredSpiClock; } USCI_B_SPI_changeMasterClockParam;處理數據的函數
USCI_A_SPI_transmitData(uint16_t baseAddress, uint8_t transmitData) //從SPI模塊傳輸一個字節 USCI_A_SPI_receiveData(uint16_t baseAddress) //接收已發送到SPI模塊的字節 USCI_B_SPI_transmitData(uint16_t baseAddress, uint8_t transmitData) //從SPI模塊傳輸一個字節 USCI_B_SPI_receiveData(uint16_t baseAddress) //接收已發送到SPI模塊的字節參數
baseAddress
USCI_A0_BASE USCI_A1_BASE USCI_B0_BASE USCI_B1_BASEtransmitData
從SPI模塊傳輸的數據
管理中斷的函數
USCI_A_SPI_disableInterrupt(uint16_t baseAddress, uint8_t mask) //禁用單個SPI中斷源 USCI_A_SPI_enableInterrupt(uint16_t baseAddress, uint8_t mask) //啟用單個SPl中斷源 USCI_A_SPI_getInterruptStatus(uint16_t baseAddress, uint8_t mask) //獲取當前SPI中斷狀態 USCI_A_SPI_clearInterrupt(uint16_t baseAddress, uint8_t mask) //清除選擇的SPl中斷狀態標志 USCI_B_SPI_disableInterrupt(uint16_t baseAddress, uint8_t mask) //禁用單個SPI中斷源 USCI_B_SPI_enableInterrupt(uint16_t baseAddress, uint8_t mask) //啟用單個SPl中斷源 USCI_B_SPI_getInterruptStatus(uint16_t baseAddress, uint8_t mask) //獲取當前SPI中斷狀態 USCI_B_SPI_clearInterrupt(uint16_t baseAddress, uint8_t mask) //清除選擇的SPl中斷狀態標志參數
baseAddress
USCI_A0_BASE USCI_A1_BASE USCI_B0_BASE USCI_B1_BASEUSCI_A_SPI 的 mask
/*is the bit mask of the interrupt sources to be disabled. Mask value is the logical OR of any of the following:*/ USCI_A_SPI_TRANSMIT_INTERRUPT USCI_A_SPI_RECEIVE_INTERRUPTUSCI_B_SPI 的 mask
/*is the bit mask of the interrupt sources to be disabled. Mask value is the logical OR of any of the following:*/ USCI_B_SPI_TRANSMIT_INTERRUPT USCI_B_SPI_RECEIVE_INTERRUPTDMA相關
USCI_A_SPI_getReceiveBufferAddressForDMA(uint16_t baseAddress) //返回DMA模塊的SPI的RX緩沖區的地址 USCI_A_SPI_getTransmitBufferAddressForDMA(uint16_t baseAddress) //返回DMA模塊的SPI的TX緩沖區的地址 USCI_B_SPI_getReceiveBufferAddressForDMA(uint16_t baseAddress) //返回DMA模塊的SPI的RX緩沖區的地址 USCI_B_SPI_getTransmitBufferAddressForDMA(uint16_t baseAddress) //返回DMA模塊的SPI的TX緩沖區的地址參數
baseAddress
USCI_A0_BASE USCI_A1_BASE USCI_B0_BASE USCI_B1_BASE總結
以上是生活随笔為你收集整理的MSP430F5529 DriverLib 库函数学习笔记(九)SPI的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机实用知识风云初动,风云初动 第一节
- 下一篇: django model filter