?? spi_master.c
字號:
/////SPI調試程序//////////
/////SPI_master.c//////////////
#include <C8051F040.h>
typedef unsigned char uchar;
typedef unsigned int uint;
enum {aalen=6};
xdata uchar aa[aalen]={0x81,0x82,0x83,0x84,0x85,0x86};
xdata uchar rr[aalen];
xdata uchar k;
xdata uchar t;
void delay1ms(uint time){//延遲1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void spi_cfg(uchar spicfg,uchar spickr,uchar spicn){//SPI配置函數
SFRPAGE = 0x00;
SPI0CFG = spicfg;
SPI0CKR = spickr;
SPI0CN = spicn;
EIE1|= 0x01;
}
void config (void) {
WDTCN = 0x07; //看門狗禁止
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x02;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x00;
P0MDOUT = 0x02;
/*交叉開關配置,SPI總線SCK配置到P0.0口,為開漏輸出;MISO為P0.1口,推挽輸出;MOSI為P0.2口,開漏輸出,NSS為P0.3口開漏輸出*/
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
//采用內部晶振,為24.5MHZ8分頻
} //End of config
void main(){
config();
spi_cfg(0x50,0x2d,0x08);
/*
SPI0CFG = 0x50; 主機模式,SCK高電平為空閑,因為SCK采用上拉設計
SPI0CKR = 0x2D; 波特率設置,系統時鐘為3MHZ,所以SCK約為32KHZ
SPI0CN = 0x08;
系統為四線制單主機模式,且主機NSS輸出為0,注意此時SPIEN為0,SPI尚未開啟
*/
EA=1;
k=0;
SFRPAGE=0x00;
SPIEN=1;//開啟SPI
SPI0DAT=aa[k];//當對SPI0SAT寫數據時,SPI總線傳輸開始
while(1){
if(SPIEN==0)
k=0;//總線釋放時,中斷程序中將SPIEN清零,在此設斷點可全速運行SPI至總線釋放
}
}
void spi_ISR() interrupt 6{//SPI中斷
SFRPAGE=0x00;
if(k>=aalen)
SPIEN=0;//數據發送完畢,將SPIEN清零,釋放總線
if(WCOL)//寫沖突處理,暫無處理
WCOL=0;
if(MODF)//模式錯誤處理,暫無處理
MODF=0;
if(RXOVRN){//接收緩沖區溢出處理
t=SPI0DAT;//t為接收數據暫存變量
RXOVRN=0;
}
while(!TXBMT);
/*查詢上次發送是否結束,因為有很多狀態均可使SPI進入中斷,所以查詢上次發送是否結束,以保證寫發送緩沖區時不會對數據造成破壞*/
rr[k]=SPI0DAT;//由于是全雙工總線,在發送完一個字節時,主機也收到從機所發的數據
k++;
SPI0DAT=aa[k];//發送數據
SPIF=0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -