?? spi.c
字號:
/************************************************
//
// File Name :
// Description : SPI One board Test
// SPI0: Master Tx
// SPI1: Slave Rx
// Version :
// Date :
//
************************************************/
#include <stdio.h>
#include <string.h>
#include "def.h"
#include "option.h"
#include "2413addr.h"
#include "Console.h"
#include "System.h"
#include "spi.h"
#define SPI_BUFFER0 _NONCACHE_STARTADDRESS
#define SPI_BUFFER1 _NONCACHE_STARTADDRESS+0x1000
volatile char *spi0TxStr,*spi0RxStr;
volatile char *spi1TxStr,*spi1RxStr;
volatile int endSpi0Tx;
volatile int endSpi1Tx;
U32 spi0_rGPECON, spi0_rGPEDAT,spi0_rGPEDN;
U32 spi1_rGPGCON, spi1_rGPGDAT,spi1_rGPGDN;
int bufCnt;
int EFlag,FFlag;
void * spi_function[][2]=
{
(void *)Test_Spi0_Loopback_poll, "SPI0 Loopback POLL ",
(void *)Test_Spi1_Loopback_poll, "SPI1 Loopback POLL ",
(void *)Test_Spi0_Loopback_int, "SPI0 Loopback Int ",
(void *)Test_Spi1_Loopback_int, "SPI1 Loopback Int ",
(void *)Test_Spi0_LB_fifo_txint_rxint, "SPI0 Loopback Fifo TxInt RxInt",
(void *)Test_Spi0_M_Int, "SPI0:Master INT B2B ",
(void *)Test_Spi0_S_Int, "SPI0:Slave INT B2B ",
0,0
};
void Ch21_SPI(void)
{
int i;
printf("\n====== SPI Test program start ======\n");
while(1)
{
i=0;
printf("\n\n");
while(1)
{ //display menu
printf("%2d:%s",i,spi_function[i][1]);
i++;
if((int)(spi_function[i][0])==0)
{
printf("\n");
break;
}
// if((i%2)==0)
printf("\n");
}
printf("\nPress Enter key to exit : ");
i = GetIntNum();
if(i==-1) break; // return.
if(i>=0 && (i<((sizeof(spi_function)-1)/8)) ) // select and execute...
( (void (*)(void)) (spi_function[i][0]) )();
}
printf("\n====== SPI Test program end ======\n");
}
void Test_Spi0_Loopback_poll(void)
{
char *txStr,*rxStr;
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0.\n");
endSpi0Tx=0;
spi0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // Tx Data to send
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
SPI_Baud_Rate_Set(0, 25000000); // SPI Channel 0, 25MHz
rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
while(endSpi0Tx==0)
{
if(REDY0) //Check Tx ready state
{
if(*spi0TxStr!='\0')
rSPTDAT0=*spi0TxStr++;
else {
endSpi0Tx=1;
break;
}
while(!(REDY0_org)); //Check Rx ready state
*spi0RxStr++=rSPRDATB0;
}
}
*spi0RxStr='\0'; // attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
SPI_Port_Return();
}
void Test_Spi1_Loopback_poll(void)
{
U32 i;
char *txStr,*rxStr;
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 1 into SPIMISO 1.\n");
endSpi1Tx=0;
spi1TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
SPI_Port_Init(1);
SPI_Baud_Rate_Set(1, 25000000); // SPI Channel 0, 1MHz
rSPCON1=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
rSPPIN1=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
while(endSpi1Tx==0)
{
if(REDY1) //Check Tx ready state
{
if(*spi1TxStr!='\0')
rSPTDAT1=*spi1TxStr++;
else {
endSpi1Tx=1;
break;
}
while(!(REDY1_org)); //Check Rx ready state
*spi1RxStr++=rSPRDATB1;
}
}
*spi1RxStr='\0'; // attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
SPI_Port_Return();
}
void Test_Spi0_Loopback_int(void)
{
char *txStr,*rxStr;
printf("[SPI Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0.\n");
endSpi0Tx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
SPI_Baud_Rate_Set(0, 25000000); // SPI Channel 0, 25MHz
rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
pISR_SPI0=(unsigned)Spi0_Int;
rINTMSK&=~(BIT_SPI0);
while(endSpi0Tx==0);
*spi0RxStr='\0'; // attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
SPI_Port_Return();
}
#if 0 // Original Code
void Test_Spi0_LB_fifo_txint_rxpoll(void)
{
char *txStr,*rxStr,i;
printf("[SPI FIFO Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0.\n");
endSpi0Tx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
SPI_Baud_Rate_Set(0, 500000); // SPI Channel 0, 0.5MHz
ClearPending(BIT_SPI0);
pISR_SPI0=(unsigned)Spi0_Fifo_TxInt;
rINTMSK&=~(BIT_SPI0);
rSPSTA0 = (1<<8); // Tx FIFO Empty Error Clear
printf("rSPSTA0 : 0x%x\n",rSPSTA0);
rSPCON0=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON0>>10)&0x3 == 3);
if((rSPSTA0>>6)&0x1) printf("Not empty\n");
rSPPIN0=(1<<3)|(0<<2)|(0<<1)|(1<<0);//dis-ENMUL,SBO,keep
rSPFIC0=(1<<2)|(0<<1)|(1<<0);// Tx FIFO empty Error, Rx FIFO Full Int Disable,Tx FIFO Empty Int Enable,
// rSPFIC0|=(1<<4);// Tx FIFO almost Int Enable
rSPCON0=(1<<9)|(1<<8)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Rx,Tx Fifo En,en-SCK,master,low,A,normal
// rSPCON0 |= (1<<12); // Tx FIFO almost level 10-byte
rSPSTA0 = (1<<8); // Tx FIFO Empty Error Clear
#if 1
bufCnt=0;
// for(i=0;i<16;i++,bufCnt++)
rSPTXFIFO0=*spi0TxStr++;
#endif
while(1){
while((rSPSTA0>>6)&0x1) { // Rx Fifo not empty ? => 0:empty, 1:not empty
*spi0RxStr++= rSPRXFIFO0;
}
if(spi0RxStr == (rxStr + sizeof(char)*72)) break;
}
rSPFIC0 = 0; // FIFO Int Disable
rSPCON0&=~(3<<8); // FIFO disable
*spi0RxStr='\0'; // attach End of String(Null)
printf("\n");
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
spi0RxStr=(char *) SPI_BUFFER0;
for(i=0;i<100;i++) *spi0RxStr++='\0';
printf("Tx Buf Cnt : %d\n",bufCnt);
SPI_Port_Return();
}
void __irq Spi0_Fifo_TxInt(void)
{
int i;
rINTMSK|=BIT_SPI0;
ClearPending(BIT_SPI0);
if((rSPSTA0>>8)&0x1){
// printf("Tx Fifo Empty Error");
printf("F");
// printf("B rSPSTA0 : 0x%x\n",rSPSTA0);
rSPSTA0 = (1<<8);
// printf("A rSPSTA0 : 0x%x\n",rSPSTA0);
// rINTMSK&=~BIT_SPI0;
// return;
}
while((rSPSTA0>>5)&0x1){ // Tx Fifo not full ? => 0:full, 1:not full
if(*spi0TxStr!='\0') { // TxStr is End ? => 0:End, 1:Not End
rSPTXFIFO0=*spi0TxStr++; // Write to SPTXFIFO
bufCnt++;
}
else {
endSpi0Tx=1;
return;
}
}
rINTMSK&=~BIT_SPI0;
}
#else
void Test_Spi0_LB_fifo_txint_rxint(void)
{
char *txStr,*rxStr;
int i,j;
EFlag=0;
FFlag=0;
printf("[SPI FIFO Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0.\n");
endSpi0Tx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
printf("Input :");
j=GetIntNum();
printf("\n");
// SPI_Baud_Rate_Set(0, 1000000); // SPI Channel 0, 0.5MHz
SPI_Baud_Rate_Set(0, j); // SPI Channel 0, 0.5MHz
ClearPending(BIT_SPI0);
pISR_SPI0=(unsigned)Spi0_Fifo_TxRxInt;
rINTMSK&=~(BIT_SPI0);
rSPSTA0 = (1<<8); // Tx FIFO Empty Error Clear
printf("rSPSTA0 : 0x%x\n",rSPSTA0);
rSPCON0=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON0>>10)&0x3 == 3);
if((rSPSTA0>>6)&0x1) printf("Not empty\n");
rSPPIN0=(1<<3)|(0<<2)|(0<<1)|(1<<0);//dis-ENMUL,SBO,keep
rSPFIC0=(0<<2)|(1<<1)|(1<<0);// Tx FIFO empty Error, Rx FIFO Full Int Disable,Tx FIFO Empty Int Enable,
// rSPFIC0|=(1<<4);// Tx FIFO almost Int Enable
rSPCON0=(1<<9)|(1<<8)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Rx,Tx Fifo En,en-SCK,master,low,A,normal
rSPCON0 |= (1<<12); // Tx FIFO almost level 4-byte
// rSPSTA0 = (1<<8); // Tx FIFO Empty Error Clear
// printf("rSPSTA0 : 0x%x\n",rSPSTA0);
rSPTXFIFO0=*spi0TxStr++;
rSPSTA0 = (1<<8); // Tx FIFO Empty Error Clear
while(1){
if(endSpi0Tx==1) { // Tx End ?
while(((rSPSTA0>>4)&0x1)==0); // Tx FIFO Empty ?
break;
}
}
while((rSPSTA0>>6)&0x1)
*spi0RxStr++= rSPRXFIFO0;
rINTMSK|=BIT_SPI0;
printf("rSPSTA0 : 0x%x\n",rSPSTA0);
rSPFIC0 = 0; // FIFO Int Disable
rSPCON0&=~(3<<8); // FIFO disable
*spi0RxStr='\0'; // attach End of String(Null)
printf("\n");
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
spi0RxStr=(char *) SPI_BUFFER0;
for(i=0;i<100;i++) *spi0RxStr++='\0';
printf("EFlag : %d\n",EFlag);
printf("FFlag : %d\n",FFlag);
SPI_Port_Return();
}
void __irq Spi0_Fifo_TxRxInt(void)
{
rINTMSK|=BIT_SPI0;
ClearPending(BIT_SPI0);
// while( ((rSPSTA0>>5)&0x1)&&(rSPFIC0&0x1) ){ // Tx Fifo not full ? => 0:full, 1:not full
while( ((rSPSTA0>>10)&0x1)&&(rSPFIC0&0x1) ){ // Tx Fifo not full ? => 0:full, 1:not full
if(*spi0TxStr!='\0') { // TxStr is End ? => 0:End, 1:Not End
rSPTXFIFO0=*spi0TxStr++; // Write to SPTXFIFO
}
else {
rSPFIC0 &= ~(1<<0); // Tx Empty Int Disable
endSpi0Tx=1;
}
}
while((rSPSTA0>>6)&0x1) { // Rx Fifo not empty ? => 0:empty, 1:not empty
*spi0RxStr++= rSPRXFIFO0;
}
rINTMSK&=~BIT_SPI0;
}
#endif
#if 0 // Original Code
void Test_Spi0_LB_fifo_txpoll_rxint(void)
{
char *txStr,*rxStr;
int i;
printf("[SPI FIFO Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0.\n");
endSpi0Tx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
SPI_Baud_Rate_Set(0, 500000); // SPI Channel 0, 0.5MHz
pISR_SPI0=(unsigned)Spi0_Fifo_RxInt;
rINTMSK&=~(BIT_SPI0);
rSPCON0=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON0>>10)&0x3 == 3);
rSPPIN0=(1<<3)|(0<<2)|(0<<1)|(1<<0);//dis-ENMUL,SBO,keep
rSPFIC0=(1<<3)|(1<<1)|(0<<0);// Rx Error Int En, Rx FIFO Full Int Enable,Tx FIFO Empty Int Disable,
rSPFIC0|=(1<<5);// Rx FIFO almost Int Enable
rSPCON0=(1<<9)|(1<<8)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Rx,Tx Fifo En,en-SCK,master,low,A,normal
bufCnt=0;
while(endSpi0Tx==0){
while((rSPSTA0>>5)&0x1){ // Tx Fifo not full ? => 0:full, 1:not full
if(*spi0TxStr!='\0') { // TxStr is End ? => 0:End, 1:Not End
rSPTXFIFO0=*spi0TxStr++; // Write to SPTXFIFO
bufCnt++;
}
else {
while((rSPSTA0>>4)&0x1);
endSpi0Tx=1;
break;
}
}
printf("P");
}
while((rSPSTA0>>6)&0x1) {
*spi0RxStr++= rSPRXFIFO0;
}
*spi0RxStr='\0'; // attach End of String(Null)
printf("\n");
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
spi0RxStr=(char *) SPI_BUFFER0;
for(i=0;i<100;i++) *spi0RxStr++='\0';
printf("Tx Buf Cnt : %d\n",bufCnt);
SPI_Port_Return();
}
void __irq Spi0_Fifo_RxInt(void)
{
rINTMSK|=BIT_SPI0;
ClearPending(BIT_SPI0);
printf("F");
if((rSPSTA0>>9)&0x1) { // Buffer full?
printf("Rx Fifo Full");
printf("TxFifoCnt : %d\n",bufCnt);
rINTMSK&=~BIT_SPI0;
return;
}
while((rSPSTA0>>6)&0x1){ // Rx Fifo empty ? => 0:empty, 1:not empty
*spi0RxStr++= rSPRXFIFO0;
}
rINTMSK&=~BIT_SPI0;
}
#else
void Test_Spi0_LB_fifo_txpoll_rxint(void)
{
char *txStr,*rxStr;
int i,j;
printf("[SPI FIFO Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0.\n");
endSpi0Tx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
printf("Input :");
j=GetIntNum();
printf("\n");
// SPI_Baud_Rate_Set(0, 10000000); // SPI Channel 0, 0.5MHz
SPI_Baud_Rate_Set(0, j); // SPI Channel 0, 0.5MHz
pISR_SPI0=(unsigned)Spi0_Fifo_RxInt;
rINTMSK&=~(BIT_SPI0);
rSPCON0=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON0>>10)&0x3 == 3);
rSPPIN0=(1<<3)|(0<<2)|(0<<1)|(1<<0);//dis-ENMUL,SBO,keep
rSPFIC0=(0<<3)|(1<<1)|(0<<0);// Rx Error Int En, Rx FIFO Full Int Enable,Tx FIFO Empty Int Disable,
rSPFIC0|=(1<<5);// Rx FIFO almost Int Enable
rSPCON0=(1<<14)|(1<<9)|(1<<8)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Rx,Tx Fifo En,en-SCK,master,low,A,normal
bufCnt=0;
while(endSpi0Tx==0){
while((rSPSTA0>>5)&0x1){ // Tx Fifo not full ? => 0:full, 1:not full
if(*spi0TxStr!='\0') { // TxStr is End ? => 0:End, 1:Not End
rSPTXFIFO0=*spi0TxStr++; // Write to SPTXFIFO
bufCnt++;
}
else {
while(((rSPSTA0>>4)&0x1)==0); // Tx FIFO Empty ?
endSpi0Tx=1;
break;
}
if((rSPSTA0>>8)&0x1) { rSPSTA0 = (1<<8); printf("E"); }
if((rSPSTA0>>9)&0x1) { rSPSTA0 = (1<<9); printf("F"); }
}
// printf("P");
if((rSPSTA0>>8)&0x1) { rSPSTA0 = (1<<8); printf("E"); }
if((rSPSTA0>>9)&0x1) { rSPSTA0 = (1<<9); printf("F"); }
}
while((rSPSTA0>>6)&0x1) {
*spi0RxStr++= rSPRXFIFO0;
}
*spi0RxStr='\0'; // attach End of String(Null)
printf("\n");
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr);
if(strcmp(rxStr,txStr)==0) printf("O.K.\n");
else printf("ERROR!!!\n");
spi0RxStr=(char *) SPI_BUFFER0;
for(i=0;i<100;i++) *spi0RxStr++='\0';
printf("Tx Buf Cnt : %d\n",bufCnt);
SPI_Port_Return();
}
void __irq Spi0_Fifo_RxInt(void)
{
rINTMSK|=BIT_SPI0;
ClearPending(BIT_SPI0);
while((rSPSTA0>>6)&0x1) // Rx Fifo empty ? => 0:empty, 1:not empty
*spi0RxStr++= rSPRXFIFO0;
rINTMSK&=~BIT_SPI0;
}
#endif
void Test_Spi0_M_Fifo(void)
{
char *txStr,*rxStr,i;
printf("[SPI FIFO Tx-Test]\n");
endSpi0Tx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ9876543210ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // Tx Data to send
txStr=(char *)spi0TxStr;
SPI_Port_Init(0);
SPI_Baud_Rate_Set(0, 1000000); // SPI Channel 0, 1MHz
ClearPending(BIT_SPI0);
pISR_SPI0=(unsigned)Spi0_M_Fifo;
rINTMSK&=~(BIT_SPI0);
rSPCON0=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON0>>10)&0x3 == 3); // Wait for FIFO Clear
rSPSTA0 = ((1<<9)|(1<<8)); // Rx FIFO Full Error, Tx FIFO Empty Error CLEAR
while((rSPSTA0>>8)&0x3 == 0); // Wait for FIFO Error Clear
rSPPIN0=(1<<3)|(0<<2)|(0<<1)|(1<<0); //Use Feedback clk, dis-ENMUL,SBO, Keep
rSPFIC0=(0<<1)|(1<<0); // Rx FIFO Full Int Disable,Tx FIFO Empty Int Enable,
rSPCON0=(0<<9)|(1<<8)|(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0); //Rx,Tx Fifo En,en-SCK,master,low,A,normal
Master_nSS_Con0(0); // Activate nSS
rSPTXFIFO0=*spi0TxStr++;
while(1){
if(endSpi0Tx==1) {
while(((rSPSTA0>>4)&0x1)==0); // Tx FIFO Empty ?
break;
}
}
Master_nSS_Con0(1);
printf("\n");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -