本帖最后由 xiaojuan 于 2014-9-22 16:00 編輯
出自枯葉之蝶的博客
SPI串行同步接口(有時(shí)鐘脈沖)
串行外設(shè)接口(Serial Peripheral Interface,SPI)模塊是用于同外部外設(shè)和其他單片機(jī)器件進(jìn)行 通信的同步串行接口。這些外設(shè)可以是串行EEPROM、移位寄存器、顯示驅(qū)動(dòng)器和模數(shù)轉(zhuǎn)換器 (ADC)或音頻編解碼器。 
SPIx 串行接口由以下四個(gè)引腳組成:(可由引腳的映射確定四個(gè)引腳)?? SDIx:串行數(shù)據(jù)輸入 ?? SDOx:串行數(shù)據(jù)輸出 ?? SCKx:移位時(shí)鐘輸入或輸出 ?? SSx:低動(dòng)態(tài)功耗從選擇或幀同步I/O 脈沖 
主模式下SPI 模塊的工作原理如下所述: 一句話概括:數(shù)據(jù)由用戶寫(xiě)入SPIxbuf然后裝入SPIXTXB發(fā)送緩沖區(qū)移入移位寄存器SPIxSR,僅當(dāng)存在待發(fā)送數(shù)據(jù)時(shí)波特發(fā)生器才產(chǎn)生對(duì)應(yīng)數(shù)據(jù)位模式的時(shí)鐘脈沖,一個(gè)脈沖一個(gè)數(shù)據(jù)位同步從移位寄存器SPIxSR發(fā)送至數(shù)據(jù)輸出引腳SDOX。 1. 一旦模塊設(shè)置為主模式工作并使能,待發(fā)送數(shù)據(jù)就會(huì)寫(xiě)入SPIxBUF 寄存器。 SPITBE 位(SPIxSTAT<3>)清零。 2. SPIxTXB 的內(nèi)容移入移位寄存器SPIxSR (見(jiàn)圖23-8),且模塊將SPITBE 位清零。 3. 一組8/16/32 個(gè)時(shí)鐘脈沖將8/16/32 位發(fā)送數(shù)據(jù)從SPIxSR 移出到SDOx 引腳,同時(shí)將 SDIx 引腳的數(shù)據(jù)移入SPIxSR。 4. 當(dāng)傳輸結(jié)束時(shí),將發(fā)生以下事件: a) 中斷標(biāo)志位SPIxRXIF 置1。通過(guò)將中斷允許位SPIxRXIE 置1 來(lái)允許SPI 中斷。 SPIxRXIF 標(biāo)志不會(huì)被硬件自動(dòng)清零。 b) 此外,當(dāng)正在進(jìn)行的發(fā)送和接收操作結(jié)束時(shí), SPIxSR 的內(nèi)容將移入SPIxRXB。 c) 模塊將SPIRBF 位(SPIxSTAT<0>)置1,指示接收緩沖區(qū)已滿。一旦用戶代碼讀取了 SPIxBUF,硬件就會(huì)將SPIRBF 位清零。在增強(qiáng)型緩沖模式下, SPIRBE 位(SPIxSTAT<5>) 會(huì)在SPIxRXB FIFO 緩沖區(qū)全空時(shí)置1,在不全空時(shí)清零。 5. 當(dāng)SPI 模塊需要將數(shù)據(jù)從SPIxSR 傳輸?shù)絊PIxRXB 時(shí),如果SPIRBF 位置1 (接收緩沖
區(qū)滿),模塊會(huì)將SPIROV 位(SPIxSTAT<6>)置1,指示產(chǎn)生了溢出條件。
6. 只要SPITBE 位(SPIxSTAT<3>)置1,用戶軟件就可以在任何時(shí)候?qū)⒋l(fā)送數(shù)據(jù)寫(xiě)入
SPIxBUF。寫(xiě)操作可以與SPIxSR移出先前寫(xiě)入的數(shù)據(jù)同時(shí)發(fā)生,因此可以允許連續(xù)發(fā)送。
在增強(qiáng)型緩沖模式下,SPITBF 位(SPIxSTAT<1>)會(huì)在SPIxTXB FIFO 緩沖區(qū)全滿時(shí)置
1, 在不全滿時(shí)清零。
SPITBE:SPI 發(fā)送緩沖區(qū)空狀態(tài)位(1)(empty)
1 = 發(fā)送緩沖區(qū)SPIxTXB 為空
0 = 發(fā)送緩沖區(qū)SPIxTXB 非空
當(dāng)SPI 將數(shù)據(jù)從SPIxTXB 傳輸?shù)絊PIxSR 時(shí),該位由硬件自動(dòng)置1。
當(dāng)通過(guò)寫(xiě)SPIxBUF 裝入SPIxTXB 時(shí),該位由硬件自動(dòng)清零。
SPITBF:SPI 發(fā)送緩沖區(qū)滿狀態(tài)位(1)(full)
1 = 發(fā)送尚未開(kāi)始, SPIxTXB 為滿
0 = 發(fā)送緩沖區(qū)未滿
標(biāo)準(zhǔn)緩沖模式:
當(dāng)內(nèi)核通過(guò)寫(xiě)SPIxBUF 存儲(chǔ)單元裝入SPIxTXB 時(shí),該位由硬件自動(dòng)置1。
當(dāng)SPI 模塊將數(shù)據(jù)從SPIxTXB 傳輸?shù)絊PIxSR 時(shí),該位由硬件自動(dòng)清零。
增強(qiáng)型緩沖模式:
當(dāng)FIFO 中沒(méi)有可用空間時(shí)置1。 CKE:SPI 時(shí)鐘邊沿選擇位(edge)
1 = 串行輸出數(shù)據(jù)在時(shí)鐘從工作狀態(tài)轉(zhuǎn)變?yōu)榭臻e狀態(tài)時(shí)變化(見(jiàn)CKP 位)
0 = 串行輸出數(shù)據(jù)在時(shí)鐘從空閑狀態(tài)轉(zhuǎn)變?yōu)楣ぷ鳡顟B(tài)時(shí)變化(見(jiàn)CKP 位)
CKP:時(shí)鐘極性選擇位(polarity)
1 = 空閑狀態(tài)時(shí)時(shí)鐘信號(hào)為高電平;工作狀態(tài)時(shí)為低電平
0 = 空閑狀態(tài)時(shí)時(shí)鐘信號(hào)為低電平;工作狀態(tài)時(shí)為高電平 
當(dāng)僅當(dāng)移位寄存器SPIXSR有待發(fā)送數(shù)據(jù)時(shí),產(chǎn)生時(shí)鐘脈沖,由CKP決定時(shí)鐘空閑極性,由
CKE決定數(shù)據(jù)發(fā)送的時(shí)鐘沿。
例如8位數(shù)據(jù)模式,產(chǎn)生8個(gè)時(shí)鐘脈沖,每個(gè)時(shí)鐘脈沖發(fā)送一位數(shù)據(jù),實(shí)現(xiàn)同步發(fā)送數(shù)據(jù)。傳輸完一條數(shù)據(jù)后產(chǎn)生中斷SPIxRXIF(在SPIxBUF 接收緩沖區(qū)中匯集新數(shù)據(jù)時(shí),將會(huì)發(fā)生該事件。) 1 主模式工作
要將SPI 模塊設(shè)置為主模式工作,請(qǐng)執(zhí)行以下步驟:
1. 禁止相應(yīng)IECx 寄存器中的SPI 中斷。 mSPI1TXIntEnable(0);//發(fā)送完成中斷
2. 通過(guò)清零ON 位停止并復(fù)位SPI 模塊。 SPI1CON=0; //清零15位
3. 清除接收緩沖區(qū)。 rData=SPI1BUF; //讀取SPI緩沖區(qū)數(shù)據(jù)后清零
4. 如果使用標(biāo)準(zhǔn)緩沖模式,則將ENHBUF 位(SPIxCON<16>)清零,如果使用增強(qiáng)型緩沖
模式,則將它置1。 SPI1CONCLR=0X10000;
5. 如果不希望使用SPI 中斷,則跳過(guò)此步驟并繼續(xù)步驟5。否則,需要執(zhí)行以下附加步驟:
a) 清零相應(yīng)IFSx 寄存器中的SPIx 中斷標(biāo)志/ 事件。
b) 在相應(yīng)的IPCx 寄存器中寫(xiě)入SPIx 中斷優(yōu)先級(jí)位和子優(yōu)先級(jí)位。
c) 將相應(yīng)IECx 寄存器中的SPIx 中斷允許位置1。
6. 寫(xiě)入波特率發(fā)生器寄存器SPIxBRG。
7. 清零SPIROV 位(SPIxSTAT<6>)。
8. 將所需的設(shè)置寫(xiě)入SPIxCON 寄存器,且MSTEN (SPIxCON<5>) = 1。
9. 通過(guò)將ON 位(SPIxCON<15>)置1 使能SPI 工作。
10. 將待發(fā)送數(shù)據(jù)寫(xiě)入SPIxBUF 寄存器。發(fā)送(和接收)在數(shù)據(jù)寫(xiě)入SPIxBUF 寄存器時(shí)立即
開(kāi)始。 一. 配置引腳映射(由實(shí)際所需引腳情況決定)
PPSOutput(2, RPB8, SDO2); 或RPB8Rbits.RPB8R=0B0100;
PPSInput(2,SDI2,RPB13); 或 SDI2bits.SDI2=0B0011;
二. 初始化SPI
用庫(kù)函數(shù)SpiChnOpen(SpiChannel chn, SpiOpenFlags oFlags, unsigned int srcClkDiv);
SPIChannel 通道1、2即SPI1/SPI2,
SpiOpenFlags開(kāi)啟的配置(見(jiàn)庫(kù)函數(shù)SPI.h) 附一
例如SpiOpenFlags oFlags = SPI_OPEN_MSTEN | SPI_OPEN_CKP_HIGH | SPI_OPEN_MODE8 | SPI_OPEN_ON;
主模式,時(shí)鐘空閑時(shí)高電位,8位數(shù)據(jù)模式,開(kāi)啟SPI。其他默認(rèn)0
srcClkDi 波特對(duì)外設(shè)時(shí)鐘的分頻,從而決定發(fā)送數(shù)據(jù)時(shí)鐘脈沖速度
FSCK=FPB/(2*(SPIxBRG+1)) BRG為9位寄存器(0—511) FSCK(FPB/2—FPB/1024) 2 從模式工作
要將SPI 模塊設(shè)置為從工作模式,請(qǐng)執(zhí)行以下步驟:
1. 如果使用中斷,禁止相應(yīng)IECx 寄存器中的SPI 中斷。
2. 通過(guò)清零ON 位,停止并復(fù)位SPI 模塊。
3. 清除接收緩沖區(qū)。
4. 如果使用標(biāo)準(zhǔn)緩沖模式,則將ENHBUF 位(SPIxCON<16>)清零,如果使用增強(qiáng)型緩沖
模式,則將它置1。
5. 如果要使用中斷,則需要執(zhí)行以下附加步驟:
a) 清零相應(yīng)IFSx 寄存器中的SPIx 中斷標(biāo)志/ 事件。
b) 在相應(yīng)的IPCx 寄存器中寫(xiě)入SPIx 中斷優(yōu)先級(jí)位和子優(yōu)先級(jí)位。
c) 將相應(yīng)IECx 寄存器中的SPIx 中斷允許位置1。
6. 清零SPIROV 位(SPIxSTAT<6>)。
7. 將所需的設(shè)置寫(xiě)入SPIxCON 寄存器,且MSTEN (SPIxCON<5>) = 0。
8. 通過(guò)將ON 位(SPIxCON<15>)置1 使能SPI 工作。
9. 發(fā)送(及接收)會(huì)在主器件提供串行時(shí)鐘時(shí)立即開(kāi)始。
在從模式下,當(dāng)SCKx引腳上出現(xiàn)外部時(shí)鐘脈沖時(shí)開(kāi)始發(fā)送和接收數(shù)據(jù)。CKP位(SPIxCON<6>)
和CKE 位(SPIxCON<8>)決定數(shù)據(jù)在時(shí)鐘的哪個(gè)邊沿發(fā)送。
一. 配置引腳映射(由實(shí)際所需引腳情況決定)
PPSOutput(2, RPB8, SDO2); 或RPB8Rbits.RPB8R=0B0100;
PPSInput(2,SDI2,RPB13); 或 SDI2bits.SDI2=0B0011;
二. 初始化SPI
用庫(kù)函數(shù)SpiChnOpen(SpiChannel chn, SpiOpenFlags oFlags, unsigned int srcClkDiv);
SPIChannel 通道1、2即SPI1/SPI2,
SpiOpenFlags開(kāi)啟的配置(見(jiàn)庫(kù)函數(shù)SPI.h)
例如
SpiOpenFlags oFlags =
SPI_OPEN_SLVEN | SPI_OPEN_SSEN | SPI_OPEN_CKP_HIGH | SPI_OPEN_MODE8 | SPI_OPEN_ON;
從模式,從選擇使能SSx 引腳用于從模式,時(shí)鐘空閑時(shí)高電位,8位數(shù)據(jù)模式,開(kāi)啟SPI。其他默認(rèn)0
srcClkDi 波特對(duì)外設(shè)時(shí)鐘的分頻,從而決定發(fā)送數(shù)據(jù)時(shí)鐘脈沖速度
FSCK=FPB/(2*(SPIxBRG+1)) BRG為9位寄存器(0—511) FSCK(FPB/2—FPB/1024) 從模式下提供了以下附加特性:
?? 從選擇同步
SSx 引腳允許同步從模式。如果SSEN 位(SPIxCON<7>)置1,則僅當(dāng)SSx 引腳被驅(qū)動(dòng)
為低電平時(shí),才能使能從模式下的發(fā)送和接收。要使SSx 引腳用作輸入,就不能驅(qū)動(dòng)端口輸
出或其他外設(shè)輸出。如果SSEN 位置1 且SSx 引腳被驅(qū)動(dòng)為高電平, SDOx 引腳將不再被
驅(qū)動(dòng)并且將變?yōu)槿龖B(tài),即使模塊在發(fā)送過(guò)程中也是如此。下次SSx 引腳被驅(qū)動(dòng)為低電平時(shí),
將使用SPIxTXB 寄存器中保存的數(shù)據(jù)重新嘗試進(jìn)行被中止的發(fā)送。如果SSEN 位未置1,則
SSx 引腳不影響從模式下模塊的工作。

?? SPITBE 狀態(tài)標(biāo)志的操作
SPITBE 位(SPIxSTAT<3>)的功能在從工作模式下有所不同。以下介紹了各種從工作模式
設(shè)置下的SPITBE 功能:
- 如果SSEN (SPIxCON<7>)清零,當(dāng)用戶代碼將數(shù)據(jù)裝入SPIxBUF 時(shí), SPITBE 清
零。它在模塊將SPIxTXB 中的數(shù)據(jù)傳輸?shù)絊PIxSR 時(shí)置1。這與主模式下SPITBE 位的
功能類似。
- 如果SSEN 置1,當(dāng)用戶代碼將數(shù)據(jù)裝入SPIxBUF 時(shí),SPITBE 清零。但是,它只有在
SPIx 模塊完成數(shù)據(jù)發(fā)送時(shí)才被置1。當(dāng)SSx 引腳變?yōu)楦唠娖綍r(shí),發(fā)送將被中止,但是可
能在稍后重新嘗試發(fā)送。因此,每個(gè)數(shù)據(jù)字都保存在SPIxTXB 中,直到所有位都被發(fā)
送到接收器中。
其他模式:音頻解碼模式,幀模式詳見(jiàn)數(shù)據(jù)手冊(cè) 中斷
SPI 模塊能夠產(chǎn)生一些中斷,以反映在數(shù)據(jù)通信期間發(fā)生的事件。它可以產(chǎn)生以下類型的中斷:
?? 接收數(shù)據(jù)可用中斷通過(guò)SPI1RXIF 和SPI2RXIF 指示。在SPIxBUF 接收緩沖區(qū)中匯集新數(shù)據(jù)
時(shí),將會(huì)發(fā)生該事件。
?? 發(fā)送緩沖區(qū)為空,中斷通過(guò)SPI1TXIF 和SPI2TXIF 指示。在SPIxBUF 發(fā)送緩沖區(qū)中有可用空
間,可以寫(xiě)入新數(shù)據(jù)時(shí),將會(huì)發(fā)生該事件。
?? 錯(cuò)誤中斷通過(guò)SPI1EIF 和SPI2EIF 指示。 當(dāng)SPIxBUF 接收緩沖區(qū)存在溢出條件(即,匯集
了新的接收數(shù)據(jù),但前一個(gè)數(shù)據(jù)尚未被讀取)、當(dāng)發(fā)送緩沖區(qū)數(shù)據(jù)不足或發(fā)生FRMERR 事
件時(shí),將會(huì)發(fā)生該事件。
bit 3-2 STXISEL<1:0>:SPI 發(fā)送緩沖區(qū)為空的中斷模式位(1,3)
11 = SPIxTXIF 在緩沖區(qū)未滿(具有一個(gè)或多個(gè)空元素)時(shí)置1
10 = SPIxTXIF 在緩沖區(qū)有一半或更多元素為空時(shí)置1
01 = SPIxTXIF 在緩沖區(qū)全空時(shí)置1
00 = SPIxTXIF 在最后一個(gè)傳輸數(shù)據(jù)移出SPISR 并且發(fā)送操作完成時(shí)置1
bit 1-0 RTXISEL<1:0>:SPI 接收緩沖區(qū)為滿的中斷模式位(1,3)
11 = SPIxRXIF 在緩沖區(qū)全滿時(shí)置1
10 = SPIxRXIF 在緩沖區(qū)有一半或更多元素不為空時(shí)置1
01 = SPIxRXIF 在緩沖區(qū)不為空時(shí)置1
00 = SPIxRXIF 在接收緩沖區(qū)中的最后一個(gè)字被讀取(即,緩沖區(qū)為空)時(shí)置1
例1 點(diǎn)亮數(shù)碼管 #include
#pragma config FPLLIDIV = DIV_2 // PLL Input Divider (2x Divider)
#pragma config FPLLMUL = MUL_24 // PLL Multiplier (24x Multiplier)
#pragma config FPLLODIV = DIV_2 // System PLL Output Clock Divider (PLL Divide by 2)
#pragma config FNOSC = FRCPLL // Oscillator Selection Bits (Fast RC Osc with PLL)
#pragma config JTAGEN = OFF // JTAG Enable (JTAG Disabled)
#pragma config FWDTEN = OFF // Watchdog Timer Enable (WDT Disabled (SWDTEN Bit Controls))
char Led[]={0x42, 0xf3, 0x86, 0xa2, 0x33, 0x2a, 0x0a, 0xf2, 0x02, 0x22, 0x40, 0xf1, 0x84, 0xa0, 0x31, 0x28, 0x08, 0xf0, 0x00, 0x20, 0x1e, 0x0e, 0x0f, 0xbf, 0x23, 0x9b, 0x8b};
//led字庫(kù)
void spiout(char image[],int len)
{
int i;
PORTClearBits(IOPORT_B, BIT_9);
for (i = 0; i < len; i++)
{
SpiChnPutC(2, image[ i]);
}
for(i=0;i<60;i++); //等待數(shù)據(jù)存儲(chǔ)成功
PORTSetBits(IOPORT_B, BIT_9); //鎖存數(shù)據(jù)顯示
}
int main()
{
PPSOutput(2, RPB8, SDO2);
//輸出針腳組2中,查表將針腳RPB8,作為數(shù)據(jù)輸出2口SDO2.實(shí)際連線也是如此
SpiOpenFlags oFlags = SPI_OPEN_MSTEN | SPI_OPEN_CKP_HIGH | SPI_OPEN_MODE8 | SPI_OPEN_ON;//作為主機(jī),時(shí)鐘脈沖空閑時(shí)高電位,8位數(shù)據(jù)模式,SPI使能
SpiChnOpen(2, oFlags, 6);//打開(kāi)通道2即SDO2,配置SPI,分頻fpbDiv(2~1024).波特率BR=Fpb/fpbDiv
PORTSetPinsDigitalOut(IOPORT_B, BIT_9);//外部移位寄存器數(shù)據(jù)鎖存,1鎖存,0開(kāi)放
// SPI2CONCLR=(1<<15); SPI2CONCLR=0X8000; 多種操作
spiout(Led,4);
}
數(shù)碼管說(shuō)明
所用芯片74HC595內(nèi)部有8位移位寄存器和一個(gè)存儲(chǔ)器,移位寄存器和存儲(chǔ)寄存器具有獨(dú)立的時(shí)鐘信號(hào),數(shù)據(jù)在移位寄存器時(shí)鐘信號(hào)SHCP的上升沿輸入,在存儲(chǔ)寄存器時(shí)鐘信號(hào)STCP的上升沿進(jìn)入到存儲(chǔ)寄存器中去,移位寄存器有一個(gè)串行移位輸入DS、一個(gè)串行輸出Q7’和一個(gè)異步的低電平復(fù)位MR,由于PIC32MX的輸入/輸出端口的輸出高電平為電壓3.3V,不能直接驅(qū)動(dòng)5V供電的芯片74HC595,采用了的二極管與上拉電阻構(gòu)成的電平轉(zhuǎn)換匹配電路,電路簡(jiǎn)單可靠成本低。
當(dāng)SDO腳接收到PIC32MX的SPI輸出的一個(gè)低電平信號(hào)時(shí),二極管導(dǎo)通,此時(shí)OUT1為一個(gè)低電平信號(hào);當(dāng)SDO腳接收到一個(gè)高電平信號(hào)時(shí),二極管的OUT1端經(jīng)過(guò)上拉電阻連接到5V,以輸出高于4V以上的高電平信號(hào),從而實(shí)現(xiàn)電平轉(zhuǎn)換的匹配功能。

