📄 spi01.org.c
字号:
/************************
SPI One board Test
SPI0: Master Tx
SPI1: Slave Rx
************************/
#include <string.h>
#include "2460addr.h"
#include "2460lib.h"
#include "spi01.h"
#include "pll.h"
#define spitx_count 0x50
#define spirx_count 0x50
#define SPI_BUFFER0 _NONCACHE_STARTADDRESS
#define SPI_BUFFER1 _NONCACHE_STARTADDRESS+0x1000
#define DMA1_RxBUFFER0 _NONCACHE_STARTADDRESS+0x2000
#define DMA1_TxBUFFER0 _NONCACHE_STARTADDRESS+0x3000
#define DMA3_RxBUFFER1 _NONCACHE_STARTADDRESS+0x4000
#define DMA3_TxBUFFER1 _NONCACHE_STARTADDRESS+0x5000
#define FORMAT0_A 1
#define FORMAT1_A 1
void __irq Spi0_Int(void);
void __irq Spi01_Int(void);
void __irq Spi10_Int(void);
void __irq Dma1Tx_Int(void);//SPI 0
void __irq DmaTx_Int(void);
volatile char *spi0TxStr,*spi0RxStr;
volatile char *spi1TxStr,*spi1RxStr;
volatile int end0SpiTx;
volatile int endSpi1Tx;
unsigned char *tx0_ptr;
unsigned char *tx1_ptr;
unsigned char *rx0_ptr;
unsigned char *rx1_ptr;
volatile int tx_dma1Done;
volatile int rx_dma1Done;
volatile int tx_dma3Done;
volatile int rx_dma3Done;
unsigned int spi_rGPHCON, spi_rGPHDAT,spi_rGPHPU;
extern unsigned int Pclk;
/****************************************************************
* SMDK24A0 SPI configuration *
* GP15=XspiMOSI1, GP16=XspiMISO, GP17=XspiCLK *
****************************************************************/
void * spi_func[][2]=
{
(void*) Test_Spi0_MS_int, "SPI0 RxTx Int ",
(void *)Test_Spi0_MS_poll, "SPI0 RxTx POLL ",
(void *)Test_Spi01_MS_Int, "SPI0:Master, SPI1:Slave INT ",
(void *)Test_Spi01_SM_Int, "SPI0:Slave, SPI1:Master INT ",
(void *)Test_SPI01_MS_DMA, "SPI0:Master(Tx), SPI1:Slave(Rx) DMA",
(void *)Test_SPI01_MS_DMA_RxTx, "SPI0:Master(Rx), SPI1:Slave(Tx) DMA",
(void *)Test_Spi01_SM_DMA_RxTx, "SPI0:Slave(Rx), SPI1:Master(Tx) DMA",
(void *)Test_Spi01_SM_DMA_TxRx, "SPI0:Slave(Tx), SPI1:Master(Rx) DMA",
0,0
};
void Ch15_SPI(void)
{
while(1)
{
int i = 0;
printf("\n");
while(1)
{ //display menu
printf("%2d:%s\n",i,spi_func[i][1]);
i++;
if((int)(spi_func[i][0])==0)
{
printf("\n");
break;
}
//if((i%3)==0)
//printf("\n");
}
printf("\nSelect the function to test : ");
i = GetIntNum();
printf("\n");
if(i==-1) break;
if(i>=0 && (i<(sizeof(spi_func)/8)) )
( (void (*)(void)) (spi_func[i][0]) )();
}
}
int ClockSelection(void)
{
int i;
printf("Clock selection 0.PCLK/2 1.PCLK/4 2.PCLK/6 ... 63.PCLK/128 \n");
i = GetIntNum();
if ( (i<0)||(i>63) ) i = 0;
return i;
}
void __irq Spi01_Int(void)
{
unsigned int status, status1;
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
rINTSUBMSK|=BIT_SUB_SPI1;
ClearPending(BIT_IIC_SPI);
rSUBSRCPND=BIT_SUB_SPI0;
rSUBSRCPND=BIT_SUB_SPI1;
status=rSPSTA0;
status1=rSPSTA1;
if(status&0x6)
printf("Data Collision or Multi Master Error0(0x%x)!!!\n", status);
if(status1&0x6)
printf("Data Collision or Multi Master Error1(0x%x)!!!\n", status1);
while(!((status&0x1)&&(status1&0x1))); //Check ready state
*spi0RxStr++=rSPRDAT0; //First Rx data is garbage data
*spi1RxStr++=rSPRDAT1;
// printf("Rx0: %c Tx0: %c Rx1: %c Tx1: %c\n", rSPRDAT0, *spi0TxStr, rSPRDAT1, *spi1TxStr);
// printf("Rx1: %c Tx1: %c\n", rSPRDAT1, *spi1TxStr);
if((*spi0TxStr!='\0') && (*spi1TxStr!='\0'))
{
rSPTDAT0=*spi0TxStr++;
rSPTDAT1=*spi1TxStr++;
rINTMSK&=~BIT_IIC_SPI;
rINTSUBMSK&=~BIT_SUB_SPI0;
rINTSUBMSK&=~BIT_SUB_SPI1;
}
else
{
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
rINTSUBMSK|=BIT_SUB_SPI1;
end0SpiTx=1;
endSpi1Tx=1;
}
}
void __irq Spi10_Int(void)
{
unsigned int status, status1;
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
rINTSUBMSK|=BIT_SUB_SPI1;
ClearPending(BIT_IIC_SPI);
rSUBSRCPND=BIT_SUB_SPI0;
rSUBSRCPND=BIT_SUB_SPI1;
status=rSPSTA0;
status1=rSPSTA1;
if(status&0x6)
printf("Data Collision or Multi Master Error0(0x%x)!!!\n", status);
if(status1&0x6)
printf("Data Collision or Multi Master Error1(0x%x)!!!\n", status1);
while(!((status&0x1)&&(status1&0x1))); //Check ready state
*spi1RxStr++=rSPRDAT1;
*spi0RxStr++=rSPRDAT0; //First Rx data is garbage data
// printf("Rx0: %c Tx0: %c Rx1: %c Tx1: %c\n", rSPRDAT0, *spi0TxStr, rSPRDAT1, *spi1TxStr);
// printf("Rx1: %c Tx1: %c\n", rSPRDAT1, *spi1TxStr);
if((*spi0TxStr!='\0') && (*spi1TxStr!='\0'))
{
rSPTDAT1=*spi1TxStr++;
rSPTDAT0=*spi0TxStr++;
rINTMSK&=~BIT_IIC_SPI;
rINTSUBMSK&=~BIT_SUB_SPI0;
rINTSUBMSK&=~BIT_SUB_SPI1;
}
else
{
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
rINTSUBMSK|=BIT_SUB_SPI1;
end0SpiTx=1;
endSpi1Tx=1;
}
}
void __irq Spi0_Int(void)
{
unsigned int status;
rINTMSK|=BIT_IIC_SPI;
rINTSUBMSK|=BIT_SUB_SPI0;
ClearPending(BIT_IIC_SPI);
rSUBSRCPND|=BIT_SUB_SPI0;
status=rSPSTA0;
if(status&0x6)
printf("Data Collision or Multi Master Error(0x%x)!!!\n", status);
while(!(status&0x1)); //Check ready state
*spi0RxStr++=rSPRDAT0; //First Rx data is garbage data
if(*spi0TxStr!='\0') {
rSPTDAT0=*spi0TxStr++;
rINTMSK&=~BIT_IIC_SPI;
rINTSUBMSK&=~BIT_SUB_SPI0;
}
else
{
// rINTMSK|=BIT_IIC_SPI;
// rINTSUBMSK|=BIT_SUB_SPI0;
end0SpiTx=1;
}
}
void SPI_Port_Set(void)
{
spi_rGPHCON=rGPHCON;
spi_rGPHDAT=rGPHDAT;
spi_rGPHPU=rGPHPU;
}
void SPI0_Port_Init(MASorSLV)
{
// rGPHPU=rGPHPU&~(0x7<<12)|(1<<14);//Disable sclk. Enable MISO, MOSI.
rGPHPU=rGPHPU&~(0xf<<12);//Disable sclk. Enable MISO, MOSI.
if(MASorSLV==1)
{
rGPHDAT|=(1<<15); // Master(GPHCON_Output=High)
rGPHCON=rGPHCON&~(0xff<<24)|(0x6a<<24); // Master(GPHCON15_Output)
}
else if (MASorSLV==0) rGPHCON=rGPHCON&~(0xff<<24)|(0xaa<<24);
}
void SPI1_Port_Init(MASorSLV)
{
// rGPHPU=rGPHPU&~(0x7<<4)|(1<<6);//Disable sclk. Enable MISO, MOSI.
rGPHPU=rGPHPU&~(0xf<<4);//Disable sclk. Enable MISO, MOSI.
if(MASorSLV==1)
{
rGPHDAT|=(1<<7); // Master(GPHCON_Output=High)
rGPHCON=rGPHCON&~(0xff<<8)|(0x7f<<8); // Master(GPHCON15_Output)
}
else if (MASorSLV==0) rGPHCON=rGPHCON&~(0xff<<8)|(0xff<<8);
}
void SPI_Port_Return(void)
{
rGPHCON=spi_rGPHCON;
rGPHDAT=spi_rGPHDAT;
rGPHPU=spi_rGPHPU;
}
void Master_nSS_Con0(int Set)
{
rGPHDAT=rGPHDAT&~(1<<15)|(Set<<15);
// rGPHCON=rGPHCON&~(3<<30)|(1<<30);
}
void Master_nSS_Con1(int Set)
{
rGPHDAT=rGPHDAT&~(1<<7)|(Set<<7);
// rGPHCON=rGPHCON&~(3<<14)|(1<<14);
}
/*
void Slave_nSS(void)
{
rGPHCON=rGPHCON&~((0x3<<30)|(0x3<<14))|(0x2<<30)|(0x3<<14);
}
*/
void Test_Spi0_MS_int(void)
{
char *txStr,*rxStr;
SPI_Port_Set();
SPI0_Port_Init(1);
printf("[SPI0 Interrupt Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI0 into SPIMISO0.\n");
pISR_IIC_SPI=(unsigned)Spi0_Int;
end0SpiTx=0;
spi0TxStr="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
spi0RxStr=(char *) SPI_BUFFER0;
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
rSPPRE0=ClockSelection(); // Baudrate=PCLK/2
rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//int,en-SCK,master,low,A,normal
rSPPIN0=(0<<2)|(1<<1)|(0<<0);//dis-ENMUL,SBO,release
rINTMSK=~(BIT_IIC_SPI);
rINTSUBMSK=~(BIT_SUB_SPI0);
while(end0SpiTx==0);
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
*spi0RxStr='\0';//attach End of String(Null)
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s :",rxStr+1);//remove first dummy data
if(strcmp(rxStr+1,txStr)==0)
printf("O.K.\n");
else
printf("ERROR!!!\n");
SPI_Port_Return();
}
void Test_Spi0_MS_poll(void)
{
char *txStr,*rxStr;
SPI_Port_Set();
SPI0_Port_Init(1);
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI0 into SPIMISO0.\n");
end0SpiTx=0;
spi0TxStr="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
spi0RxStr=(char *) SPI_BUFFER0;
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
rSPPRE0=ClockSelection(); //if PCLK=50Mhz,SPICLK=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(end0SpiTx==0)
{
if(rSPSTA0&0x1) //Check Tx ready state
{
if(*spi0TxStr!='\0')
rSPTDAT0=*spi0TxStr++;
else
end0SpiTx=1;
while(!(rSPSTA0&0x1)); //Check Rx ready state
*spi0RxStr++=rSPRDAT0;
}
}
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,dis-SCK,master,low,A,normal
*(spi0RxStr-1)='\0';//remove last dummy data & 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");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -