www.pudn.com > s3c2443_test_code.zip > spi.c
#include "system.h"
#include "spi_dma.h"
#define rSPTXFIFO1 (*(volatile unsigned *)0x59000018)
#define rSPRXFIFO1 (*(volatile unsigned *)0x5900001C)
#define rSPFIC1 (*(volatile unsigned *)0x59000024)
#define rSPTOV (*(volatile unsigned *)0x59000028)
#define WrSPTDAT1(ch) (*(volatile unsigned char*)0x59000010)=(unsigned char)(ch)
#define RdSPRDAT1() (*(volatile unsigned char*)0x59000014)
#define RdSPRDATB1() (*(volatile unsigned char*)0x59000020)
#define WrSPTXFIFO1(ch) (*(volatile unsigned char*)0x59000018)=(unsigned char)(ch)
#define RdSPRXFIFO1() (*(volatile unsigned char*)0x5900001C)
#define REDY1_org (rSPSTA1>>3)&0x1 // In Slave, for Rx Checking
#define REDY1 rSPSTA1&0x1
#define SPI_BUFFER1 _NONCACHE_STARTADDRESS
volatile char *spi1TxStr,*spi1RxStr;
volatile int endSpi1Tx,endSpi1Rx;
volatile int tx_dmaDone, rx_dmaDone;
volatile int trans_count;
// For SPI Port Recovery
U32 rGPECON_saved;
U32 rGPEUDP_saved;
U32 rGPLCON_saved;
U32 rGPLUDP_saved;
typedef struct tagDMA
{
volatile U32 DISRC; //0x0
volatile U32 DISRCC; //0x4
volatile U32 DIDST; //0x8
volatile U32 DIDSTC; //0xc
volatile U32 DCON; //0x10
volatile U32 DSTAT; //0x14
volatile U32 DCSRC; //0x18
volatile U32 DCDST; //0x1c
volatile U32 DMASKTRIG; //0x20
volatile U32 DMAREQSEL; //0x24
}DMA;
void Test_Spi1_Loopback_Poll(void);
void Test_Spi1_Loopback_Int(void);
void __irq Spi1_LoopBack_Int(void);
void Test_Spi1_M_Buf_Poll(void);
void Test_Spi1_S_Buf_Poll(void);
void Test_Spi1_M_Buf_Int(void);
void Test_Spi1_S_Buf_Int(void);
void __irq Spi1_M_Buf_Int(void);
void __irq Spi1_S_Buf_Int(void);
void Test_Spi1_M_Tx_Buf_DMA(void);
void Test_Spi1_S_Rx_Buf_DMA(void);
void Test_Spi1_M_Rx_Buf_DMA(void);
void Test_Spi1_S_Tx_Buf_DMA(void);
void Set_Spi1_Tx_DMA_Set(U32 ch);
void Set_Spi1_Rx_DMA_Set(U32 ch);
void __irq DmaTx_Int(void);
void __irq DmaRx_Int(void);
void Test_Spi1_M_Tx_Fifo_Int(void);
void Test_Spi1_M_Tx_Fifo_Int2(void);
void Test_Spi1_S_Rx_Fifo_Int(void);
void Test_Spi1_M_Rx_Fifo_Int(void);
void Test_Spi1_S_Tx_Fifo_Int(void);
void Test_Spi1_S_Tx_Fifo_Int2(void);
void __irq Spi1_Tx_fifo_Int(void);
void __irq Spi1_Rx_fifo_Int(void);
void Test_Spi1_M_Tx_Fifo_DMA(void);
void Test_Spi1_S_Rx_Fifo_DMA(void);
void Test_Spi1_M_Rx_Fifo_DMA(void);
void Test_Spi1_S_Tx_Fifo_DMA(void);
void Set_Spi1_Tx_Fifo_DMA(U32 ch);
void Set_Spi1_Rx_Fifo_DMA(U32 ch);
void SPI_Port_Init(void);
void SPI_Port_Recovery(void);
void SPI1_Master_nSS_Con(U32 CSout);
void SPI_Baud_Rate_Set(float BaudRate);
void SPI_Transfer_Format(void);
void * func_spi_test[][2]=
{
// "0123456789012345" max 15ÀÚ ·ÎÇÑÁ¤ÇÏ¿© commentÇϼ¼¿ä.
//SPI
(void *)Test_Spi1_Loopback_Poll, "SPI1 loopback Poll",
(void *)Test_Spi1_Loopback_Int, "SPI1 loopback Int",
(void *)Test_Spi1_M_Buf_Poll, "SPI1:Master (Tx/Rx), Byte Access POLL",
(void *)Test_Spi1_S_Buf_Poll, "SPI1:Slave (Tx/Rx), Byte Access POLL",
(void *)Test_Spi1_M_Buf_Int, "SPI1:Master (Tx/Rx), Byte Access INT",
(void *)Test_Spi1_S_Buf_Int, "SPI1:Slave (Tx/Rx), Byte Access INT",
(void *)Test_Spi1_M_Tx_Buf_DMA, "SPI1:Master (Tx), Byte Access DMA",
(void *)Test_Spi1_S_Rx_Buf_DMA, "SPI1:Slave (Rx), Byte Access DMA",
(void *)Test_Spi1_M_Rx_Buf_DMA, "SPI1:Master (Rx), Byte Access DMA",
(void *)Test_Spi1_S_Tx_Buf_DMA, "SPI1:Slave (Tx), Byte Access DMA",
(void *)Test_Spi1_M_Tx_Fifo_Int, "SPI1:Master (Tx), Fifo INT",
(void *)Test_Spi1_M_Tx_Fifo_Int2, "SPI1:Master (2nd Tx), Fifo INT",
(void *)Test_Spi1_S_Rx_Fifo_Int, "SPI1:Slave (Rx), Fifo INT",
(void *)Test_Spi1_M_Rx_Fifo_Int, "SPI1:Master (Rx), Fifo INT",
(void *)Test_Spi1_S_Tx_Fifo_Int, "SPI1:Slave (Tx), Fifo INT",
(void *)Test_Spi1_S_Tx_Fifo_Int2, "SPI1:Slave (2nd Tx), Fifo INT",
(void *)Test_Spi1_M_Tx_Fifo_DMA, "SPI1:Master (Tx), Fifo DMA",
(void *)Test_Spi1_S_Rx_Fifo_DMA, "SPI1:Slave (Rx), Fifo DMA",
(void *)Test_Spi1_M_Rx_Fifo_DMA, "SPI1:Master (Rx), Fifo DMA",
(void *)Test_Spi1_S_Tx_Fifo_DMA, "SPI1:Slave (Tx), Fifo DMA",
0,0
};
void Test_SPI(void)
{
int i;
while(1)
{
i=0;
printf("\n====== SPI Test program start ======\n\n");
while(1)
{ //display menu
printf("%2d:%s",i,func_spi_test[i][1]);
i++;
if((int)(func_spi_test[i][0])==0)
{
printf("\n");
break;
}
// if((i%4)==0)
printf("\n");
}
printf("\nPress Enter key to exit : ");
i = GetIntNum();
if(i==-1) break; // return.
if(i>=0 && (i<((sizeof(func_spi_test)-1)/8)) ) // select and execute...
( (void (*)(void)) (func_spi_test[i][0]) )();
}
printf("\n====== SPI Test program end ======\n");
}
void Test_Spi1_Loopback_Poll(void)
{
char *txStr,*rxStr;
SPI_Port_Init();
endSpi1Tx=0;
spi1TxStr="Test Spi1 Loop Back Polling Mode acbedgfihkjmlonqpsrutwvyxz 1234567890 ACBEDGFIHKJMLONQPSRUTWVYXZ !@#$%^&*()_+|<>?";
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
SPI_Baud_Rate_Set(25000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x6)|(0<<5)|(1<<4)|(1<<3)|(0<<0);//Polling,en-SCK,master,low,A,normal
rSPPIN1 |= (1<<0);//Feedback Clock Disable, Master Out Keep
SPI1_Master_nSS_Con(0);
#if 1
while(endSpi1Tx==0)
{
if(REDY1) //Check Tx ready state
{
if(*spi1TxStr!='\0')
WrSPTDAT1(*spi1TxStr++);
else {
WrSPTDAT1(*spi1TxStr++); // Transfer last data(NULL Character)
endSpi1Tx=1;
}
while(!(REDY1)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1();
}
}
#else
while(endSpi1Tx==0)
{
if(*spi1TxStr!='\0')
WrSPTDAT1(*spi1TxStr++);
else {
WrSPTDAT1(*spi1TxStr++); // Transfer last data(NULL Character)
endSpi1Tx=1;
}
while(!(REDY1)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1();
}
#endif
SPI1_Master_nSS_Con(1);
*spi1RxStr++=RdSPRDAT1(); // read last data(NULL)
rxStr++; // remove first dummy
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_Recovery();
}
void Test_Spi1_Loopback_Int(void)
{
char *txStr,*rxStr;
SPI_Port_Init();
endSpi1Tx=0;
spi1TxStr="Test Spi1 Loop Back Interrupt Mode 1234567890 ACBEDGFIHKJMLONQPSRUTWVYXZ acbedgfihkjmlonqpsrutwvyxz !@#$%^&*()_+|<>?";
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
SPI_Baud_Rate_Set(25000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x6)|(1<<5)|(1<<4)|(1<<3)|(0<<0);//Interrupt,en-SCK,master
rSPPIN1 |= (1<<0);//Feedback Clock Disable, Master Out Keep
SPI1_Master_nSS_Con(0);
pISR_SPI1=(unsigned)Spi1_LoopBack_Int;
rINTMSK&=~(BIT_SPI1);
while(endSpi1Tx==0);
SPI1_Master_nSS_Con(1);
*spi1RxStr++=RdSPRDAT1();
rxStr++; // remove first dummy
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_Recovery();
}
void __irq Spi1_LoopBack_Int(void)
{
ClearPending(BIT_SPI1);
if(*spi1TxStr!='\0')
WrSPTDAT1(*spi1TxStr++);
else {
WrSPTDAT1(*spi1TxStr++);
endSpi1Tx=1;
rINTMSK|=(BIT_SPI1);
}
while(!(REDY1)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1(); //First Rx data is garbage data
}
void Test_Spi1_M_Buf_Poll(void)
{
char *txStr,*rxStr;
char dummy_read;
printf("[This Board is SPI1(Master TxRx), Another Board are SPI1(Slave TxRx) Poll test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
endSpi1Tx=0;
spi1TxStr="[B2B] Test Spi1 Master Tx/Rx BUF Poll Mode !@#$%^&*()_+|<>?";
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
printf("spi1RxStr:%p\n",spi1RxStr); // for debug
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
dummy_read = RdSPRDAT1();
dummy_read = RdSPRDAT1();
// SPI_Baud_Rate_Set(25000000);
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x6)|(0<<5)|(1<<4)|(1<<3)|(0<<0);//Polling,en-SCK,master,low,A,normal
rSPPIN1 |= (1<<0);//Feedback Clock Disable, Master Out Keep
// rSPPIN1 &= ~(1<<0);//Feedback Clock Disable, Master Out Release
SPI1_Master_nSS_Con(0);
while(endSpi1Tx==0)
{
if(REDY1==1) //Check Tx ready state
{
if(*spi1TxStr!='\0')
WrSPTDAT1(*spi1TxStr++);
else {
endSpi1Tx=1;
WrSPTDAT1(*spi1TxStr++);
}
while(!(REDY1)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1();
}
}
SPI1_Master_nSS_Con(1);
*spi1RxStr++=RdSPRDAT1(); // read last data(NULL)
rxStr++; // remove first dummy
printf("MASTER Tx Strings:%s\n",txStr);
printf("MASTER Rx Strings:%s\n",rxStr);
SPI_Port_Recovery();
}
void Test_Spi1_S_Buf_Poll(void)
{
char *txStr,*rxStr;
char dummy_read;
printf("[This Board is SPI1(Slave TxRx), Another Board are SPI1(Master TxRx) Poll test]\n");
SPI_Port_Init();
endSpi1Tx=0;
spi1TxStr="[B2B] Test Spi1 Savle Tx/Rx BUF Poll Mode ABCDEFGHIJKLMNOP";
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
printf("spi1RxStr:%p\n",spi1RxStr); // for debug
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
dummy_read = RdSPRDAT1();
dummy_read = RdSPRDAT1();
// SPI_Baud_Rate_Set(25000000);
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x7)|(0<<5)|(0<<4)|(0<<3)|(0<<0);//Polling,en-SCK,master
rSPPIN1 |= (1<<0);//Feedback Clock Disable, Master Out Keep
while(endSpi1Tx==0)
{
if(REDY1==1) //Check Tx ready state
{
if(*spi1TxStr!='\0')
WrSPTDAT1(*spi1TxStr++);
else {
endSpi1Tx=1;
WrSPTDAT1(*spi1TxStr++);
}
while(!(REDY1)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1();
}
}
while(!(REDY1_org)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1(); // read last data(NULL)
rxStr++; // remove first dummy
printf("SLAVE Tx Strings:%s\n",txStr);
printf("SLAVE Rx Strings:%s\n",rxStr);
SPI_Port_Recovery();
}
void Test_Spi1_M_Buf_Int(void)
{
char *txStr,*rxStr;
char dummy_read;
printf("[This Board is SPI1(Master TxRx), Another Board are SPI1(Slave TxRx) Int test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
endSpi1Tx=0;
spi1TxStr="[B2B] Test Spi1 Master Tx/Rx BUF Int. Mode ?><|+_)(*&^%$#@!";
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
printf("spi1RxStr:%p\n",spi1RxStr); // for debug
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
dummy_read = RdSPRDAT1();
dummy_read = RdSPRDAT1();
// SPI_Baud_Rate_Set(25000000);
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x6)|(1<<5)|(1<<4)|(1<<3)|(0<<0);//Interrupt,en-SCK,master,normal
rSPPIN1 |= (1<<0);//Feedback Clock Disable, Master Out Keep
// rSPPIN1 &= ~(1<<0);//Feedback Clock Disable, Master Out Release
SPI1_Master_nSS_Con(0);
pISR_SPI1=(unsigned)Spi1_M_Buf_Int;
rINTMSK&=~(BIT_SPI1);
while(endSpi1Tx==0);
SPI1_Master_nSS_Con(1);
*spi1RxStr++=RdSPRDAT1(); // read last data(NULL)
rxStr++; // remove first dummy
printf("MASTER Tx Strings:%s\n",txStr);
printf("MASTER Rx Strings:%s\n",rxStr);
SPI_Port_Recovery();
}
void __irq Spi1_M_Buf_Int(void)
{
ClearPending(BIT_SPI1);
if(*spi1TxStr!='\0')
WrSPTDAT1(*spi1TxStr++);
else {
WrSPTDAT1(*spi1TxStr++);
endSpi1Tx=1;
rINTMSK|=(BIT_SPI1);
}
while(!(REDY1)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1(); //First Rx data is garbage data
}
void Test_Spi1_S_Buf_Int(void)
{
char *txStr,*rxStr;
char dummy_read;
printf("[This Board is SPI1(Slave TxRx), Another Board are SPI1(Master TxRx) Poll test]\n");
SPI_Port_Init();
endSpi1Tx=0;
spi1TxStr="[B2B] Test Spi1 Savle Tx/Rx BUF Int. Mode abcdefghijklmnop";
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
printf("spi1RxStr:%p\n",spi1RxStr); // for debug
txStr=(char *)spi1TxStr;
rxStr=(char *)spi1RxStr;
dummy_read = RdSPRDAT1();
dummy_read = RdSPRDAT1();
// SPI_Baud_Rate_Set(25000000);
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x7)|(1<<5)|(0<<4)|(0<<3)|(0<<0);//Polling,en-SCK,master
rSPPIN1 |= (1<<0);//Feedback Clock Disable, Master Out Keep
pISR_SPI1=(unsigned)Spi1_S_Buf_Int;
rINTMSK&=~(BIT_SPI1);
while(endSpi1Tx==0);
while(!(REDY1_org)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1(); // read last data(NULL)
rxStr++; // remove first dummy
printf("SLAVE Tx Strings:%s\n",txStr);
printf("SLAVE Rx Strings:%s\n",rxStr);
SPI_Port_Recovery();
}
void __irq Spi1_S_Buf_Int(void)
{
ClearPending(BIT_SPI1);
if(*spi1TxStr!='\0')
WrSPTDAT1(*spi1TxStr++);
else {
WrSPTDAT1(*spi1TxStr++);
endSpi1Tx=1;
rINTMSK|=(BIT_SPI1);
}
while(!(REDY1)); //Check Rx ready state
*spi1RxStr++=RdSPRDAT1(); //First Rx data is garbage data
}
void Test_Spi1_M_Tx_Buf_DMA(void)
{
int i;
printf("[This Board is SPI1(Master Tx), Another Board are SPI1(Slave Rx) DMA test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x7)|(2<<5)|(1<<4)|(1<<3)|(0<<0);//DMA,en-SCK,master
rSPPIN1 |= (1<<0);//Feedback Clock Disable, Master Out Keep
SPI1_Master_nSS_Con(0);
Set_Spi1_Tx_DMA_Set(0); // Spi1 Master DMA channel 1 Set
while(tx_dmaDone) {
if(Uart_GetKey())
break;
}
for(i=0;i<400;i++);
SPI1_Master_nSS_Con(1);
rSPCON1=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
SPI_Port_Recovery();
}
void Set_Spi1_Tx_DMA_Set(U32 ch)
{
int i;
unsigned char *tx_ptr;
DMA *pDMA;
tx_ptr=(unsigned char *)(SPI_BUFFER1+0x1000000);
for(i=0;i<76800;i++) {
*tx_ptr++=(unsigned char)(pspi_dma[i]);
*tx_ptr++=(unsigned char)(pspi_dma[i]>>8);
*tx_ptr++=(unsigned char)(pspi_dma[i]>>16);
*tx_ptr++=(unsigned char)(pspi_dma[i]>>24);
}
tx_dmaDone=1;
pISR_DMA = (unsigned)DmaTx_Int; // DMA ISR Address Mapping
switch(ch) {
case 0 :
pDMA=(void *)0x4b000000;
rINTSUBMSK&=~(BIT_SUB_DMA0); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 1 :
pDMA=(void *)0x4b000100;
rINTSUBMSK&=~(BIT_SUB_DMA1); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 2 :
pDMA=(void *)0x4b000200;
rINTSUBMSK&=~(BIT_SUB_DMA2); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 3 :
pDMA=(void *)0x4b000300;
rINTSUBMSK&=~(BIT_SUB_DMA3); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 4 :
pDMA=(void *)0x4b000400;
rINTSUBMSK&=~(BIT_SUB_DMA4); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 5 :
pDMA=(void *)0x4b000500;
rINTSUBMSK&=~(BIT_SUB_DMA5); // Interrupt SUB Mask Disable, Interrupt Enable
break;
default :
pDMA=(void *)0x4b000500;
rINTSUBMSK&=~(BIT_SUB_DMA5); // Interrupt SUB Mask Disable, Interrupt Enable
}
rINTMSK&=~(BIT_DMA); // Interrupt Mask Disable, Interrupt Enable
pDMA->DISRC=(unsigned)(SPI_BUFFER1+0x1000000);
pDMA->DISRCC=(0<<1)|(0<<0); //AHB(Memory), inc
pDMA->DIDST=(unsigned)0x59000010;
pDMA->DIDSTC=(1<<1)|(1); //APB(SPI), fix
pDMA->DCON=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(0x4b001);
//HS|APB|InterruptEn|TransferSize|WholeServ|RelaodOff|DataSize|TransferCount
pDMA->DMAREQSEL=(2<<1)|(1<<0); // HWSRC SPI1 TX
pDMA->DMASKTRIG=(0<<2)|(1<<1)|(0); //run, DMA channel on, no-sw trigger
}
void __irq DmaTx_Int(void)
{
rINTSUBMSK|=(BIT_SUB_DMA0|BIT_SUB_DMA1|BIT_SUB_DMA2|BIT_SUB_DMA3|BIT_SUB_DMA4|BIT_SUB_DMA5);
rINTMSK|=(BIT_DMA);
rSUBSRCPND |= (BIT_SUB_DMA0|BIT_SUB_DMA1|BIT_SUB_DMA2|BIT_SUB_DMA3|BIT_SUB_DMA4|BIT_SUB_DMA5);
ClearPending(BIT_DMA);
tx_dmaDone=0;
}
void Test_Spi1_S_Rx_Buf_DMA(void)
{
unsigned int i,j;
unsigned char *rx_ptr;
unsigned int read_data,dummy_data;
unsigned int ErrCnt;
printf("[One Board SPI1(Master Tx), Another Board SPI1(Slave Rx) DMA test]\n");
SPI_Port_Init();
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x7)|(1<<7)|(3<<5)|(0<<4)|(0<<3)|(0<<0);//DMA,en-SCK,master
rSPPIN1 |= (1<<0);//Feedback Clock Disable, Master Out Keep
Set_Spi1_Rx_DMA_Set(0); // Spi1 Slave DMA channel 1 Set
while(rx_dmaDone) {
if(Uart_GetKey())
break;
}
for(i=0;i<1000;i++);
rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,slave,low,A,normal
rx_ptr=(unsigned char *)(SPI_BUFFER1);
rx_ptr += 2; // dummy removed
printf("Data compare !!\n");
ErrCnt=0;
for(i=0,j=0;i<76800;i++,j+=4) {
read_data = (U32)(*(rx_ptr+j+3)<<24|*(rx_ptr+j+2)<<16|*(rx_ptr+j+1)<<8|*(rx_ptr+j));
if(pspi_dma[i]!=read_data) {
printf("%d Ori [%08x]\t",i,pspi_dma[i]);
printf("Cpy [%08x]\t",read_data);
ErrCnt++;
printf("E");
getchar();
}
}
printf("Error Count : %d\n",ErrCnt);
SPI_Port_Recovery();
}
void Set_Spi1_Rx_DMA_Set(U32 ch)
{
int i;
U32 *ptr_erase;
DMA *pDMA;
ptr_erase = (unsigned int *)(SPI_BUFFER1);
for(i=0;i<76800;i++) {
*ptr_erase++ = 0;
}
rx_dmaDone=1;
pISR_DMA = (unsigned)DmaRx_Int; // DMA ISR Address Mapping
switch(ch) {
case 0 :
pDMA=(void *)0x4b000000;
rINTSUBMSK&=~(BIT_SUB_DMA0); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 1 :
pDMA=(void *)0x4b000100;
rINTSUBMSK&=~(BIT_SUB_DMA1); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 2 :
pDMA=(void *)0x4b000200;
rINTSUBMSK&=~(BIT_SUB_DMA2); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 3 :
pDMA=(void *)0x4b000300;
rINTSUBMSK&=~(BIT_SUB_DMA3); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 4 :
pDMA=(void *)0x4b000400;
rINTSUBMSK&=~(BIT_SUB_DMA4); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 5 :
pDMA=(void *)0x4b000500;
rINTSUBMSK&=~(BIT_SUB_DMA5); // Interrupt SUB Mask Disable, Interrupt Enable
break;
default :
pDMA=(void *)0x4b000500;
rINTSUBMSK&=~(BIT_SUB_DMA5); // Interrupt SUB Mask Disable, Interrupt Enable
}
rINTMSK&=~(BIT_DMA); // Interrupt Mask Disable, Interrupt Enable
pDMA->DISRC=(unsigned)(0x59000020);
pDMA->DISRCC=(1<<1)|(1<<0); //AHB(Memory), inc
pDMA->DIDST=(unsigned)(SPI_BUFFER1);
pDMA->DIDSTC=(0<<1)|(0); //APB(SPI), fix
pDMA->DCON=(1<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|(1<<22)|(0<<20)|(0x4b002);
//HS|APB|InterruptEn|TransferSize|WholeServ|RelaodOff|DataSize|TransferCount
pDMA->DMAREQSEL=(3<<1)|(1<<0); // HWSRC SPI1 RX
pDMA->DMASKTRIG=(0<<2)|(1<<1)|(0); //run, DMA channel on, no-sw trigger
}
void __irq DmaRx_Int(void)
{
rINTSUBMSK|=(BIT_SUB_DMA0|BIT_SUB_DMA1|BIT_SUB_DMA2|BIT_SUB_DMA3|BIT_SUB_DMA4|BIT_SUB_DMA5);
rINTMSK|=(BIT_DMA);
rSPCON1&=~(1<<7); // Rx dir (Clock Out Stop)
rSUBSRCPND |= (BIT_SUB_DMA0|BIT_SUB_DMA1|BIT_SUB_DMA2|BIT_SUB_DMA3|BIT_SUB_DMA4|BIT_SUB_DMA5);
ClearPending(BIT_DMA);
rx_dmaDone=0;
}
void Test_Spi1_M_Rx_Buf_DMA(void)
{
unsigned int i,j;
unsigned char *rx_ptr;
unsigned int read_data,dummy_data;
unsigned int ErrCnt;
printf("[This Board is SPI1(Master Rx), Another Board are SPI1(Slave Tx) DMA test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x7)|(1<<7)|(3<<5)|(1<<4)|(1<<3)|(0<<0);//DMA,en-SCK,master
rSPPIN1 |= (1<<3)|(1<<0);//Feedback Clock Disable, Master Out Keep
SPI1_Master_nSS_Con(0);
Set_Spi1_Rx_DMA_Set(0); // Spi1 Master DMA channel 0 Set
while(rx_dmaDone) {
if(Uart_GetKey())
break;
}
for(i=0;i<1000;i++);
SPI1_Master_nSS_Con(1);
rSPCON1=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
rx_ptr=(unsigned char *)(SPI_BUFFER1);
rx_ptr += 2; // dummy removed
printf("Data compare !!\n");
ErrCnt=0;
for(i=0,j=0;i<76800;i++,j+=4) {
read_data = (U32)(*(rx_ptr+j+3)<<24|*(rx_ptr+j+2)<<16|*(rx_ptr+j+1)<<8|*(rx_ptr+j));
if(pspi_dma[i]!=read_data) {
printf("%d Ori [%08x]\t",i,pspi_dma[i]);
printf("Cpy [%08x]\t",read_data);
ErrCnt++;
printf("E");
getchar();
}
}
printf("Error Count : %d\n",ErrCnt);
SPI_Port_Recovery();
}
void Test_Spi1_S_Tx_Buf_DMA(void)
{
int i;
printf("[One Board SPI0(Master Rx), Another Board SPI0(Slave Tx) DMA test]\n");
SPI_Port_Init();
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPCON1 = (rSPCON1&0x7)|(2<<5)|(0<<4)|(0<<3)|(0<<0);//DMA,dis-SCK,slave
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<0);//Feedback Clock Disable, Master Out Keep
Set_Spi1_Tx_DMA_Set(0); // Spi1 Master DMA channel 1 Set
while(tx_dmaDone) {
if(Uart_GetKey())
break;
}
for(i=0;i<400;i++);
rSPCON1=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
SPI_Port_Recovery();
}
void Test_Spi1_M_Tx_Fifo_Int(void)
{
int i;
printf("[This Board is SPI1(Master Tx), Another Board are SPI1(Slave Rx) Fifo Int. test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
endSpi1Tx=0;
#if 1
spi1TxStr = (volatile char *)pspi_dma;
trans_count = 307200-3;
#else
spi1TxStr = "1234567890!@#$%^&*()";
trans_count = 20-3;
#endif
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(1<<4)|(1<<2);
rSPCON1 = (rSPCON1&~0xffff)|(0<<14)|(0<<12)|(1<<8)|(0<<7)|(0<<5)|(1<<4)|(1<<3)|(0<<0);//DMA,dis-SCK,slave
SPI1_Master_nSS_Con(0);
pISR_SPI1=(unsigned)Spi1_Tx_fifo_Int;
rINTMSK&=~(BIT_SPI1);
rSPTXFIFO1 = *spi1TxStr++;
rSPTXFIFO1 = *spi1TxStr++;
rSPTXFIFO1 = *spi1TxStr++;
while(endSpi1Tx==0){
if(Uart_GetKey())
break;
}
while(((rSPSTA1>>4)&0x1)==0); // wait for fifo empty state
for(i=0;i<7000;i++);
SPI1_Master_nSS_Con(1);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
// rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
SPI_Port_Recovery();
}
void Test_Spi1_M_Tx_Fifo_Int2(void)
{
int i;
printf("[This Board is SPI1(Master Tx), Another Board are SPI1(Slave Rx) Fifo Int. test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
endSpi1Tx=0;
#if 1
spi1TxStr = (volatile char *)pspi_dma;
trans_count = 307200;
#else
spi1TxStr = "1234567890!@#$%^&*()";
trans_count = 20-3;
#endif
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(1<<4)|(1<<2);
rSPCON1 = (rSPCON1&~0xffff)|(0<<14)|(0<<12)|(1<<8)|(0<<7)|(0<<5)|(1<<4)|(1<<3)|(0<<0);//DMA,dis-SCK,slave
SPI1_Master_nSS_Con(0);
pISR_SPI1=(unsigned)Spi1_Tx_fifo_Int;
rINTMSK&=~(BIT_SPI1);
while(endSpi1Tx==0){
if(Uart_GetKey())
break;
}
while(((rSPSTA1>>4)&0x1)==0); // wait for fifo empty state
for(i=0;i<7000;i++);
SPI1_Master_nSS_Con(1);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
// rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
SPI_Port_Recovery();
}
void __irq Spi1_Tx_fifo_Int(void)
{
rINTMSK|=(BIT_SPI1);
while((rSPSTA1>>5)&0x1) {
// while((rSPSTA1>>16)&0x1f) {
rSPTXFIFO1 = *spi1TxStr++;
trans_count--;
if(trans_count==0) {
endSpi1Tx=1;
ClearPending(BIT_SPI1);
return;
}
}
ClearPending(BIT_SPI1);
rINTMSK&=~(BIT_SPI1);
}
void Test_Spi1_S_Rx_Fifo_Int(void)
{
unsigned int i,j;
unsigned char *rx_ptr;
unsigned int read_data,dummy_data;
unsigned int ErrCnt;
U32 *ptr_erase;
ptr_erase = (unsigned int *)(SPI_BUFFER1);
for(i=0;i<76800;i++) {
*ptr_erase++ = 0;
}
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 == 3); // Wait for FIFO clear
endSpi1Rx=0;
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
trans_count = 307200;
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPFIC1 = (rSPFIC1&~0xfff)|(1<<7)|(1<<5)|(0<<3); // Rx FIFO Time-Out, Rx FIFO Almost Full Interrupt Enable
rSPTOV = 0xfffff; // Rx FIFO Time-out Count
rSPCON1 = (rSPCON1&~0xffff)|(1<<16)|(2<<14)|(1<<9)|(0<<7)|(0<<5)|(0<<4)|(0<<3)|(0<<0);//Poll,dis-SCK,slave
pISR_SPI1=(unsigned)Spi1_Rx_fifo_Int;
rINTMSK&=~(BIT_SPI1);
while(endSpi1Rx==0){
if(Uart_GetKey())
break;
}
rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
rx_ptr=(unsigned char *)(SPI_BUFFER1);
printf("Data trans_count %d\n",trans_count);
printf("Data compare !!\n");
ErrCnt=0;
for(i=0,j=0;i<76800;i++,j+=4) {
read_data = (U32)(*(rx_ptr+j+3)<<24|*(rx_ptr+j+2)<<16|*(rx_ptr+j+1)<<8|*(rx_ptr+j));
if(pspi_dma[i]!=read_data) {
printf("%d Ori [%08x]\t",i,pspi_dma[i]);
printf("Cpy [%08x]\t",read_data);
ErrCnt++;
printf("E");
getchar();
}
}
printf("Error Count : %d\n",ErrCnt);
SPI_Port_Recovery();
}
void __irq Spi1_Rx_fifo_Int(void)
{
rINTMSK|=(BIT_SPI1);
if((rSPSTA1>>12)&0x1)
rSPSTA1 |= (1<<12); // Rx FIFO Trailing Byte Time-out interrupt bit clear
// while((rSPSTA1>>24)&0x1f) {
while((rSPSTA1>>6)&0x1) {
*spi1RxStr++ = rSPRXFIFO1;
trans_count--;
if(trans_count==0) {
rSPCON1&=~(1<<7); // Rx dir (Clock Out Stop)
endSpi1Rx=1;
printf("Rx fifo time out\n");
ClearPending(BIT_SPI1);
return;
}
}
ClearPending(BIT_SPI1);
rINTMSK&=~(BIT_SPI1);
}
void Test_Spi1_M_Rx_Fifo_Int(void)
{
unsigned int i,j;
unsigned char *rx_ptr;
unsigned int read_data,dummy_data;
unsigned int ErrCnt;
U32 *ptr_erase;
ptr_erase = (unsigned int *)(SPI_BUFFER1);
for(i=0;i<76800;i++) {
*ptr_erase++ = 0;
}
printf("[This Board is SPI1(Master Rx), Another Board are SPI1(Slave Tx) Fifo Int. test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
endSpi1Rx=0;
spi1RxStr=(char *) SPI_BUFFER1; // Rx Buffer to receive
trans_count = 307200;
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
SPI1_Master_nSS_Con(0);
pISR_SPI1=(unsigned)Spi1_Rx_fifo_Int;
rINTMSK&=~(BIT_SPI1);
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<3)|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(1<<7)|(1<<5)|(0<<3); // Rx FIFO Time-Out, Rx FIFO Almost Full Interrupt Enable
rSPTOV = 0xfffff; // Rx FIFO Time-out Count
rSPCON1 = (rSPCON1&~0xffff)|(1<<16)|(0<<14)|(1<<9)|(0<<5)|(1<<4)|(1<<3)|(0<<0);//Poll,en-SCK,master
rSPCON1|=(1<<7); // Rx dir (Clock Out Start)
while(endSpi1Rx==0){
if(Uart_GetKey())
break;
}
// while(((rSPSTA1>>4)&0x1)==0); // wait for fifo empty state
for(i=0;i<7000;i++);
SPI1_Master_nSS_Con(1);
rx_ptr=(unsigned char *)(SPI_BUFFER1);
printf("Data trans_count %d\n",trans_count);
printf("Data compare !!\n");
ErrCnt=0;
for(i=0,j=0;i<76800;i++,j+=4) {
read_data = (U32)(*(rx_ptr+j+3)<<24|*(rx_ptr+j+2)<<16|*(rx_ptr+j+1)<<8|*(rx_ptr+j));
if(pspi_dma[i]!=read_data) {
printf("%d Ori [%08x]\t",i,pspi_dma[i]);
printf("Cpy [%08x]\t",read_data);
ErrCnt++;
printf("E");
getchar();
}
}
printf("Error Count : %d\n",ErrCnt);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
// rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
SPI_Port_Recovery();
}
void Test_Spi1_S_Tx_Fifo_Int(void)
{
int i;
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
endSpi1Tx=0;
#if 1
spi1TxStr = (volatile char *)pspi_dma;
trans_count = 307200-3;
#else
spi1TxStr = "1234567890!@#$%^&*()";
trans_count = 20-3;
#endif
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(1<<4)|(1<<2);
rSPCON1 = (rSPCON1&~0xffff)|(0<<12)|(1<<8)|(0<<7)|(0<<5)|(0<<4)|(0<<3)|(0<<0);//DMA,dis-SCK,slave
pISR_SPI1=(unsigned)Spi1_Tx_fifo_Int;
rINTMSK&=~(BIT_SPI1);
rSPTXFIFO1 = *spi1TxStr++;
rSPTXFIFO1 = *spi1TxStr++;
rSPTXFIFO1 = *spi1TxStr++;
while(endSpi1Tx==0){
if(Uart_GetKey())
break;
}
while(((rSPSTA1>>4)&0x1)==0); // wait for fifo empty state
for(i=0;i<7000;i++);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
// rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
SPI_Port_Recovery();
}
void Test_Spi1_S_Tx_Fifo_Int2(void)
{
int i;
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
endSpi1Tx=0;
#if 1
spi1TxStr = (volatile char *)pspi_dma;
trans_count = 307200;
#else
spi1TxStr = "1234567890!@#$%^&*()";
trans_count = 20-3;
#endif
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(1<<4)|(1<<2);
rSPCON1 = (rSPCON1&~0xffff)|(0<<12)|(1<<8)|(0<<7)|(0<<5)|(0<<4)|(0<<3)|(0<<0);//DMA,dis-SCK,slave
pISR_SPI1=(unsigned)Spi1_Tx_fifo_Int;
rINTMSK&=~(BIT_SPI1);
while(endSpi1Tx==0){
if(Uart_GetKey())
break;
}
while(((rSPSTA1>>4)&0x1)==0); // wait for fifo empty state
for(i=0;i<7000;i++);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
// rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
SPI_Port_Recovery();
}
void Test_Spi1_M_Tx_Fifo_DMA(void)
{
int i;
printf("[This Board is SPI1(Master Tx), Another Board are SPI1(Slave Rx) Fifo DMA. test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
SPI1_Master_nSS_Con(0);
Set_Spi1_Tx_Fifo_DMA(0);
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<3)|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(2<<8);
rSPCON1 = (rSPCON1&~0xffff)|(1<<8)|(0<<7)|(0<<5)|(1<<4)|(1<<3)|(0<<0);//DMA,en-SCK,master
while(tx_dmaDone){
if(Uart_GetKey())
break;
}
while(((rSPSTA1>>4)&0x1)==0); // wait for fifo empty state
for(i=0;i<7000;i++);
SPI1_Master_nSS_Con(1);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
// rSPCON0=(0<<5)|(0<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Poll,dis-SCK,master,low,A,normal
SPI_Port_Recovery();
}
void Set_Spi1_Tx_Fifo_DMA(U32 ch)
{
unsigned char *tx_ptr;
DMA *pDMA;
tx_ptr = (unsigned char *)pspi_dma;
tx_dmaDone=1;
pISR_DMA = (unsigned)DmaTx_Int; // DMA ISR Address Mapping
switch(ch) {
case 0 :
pDMA=(void *)0x4b000000;
rINTSUBMSK&=~(BIT_SUB_DMA0); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 1 :
pDMA=(void *)0x4b000100;
rINTSUBMSK&=~(BIT_SUB_DMA1); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 2 :
pDMA=(void *)0x4b000200;
rINTSUBMSK&=~(BIT_SUB_DMA2); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 3 :
pDMA=(void *)0x4b000300;
rINTSUBMSK&=~(BIT_SUB_DMA3); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 4 :
pDMA=(void *)0x4b000400;
rINTSUBMSK&=~(BIT_SUB_DMA4); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 5 :
pDMA=(void *)0x4b000500;
rINTSUBMSK&=~(BIT_SUB_DMA5); // Interrupt SUB Mask Disable, Interrupt Enable
break;
default :
pDMA=(void *)0x4b000500;
rINTSUBMSK&=~(BIT_SUB_DMA5); // Interrupt SUB Mask Disable, Interrupt Enable
}
rINTMSK&=~(BIT_DMA); // Interrupt Mask Disable, Interrupt Enable
pDMA->DISRC=(unsigned)tx_ptr;
pDMA->DISRCC=(0<<1)|(0<<0); //AHB(Memory), inc
pDMA->DIDST=(unsigned)0x59000018;
pDMA->DIDSTC=(1<<1)|(1); //APB(SPI), fix
pDMA->DCON=(1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<22)|(0<<20)|(0x12c00);
//HS|APB|InterruptEn|TransferSize|WholeServ|RelaodOff|DataSize|TransferCount
pDMA->DMAREQSEL=(2<<1)|(1<<0); // HWSRC SPI1 TX
pDMA->DMASKTRIG=(0<<2)|(1<<1)|(0); //run, DMA channel on, no-sw trigger
}
void Test_Spi1_S_Rx_Fifo_DMA(void)
{
unsigned int i,j;
unsigned char *rx_ptr;
unsigned int read_data,dummy_data;
unsigned int ErrCnt;
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
Set_Spi1_Rx_Fifo_DMA(0);
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<1)|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(2<<10);
rSPCON1 = (rSPCON1&~0xffff)|(1<<14)|(1<<9)|(1<<7)|(0<<5)|(0<<4)|(0<<3)|(0<<0);//DMA,dis-SCK,Slave
while(rx_dmaDone){
if(Uart_GetKey())
break;
}
rx_ptr=(unsigned char *)(SPI_BUFFER1);
printf("Data compare !!\n");
ErrCnt=0;
for(i=0,j=0;i<76800;i++,j+=4) {
read_data = (U32)(*(rx_ptr+j+3)<<24|*(rx_ptr+j+2)<<16|*(rx_ptr+j+1)<<8|*(rx_ptr+j));
if(pspi_dma[i]!=read_data) {
printf("%d Ori [%08x]\t",i,pspi_dma[i]);
printf("Cpy [%08x]\t",read_data);
ErrCnt++;
printf("E");
getchar();
}
}
printf("Error Count : %d\n",ErrCnt);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
SPI_Port_Recovery();
}
void Set_Spi1_Rx_Fifo_DMA(U32 ch)
{
int i;
U32 *ptr_erase;
DMA *pDMA;
ptr_erase = (unsigned int *)(SPI_BUFFER1);
for(i=0;i<76800;i++) {
*ptr_erase++ = 0;
}
rx_dmaDone=1;
pISR_DMA = (unsigned)DmaRx_Int; // DMA ISR Address Mapping
switch(ch) {
case 0 :
pDMA=(void *)0x4b000000;
rINTSUBMSK&=~(BIT_SUB_DMA0); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 1 :
pDMA=(void *)0x4b000100;
rINTSUBMSK&=~(BIT_SUB_DMA1); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 2 :
pDMA=(void *)0x4b000200;
rINTSUBMSK&=~(BIT_SUB_DMA2); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 3 :
pDMA=(void *)0x4b000300;
rINTSUBMSK&=~(BIT_SUB_DMA3); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 4 :
pDMA=(void *)0x4b000400;
rINTSUBMSK&=~(BIT_SUB_DMA4); // Interrupt SUB Mask Disable, Interrupt Enable
break;
case 5 :
pDMA=(void *)0x4b000500;
rINTSUBMSK&=~(BIT_SUB_DMA5); // Interrupt SUB Mask Disable, Interrupt Enable
break;
default :
pDMA=(void *)0x4b000500;
rINTSUBMSK&=~(BIT_SUB_DMA5); // Interrupt SUB Mask Disable, Interrupt Enable
}
rINTMSK&=~(BIT_DMA); // Interrupt Mask Disable, Interrupt Enable
pDMA->DISRC=(unsigned)(0x5900001c);
pDMA->DISRCC=(1<<1)|(1<<0); //AHB(Memory), inc
pDMA->DIDST=(unsigned)(SPI_BUFFER1);
pDMA->DIDSTC=(0<<1)|(0); //APB(SPI), fix
pDMA->DCON=(1<<31)|(0<<30)|(1<<29)|(1<<28)|(0<<27)|(1<<24)|(1<<22)|(0<<20)|(0x12c00);
//HS|APB|InterruptEn|TransferSize|WholeServ|RelaodOff|DataSize|TransferCount
pDMA->DMAREQSEL=(3<<1)|(1<<0); // HWSRC SPI1 RX
pDMA->DMASKTRIG=(0<<2)|(1<<1)|(0); //run, DMA channel on, no-sw trigger
}
void Test_Spi1_M_Rx_Fifo_DMA(void)
{
unsigned int i,j;
unsigned char *rx_ptr;
unsigned int read_data,dummy_data;
unsigned int ErrCnt;
printf("[This Board is SPI1(Master Rx), Another Board are SPI1(Slave Tx) Fifo DMA. test]\n");
printf("Slave is ready? Then press any key, Start\n");
getchar();
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
rSPPIN1 = (rSPPIN1&~(1<<3))|(3<<1)|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(2<<10);
rSPCON1 = (rSPCON1&~0xffff)|(1<<14)|(1<<9)|(0<<5)|(1<<4)|(1<<3)|(0<<0);//DMA,en-SCK,Master
SPI1_Master_nSS_Con(0);
Set_Spi1_Rx_Fifo_DMA(0);
rSPCON1|=(1<<7); // Rx dir (Clock Out Start)
while(rx_dmaDone){
if(Uart_GetKey())
break;
}
// for(i=0;i<7000;i++);
SPI1_Master_nSS_Con(1);
rx_ptr=(unsigned char *)(SPI_BUFFER1);
printf("Data compare !!\n");
ErrCnt=0;
for(i=0,j=0;i<76800;i++,j+=4) {
read_data = (U32)(*(rx_ptr+j+3)<<24|*(rx_ptr+j+2)<<16|*(rx_ptr+j+1)<<8|*(rx_ptr+j));
if(pspi_dma[i]!=read_data) {
printf("%d Ori [%08x]\t",i,pspi_dma[i]);
printf("Cpy [%08x]\t",read_data);
ErrCnt++;
printf("E");
getchar();
}
}
printf("Error Count : %d\n",ErrCnt);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
SPI_Port_Recovery();
}
void Test_Spi1_S_Tx_Fifo_DMA(void)
{
int i;
SPI_Port_Init();
rSPCON1=(1<<11)|(1<<10); // FIFO Clear
while((rSPCON1>>10)&0x3 > 0); // Wait for FIFO clear
SPI_Baud_Rate_Set(1000000);
SPI_Transfer_Format();
Set_Spi1_Tx_Fifo_DMA(0);
rSPPIN1 = (rSPPIN1&~(1<<3))|(1<<0);//Feedback Clock Disable, Master Out Keep
rSPFIC1 = (rSPFIC1&~0xfff)|(2<<8);
rSPCON1 = (rSPCON1&~0xffff)|(1<<8)|(0<<7)|(0<<5)|(0<<4)|(0<<3)|(0<<0);//DMA,dis-SCK,slave
while(tx_dmaDone){
if(Uart_GetKey())
break;
}
while(((rSPSTA1>>4)&0x1)==0); // wait for fifo empty state
for(i=0;i<7000;i++);
rSPCON0 = 0x0008;
rSPFIC1 = 0x0;
rSPPIN1 = 0x02;
SPI_Port_Recovery();
}
void SPI_Port_Init(void)
{
rGPECON_saved = rGPECON;
rGPEUDP_saved = rGPEUDP;
rGPLCON_saved = rGPLCON;
rGPLUDP_saved = rGPLUDP;
rGPEUDP = 0xaaaaaaaa; // Disable pull-up/down function
rGPLUDP = 0xaaaaaaaa; // Disable pull-up/down function
rGPECON = (rGPECON&~(0x3f<<22))|(0x2a<<22); // GPE13,12,11 <= SPICLK0,SPIMOSI0,SPIMISO0
rGPLCON = (rGPLCON&~(0x3ff<<20))|(0x2aa<<20); // GPL14,13,12,11,10 <= SS1,SS0,SPIMISO1,SPIMOSI1,SPICLK1
printf("SPI Port Init\n");
}
void SPI_Port_Recovery(void)
{
rGPECON = rGPECON_saved;
rGPEUDP = rGPEUDP_saved;
rGPLCON = rGPLCON_saved;
rGPLUDP = rGPLUDP_saved;
printf("SPI Port Recovery\n");
}
void SPI1_Master_nSS_Con(U32 CSout)
{
#if 0
if(CSout==0) {
printf("CS1 Active(Low)\n");
}
else {
printf("CS1 Inactive(High)\n");
}
#endif
rSPPIN1=(rSPPIN1&~(1<<1))|(CSout<<1);
}
void SPI_Baud_Rate_Set(float BaudRate)
{
U32 PrescalerVal;
SystemCLK(0);
if(BaudRate>(PCLK/2)) {
printf("SPI Baud Rate is too big (<%.1f MHz)\n",(float)(PCLK)/2/1000000);
while(1);
}
PrescalerVal = (U32)(PCLK/2/BaudRate-1);
rSPPRE1 = PrescalerVal;
printf("BaudRate [%.3f MHz]\trSPPRE1 [0x%08x]\n",((float)PCLK/2/(PrescalerVal+1))/1000000,rSPPRE1);
printf("PCLK = %d\n",PCLK);
printf("PrescalerVal = %d\n",PrescalerVal);
}
void SPI_Transfer_Format(void)
{
#if 0
printf("SPI : Select Transfer Type\n[0] Low,A\t[1] Low,B\t[2] High,A\t[3] High,B\n");
switch(GetIntNum()) {
case 0 :
rSPCON1 = (rSPCON1 &~(3<<1))|(0<<2)|(0<<1);
printf("SPI CPOL=0, CPHA=0\n");
break;
case 1 :
rSPCON1 = (rSPCON1 &~(3<<1))|(0<<2)|(1<<1);
printf("SPI CPOL=0, CPHA=1\n");
break;
case 2 :
rSPCON1 = (rSPCON1 &~(3<<1))|(1<<2)|(0<<1);
printf("SPI CPOL=1, CPHA=0\n");
break;
case 3 :
rSPCON1 = (rSPCON1 &~(3<<1))|(1<<2)|(1<<1);
printf("SPI CPOL=1, CPHA=1\n");
break;
default :
rSPCON1 = (rSPCON1 &~(3<<1))|(0<<2)|(0<<1);
printf("SPI CPOL=0, CPHA=0\n");
}
#else
rSPCON1 = (rSPCON1 &~(3<<1))|(0<<2)|(0<<1);
printf("SPI CPOL=0, CPHA=0\n");
#endif
}