當(dāng)需要使用多個(gè)七段數(shù)碼管顯示時(shí),可進(jìn)行如下處理:各個(gè)74HC595共用SHCP與STCP時(shí)鐘信號(hào),前一級(jí)74HC595的Q7’依次接到下一級(jí)74HC595的DS。 
當(dāng)數(shù)據(jù)全部移入所有74HC595的移位寄存器時(shí),所有74HC595的移位寄存器都已經(jīng)更新后,利用SLCK信號(hào)將數(shù)據(jù)全部移入鎖存到存儲(chǔ)寄存器,從而實(shí)現(xiàn)LED顯示信號(hào)的鎖存與顯示。 附一 typedef enum
{
// master opening mode 主
SPI_OPEN_MSTEN = _SPIxCON_MASK_(MSTEN_MASK), // set the Master mode
SPI_OPEN_SMP_END = _SPIxCON_MASK_(SMP_MASK), // Master Sample Phase for the input bit at the end of the data out time. Otherwise data is sampled in the middle.
SPI_OPEN_MSSEN = _SPIxCON_MASK_(MSSEN_MASK), // enable the driving of the Slave Select (SS) output pin by the Master
SPI_OPEN_MSSEN_HIGH = _SPIxCON_MASK_(FRMPOL_MASK), // Master driven SS output active high. Otherwise low. // slave opening mode 從
SPI_OPEN_SLVEN = 0, // set the Slave mode
SPI_OPEN_SSEN = _SPIxCON_MASK_(SSEN_MASK), // enable the SS input pin. SPI_OPEN_MCLKSEL = _SPIxCON_MASK_(MCLKSEL_MASK),
// clocking opening mode 時(shí)鐘
SPI_OPEN_CKP_HIGH = _SPIxCON_MASK_(CKP_MASK), // set the clock polarity to (idle-high, active-low). Otherwise is (idle-low, active-high).
SPI_OPEN_CKE_REV = _SPIxCON_MASK_(CKE_MASK), // set the Clock Edge reversed: transmit from active to idle. Otherwise transmit when clock goes from idle to active // data characters opening mode 數(shù)據(jù)
SPI_OPEN_MODE8 = 0, // set 8 bits/char
SPI_OPEN_MODE16 = _SPIxCON_MASK_(MODE16_MASK), // set 16 bits/char
SPI_OPEN_MODE32 = _SPIxCON_MASK_(MODE32_MASK), // set 32 bits/char // framed mode opening mode 幀高級(jí)
SPI_OPEN_FRMEN = _SPIxCON_MASK_(FRMEN_MASK), // Enable the Framed SPI support. Otherwise the Framed SPI is disabled.
SPI_OPEN_FSP_IN = _SPIxCON_MASK_(FRMSYNC_MASK), // Frame Sync Pulse (FSP) direction set to input (Frame Slave).
// Otherwise the FSP is output and the SPI channel operates as a Frame Master.
SPI_OPEN_FSP_HIGH = _SPIxCON_MASK_(FRMPOL_MASK), // FSP polarity set active high. Otherwise the FSP is active low.
SPI_OPEN_FSP_CLK1 = _SPIxCON_MASK_(SPIFE_MASK), // Set the FSP to coincide with the 1st bit clock.
// Otherwise the FSP precedes the 1st bit clock
SPI_OPEN_FSP_WIDE = _SPIxCON_MASK_(FRMSYPW_MASK), // set the FSP one character wide. Otherwise the FSP is one clock wide. SPI_OPEN_FRM_CNT1 = (0 << _SPIxCON_MASK_(FRMCNT_POSITION)), // set the number of characters per frame (Frame Counter) to 1 (default)
SPI_OPEN_FRM_CNT2 = (1 << _SPIxCON_MASK_(FRMCNT_POSITION)), // set the Frame Counter to 2
SPI_OPEN_FRM_CNT4 = (2 << _SPIxCON_MASK_(FRMCNT_POSITION)), // set the Frame Counter to 4
SPI_OPEN_FRM_CNT8 = (3 << _SPIxCON_MASK_(FRMCNT_POSITION)), // set the Frame Counter to 8
SPI_OPEN_FRM_CNT16 = (4 << _SPIxCON_MASK_(FRMCNT_POSITION)), // set the Frame Counter to 16
SPI_OPEN_FRM_CNT32 = (5 << _SPIxCON_MASK_(FRMCNT_POSITION)), // set the Frame Counter to 32 // enhanced buffer (FIFO) opening mode 增強(qiáng)型緩存及中斷模式
SPI_OPEN_ENHBUF = _SPIxCON_MASK_(ENHBUF_MASK), // enable the enhanced buffer mode SPI_OPEN_TBE_NOT_FULL = (3 << _SPIxCON_MASK_(STXISEL_POSITION)), // Tx Buffer event issued when Tx buffer not full (at least one slot empty)
SPI_OPEN_TBE_HALF_EMPTY = (2 << _SPIxCON_MASK_(STXISEL_POSITION)), // Tx Buffer event issued when Tx buffer >= 1/2 empty
SPI_OPEN_TBE_EMPTY = (1 << _SPIxCON_MASK_(STXISEL_POSITION)), // Tx Buffer event issued when Tx buffer completely empty
SPI_OPEN_TBE_SR_EMPTY = (0 << _SPIxCON_MASK_(STXISEL_POSITION)), // Tx Buffer event issued when the last character is shifted out of the internal Shift Register
// and the transmit is complete SPI_OPEN_RBF_FULL = (3 << _SPIxCON_MASK_(SRXISEL_POSITION)), // Rx Buffer event issued when RX buffer is full
SPI_OPEN_RBF_HALF_FULL = (2 << _SPIxCON_MASK_(SRXISEL_POSITION)), // Rx Buffer event issued when RX buffer is >= 1/2 full
SPI_OPEN_RBF_NOT_EMPTY = (1 << _SPIxCON_MASK_(SRXISEL_POSITION)), // Rx Buffer event issued when RX buffer is not empty
SPI_OPEN_RBF_EMPTY = (0 << _SPIxCON_MASK_(SRXISEL_POSITION)), // Rx Buffer event issued when RX buffer is empty (the last character in the buffer is read). // general opening mode 常用
SPI_OPEN_DISSDO = _SPIxCON_MASK_(DISSDO_MASK), // disable the usage of the SDO pin by the SPI
SPI_OPEN_DISSDI = _SPIxCON_MASK_(DISSDI_MASK), // disable the usage of the SDI pin by the SPI
SPI_OPEN_SIDL = _SPIxCON_MASK_(SIDL_MASK ), // enable the Halt in the CPU Idle mode. Otherwise the SPI will be still active when the CPU is in Idle mode.
SPI_OPEN_ON = _SPIxCON_MASK_(ON_MASK ), // turn ON the SPI (not used in SpiChnOpen)
}SpiOpenFlags; // open flags that can be used with SpiChnOpen. Defined in the processor header file. 轉(zhuǎn)載請(qǐng)注明出處謝謝 |