?? 備份spi_receive_ok.c
字號:
/*************************************************
//spi communication (正式版)
//design by zhixing_yuan 7.6.2006
//mcu type:c8051f221
//i/o define:nss:p2.3; sck:p2.0; mosi:p2.2; miso:p2.1; /int0 p0.2
//led footpint: data--p1.0--p1.6 choose--p0.3--p0.7 p0.0
//function:dir是控制連通MISO還是MOSI,每次數據包括5個字節組成一貞數據,DATA ID,DATA0,DATA1,DATA2,CHECKSUM(校驗和),數據將通過SPI發送與接收
描述:在接收完一個數據之后,要往SPI0DAT寫0
*************************************************/
#include <c8051f200.h>
#define uchar unsigned char
#define size 9
sbit EN=P0^2;
sbit NSS=P2^3;
sbit dir=P2^4;
uchar spi_index;
uchar spi_Data[size];
uchar DataID,Data0,Data1,Data2,CheckSum;
uchar spi_Receivedata;
/************************************
//名稱:delay()
//功能: 延時小程序
//輸入:無
//返回:無
************************************/
void delay(void)
{
int i, j;
for(i=0;i<1000;i++) j=i;
}
/**********************************************
//名稱:System_init()
//功能:系統初始化函數
//輸入:無
//返回:無
**********************************************/
void System_init(void)
{
PRT0MX = 0x04; //INT0 routed to Port Pin
PRT1MX = 0x00;
PRT2MX = 0x01; //Weak Pull-ups Disabled,SPI Bus I/O Enable
PRT0CF = 0x0ff; //IO口為推挽輸出
PRT1CF = 0x0ff;
PRT2CF = 0x0ff;
P0MODE = 0x0ff; //輸入使能
P1MODE = 0x0ff;
P2MODE = 0x0ff;
unsigned char fos_holdtime;
OSCXCN = 0x67; //起動外部時鐘
//int i ;//晶振部分
//int j;
//for(i=0;i<2000;i++)j=i; //等待1MS以上的時間
for(fos_holdtime=0;fos_holdtime<8;fos_holdtime++)
{
delay();
}
while (!(OSCXCN & 0x80)); //等待起振
OSCICN = 0x08; //使用外部時鐘
EA = 0; //看門狗——關
WDTCN = 0x0de;
WDTCN = 0x0ad; //disable WDTz
IE = 0x00; //關中斷
EIE1 = 0x01; //使能SPI中斷
EIE2 = 0x00; //禁止其他多余中斷
// IE = 0x01; //只開int0
EA = 1 ;
SPI0CFG = 0x47; //CKPHA=0,CKPOL=1,8位幀長
SPI0CN = 0x01; //使能SPI總線,設為從端
SPI0CKR = 0x04; //SPI時鐘選0
NSS = 0x01 ; //disable nss
EN=1;
}
/**************************************
//名稱: putData()
//功能:把數據轉換成LED顯示的數據
//輸入:16之內的數
//返回:LED格式的數據
**************************************/
uchar putData(uchar D)
{
uchar z;
switch (D)
{
case 0 : z = 0x3f; break;
case 1 : z = 0x06; break;
case 2 : z = 0x5b; break;
case 3 : z = 0x4f; break;
case 4 : z = 0x66; break;
case 5 : z = 0x6d; break;
case 6 : z = 0x7d; break;
case 7 : z = 0x27; break;
case 8 : z = 0x7f; break;
case 9 : z = 0x6f; break;
case 10 : z = 0x77; break;
case 11 : z = 0x7c; break;
case 12 : z = 0x39; break;
case 13 : z = 0x5e; break;
case 14 : z = 0x79; break;
case 15 : z = 0x71; break;
default : z = D; //錯誤顯示o
}
return z;
}
/****************************************************
//名稱: display()
//功能:把3個SPI數據,在LED上顯示出來
//輸入:DATA0,DATA1,DATA2
//返回:無
****************************************************/
void display(uchar data1,uchar data2,uchar data3)
{
uchar D;
D = data1 ;
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0xf7); //select D1L 1
delay();
D = data2;
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x0ef); //select D1H 2
delay();
D = data3 ;
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x0df); //select D2L 3
delay();
D = spi_Data[4];
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x0bf); //select D2H 4
delay();
D = spi_Data[5] ;
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x07f); //select D3L 5
delay();
D = spi_Data[6];
P0 = (P0 | 0x0fb);
P1 = ~putData(D);
P0 = ((P0 | 0x0fb) & 0x0fe); //select D3H 6
delay();
delay();
P0 = (P0 | 0x0fb);
}
/*******************************************
//主程序
*******************************************/
void main(void)
{
System_init();
spi_Data[0]=0;
spi_Data[1]=12;
spi_Data[2]=11;
spi_Data[3]=10;
spi_Data[4]=0;
NSS = 1; //禁止從狀態
dir=1; //IO接收狀態
spi_index=1; //接收組1開頭
while(1)
{
display(spi_Data[1],spi_Data[2],spi_Data[3]);
}
}
/*******************************************
// 名稱: int6_isr()
//功能:收到發送中斷,對外發送一組SPI數據
//輸入:無
//返回:無
*******************************************/
void int6_isr(void) interrupt 6 using 1
{
EA=0;
// NSS = 1; //disable spi
spi_Data[5]=SPI0CN;
spi_Data[4]++;
if(WCOL)//寫沖突處理,暫無處理
{spi_Data[5]=10;WCOL=0;}
if(MODF)//模式錯誤處理,暫無處理
{spi_Data[5]=9; MODF=0;}
if(RXOVRN)
{//接收緩沖區溢出處理
spi_Data[5]=8;//t為接收數據暫存變量
RXOVRN=0;
}
spi_Data[spi_index]=SPI0DAT; //read data
SPI0DAT=0; //send '24'
SPI0CN = 0x01;
// delay(); //delay for a time
spi_index++;
if (spi_index>3) //receive data count
spi_index=1;
EA=1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -