📄 spi.c
字号:
void SPI_loop_test ( ) {
SPI_port port0, port1;
char *txStr,*rxStr;
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0 CON26: (2-3)\n");
ElaseRxReg();
endSpi0Tx=0;
spi0TxStr=(volatile char*)D_PAT0;
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(1);
SPI_Baud_Rate_Set(SPI_CHANNEL1, SPI_CLOCK); // SPI Channel 0, 25MHz
memset( &port0, 0, sizeof(port0) );
memset( &port1, 0,sizeof(port1) );
port0.spi_con.direction = SPI_TX;
port0.spi_con.mode = SPI_POLLING;
port0.spi_con.who_sck_en = SPI_MASTER;
port0.spi_con.who_MSTR = SPI_MASTER;
port0.spi_con.clock_CPOL = SPI_CLOCK_LOW;
port0.spi_con.format_CPHA = SPI_FORMAT_A;
port0.spi_con.garbage_TAGD = SPI_NORMAL_MODE;
port0.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_ENABLE;
port0.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
port0.spi_pin_con.cs_out = SPI_CS_ACTIVE;
port0.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_RELEASE;
rSPCON1 =*((unsigned int *)&port0.spi_con);
rSPPIN1 = *((unsigned int *)&port0.spi_pin_con);
#if 1
while(endSpi0Tx==0)
{
if(REDY1) //Check Tx ready state
{
if(*spi0TxStr!='\0')
WrSPTDAT1(*spi0TxStr++);
else {
endSpi0Tx=1;
break;
}
while(!(REDY1)); //Check Rx ready state
*spi0RxStr++=RdSPRDAT1();
}
}
*spi0RxStr++ = RdSPRDAT1();
*spi0RxStr='\0'; // attach End of String(Null)
#else
do {
while( REDY1 == 0 );
WrSPTDAT1(*spi0TxStr);
while( REDY1 == 0 );
*spi0RxStr++ = RdSPRDAT1();
}while ( *++spi0TxStr != '\0' );
#endif
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");
while(*rxStr!='\0') {
printf("%x",*rxStr++);
}
SPI_Port_Return();
}
void SPI_master_slave_test ( ) {
SPI_port port0, port1;
char *txStr,*rxStr;
int i=0,j=0;
int a,b;
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0 CON26: (2-3)\n");
ElaseRxReg();
endSpi0Tx=0;
spi0TxStr=(volatile char*)D_PAT0;
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
SPI_Baud_Rate_Set(SPI_CHANNEL0, SPI_CLOCK); // SPI Channel 0, 25MHz
// SPI_Port_Init(1);
SPI_Baud_Rate_Set(SPI_CHANNEL1, SPI_CLOCK); // SPI Channel 0, 25MHz
memset( &port0, 0, sizeof(port0) );
memset( &port1, 0,sizeof(port1) );
// rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
// rSPPIN0=(1<<3)|(1<<0);//Feedback Clock Enable, Master Out Keep
port0.spi_con.direction = SPI_RX;
port0.spi_con.mode = SPI_POLLING;
port0.spi_con.who_sck_en = SPI_SLAVE;
port0.spi_con.who_MSTR = SPI_SLAVE;
port0.spi_con.clock_CPOL = SPI_CLOCK_LOW;
port0.spi_con.format_CPHA = SPI_FORMAT_B;
port0.spi_con.garbage_TAGD = SPI_NORMAL_MODE;
port0.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_ENABLE;
port0.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
port0.spi_pin_con.cs_out = SPI_CS_INACTIVE;
port0.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_RELEASE;
// rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Interrupt,dis-SCK,slave,low,A,normal
// rSPPIN0=(0<<2)|(1<<0);//dis-ENMUL,KEEP
//rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Interrupt,dis-SCK,slave,low,A,normal
//rSPPIN0=(0<<2)|(1<<0);//dis-ENMUL,KEEP
port1.spi_con.direction = SPI_TX;
port1.spi_con.mode = SPI_POLLING;
port1.spi_con.who_sck_en = SPI_MASTER;
port1.spi_con.who_MSTR = SPI_MASTER;
port1.spi_con.clock_CPOL = SPI_CLOCK_LOW;
port1.spi_con.format_CPHA = SPI_FORMAT_A;
port1.spi_con.garbage_TAGD = SPI_NORMAL_MODE;
port1.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_DISABLE;
port1.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
port1.spi_pin_con.cs_out = SPI_CS_ACTIVE;
port1.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_RELEASE;
rSPCON0 =*((unsigned int *)&port0.spi_con);
rSPPIN0 = *((unsigned int *)&port0.spi_pin_con);
rSPCON1 =*((unsigned int *)&port1.spi_con);
rSPPIN1 = *((unsigned int *)&port1.spi_pin_con);
// rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
// rSPPIN0=(1<<3)|(1<<0);//Feedback Clock Enable, Master Out Keep
// Master_nSS_Con(0); // Activate nSS
memset ( (void*)spi0RxStr, 0, 110 );
memset ( (void*)spi0TxStr, 0, 110 );
while(1)
{
a=1;b=1;
while ( a==1 || b==1 ) {
if ( a == 1 && REDY0 == 1 ) {
WrSPTDAT0('a');
a = 0;
}
if ( b== 1 && REDY1 == 1 ) {
WrSPTDAT1('b');
b = 0;
}
}
while ( a==0 || b==0 ) {
if ( a == 0 && REDY0 == 1 ) {
*spi0RxStr++=RdSPRDAT0();
a = 1;
}
if ( b== 0 && REDY1 == 1 ) {
*spi0TxStr++=RdSPRDAT1();
b = 1;
}
}
if ( i++ > 100 )
break;
}
// *spi0RxStr++=RdSPRDAT0();
*spi0RxStr='\0'; // attach End of String(Null)
// rxStr++; // remove first dummy
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s\n",rxStr);
printf ("SPI DONE\n");
SPI_Port_Return();
}
void SPI_master_master_test ( ) {
SPI_port port0, port1;
char *txStr,*rxStr;
int i=0,j=0;
int a,b;
printf("[SPI Polling Tx/Rx Self-Test]\n");
printf("Connect SPIMOSI 0 into SPIMISO 0 CON26: (2-3)\n");
ElaseRxReg();
endSpi0Tx=0;
spi0TxStr=(volatile char*)D_PAT0;
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(1);
SPI_Baud_Rate_Set(SPI_CHANNEL0, SPI_CLOCK); // SPI Channel 0, 25MHz
// SPI_Port_Init(1);
SPI_Baud_Rate_Set(SPI_CHANNEL1, SPI_CLOCK); // SPI Channel 0, 25MHz
memset( &port0, 0, sizeof(port0) );
memset( &port1, 0,sizeof(port1) );
// rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
// rSPPIN0=(1<<3)|(1<<0);//Feedback Clock Enable, Master Out Keep
port0.spi_con.direction = SPI_TX;
port0.spi_con.mode = SPI_POLLING;
port0.spi_con.who_sck_en = SPI_MASTER;
port0.spi_con.who_MSTR = SPI_MASTER;
port0.spi_con.clock_CPOL = SPI_CLOCK_LOW;
port0.spi_con.format_CPHA = SPI_FORMAT_A;
port0.spi_con.garbage_TAGD = SPI_NORMAL_MODE;
port0.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_DISABLE;
port0.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
port0.spi_pin_con.cs_out = SPI_CS_ACTIVE;
port0.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_DRIVE;
//rSPCON0=(0<<5)|(0<<4)|(0<<3)|(1<<2)|(0<<1)|(0<<0);//Interrupt,dis-SCK,slave,low,A,normal
//rSPPIN0=(0<<2)|(1<<0);//dis-ENMUL,KEEP
port1.spi_con.direction = SPI_TX;
port1.spi_con.mode = SPI_POLLING;
port1.spi_con.who_sck_en = SPI_MASTER;
port1.spi_con.who_MSTR = SPI_MASTER;
port1.spi_con.clock_CPOL = SPI_CLOCK_LOW;
port1.spi_con.format_CPHA = SPI_FORMAT_A;
port1.spi_con.garbage_TAGD = SPI_NORMAL_MODE;
port1.spi_pin_con.feedback_clk_en = SPI_FEEDBACK_DISABLE;
port1.spi_pin_con.err_detect = SPI_MULTI_MASTER_ERR_DETECT_DISABLE;
port1.spi_pin_con.cs_out = SPI_CS_ACTIVE;
port1.spi_pin_con.out_keep = SPI_MASTER_OUT_KEEP_DRIVE;
rSPCON0 =*((unsigned int *)&port0.spi_con);
rSPPIN0 = *((unsigned int *)&port0.spi_pin_con);
rSPCON1 =*((unsigned int *)&port1.spi_con);
rSPPIN1 = *((unsigned int *)&port1.spi_pin_con);
// rSPCON0=(0<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Polling,en-SCK,master,low,A,normal
// rSPPIN0=(1<<3)|(1<<0);//Feedback Clock Enable, Master Out Keep
// Master_nSS_Con(0); // Activate nSS
memset ( (void*)spi0RxStr, 0, 110 );
memset ( (void*)spi0TxStr, 0, 110 );
while(1)
{
a=1;b=1;
while ( a==1 || b==1 ) {
if ( a == 1 && REDY0 == 1 ) {
WrSPTDAT0('a');
a = 0;
}
if ( b== 1 && REDY1 == 1 ) {
WrSPTDAT1('b');
b = 0;
}
}
while ( a==0 || b==0 ) {
if ( a == 0 && REDY0 == 1 ) {
*spi0RxStr++=RdSPRDAT0();
a = 1;
}
if ( b== 0 && REDY1 == 1 ) {
*spi0TxStr++=RdSPRDAT1();
b = 1;
}
}
if ( i++ > 100 )
break;
}
// *spi0RxStr++=RdSPRDAT0();
*spi0RxStr='\0'; // attach End of String(Null)
rxStr++; // remove first dummy
printf("Tx Strings:%s\n",txStr);
printf("Rx Strings:%s\n",rxStr);
printf ("SPI DONE\n");
SPI_Port_Return();
}
void SPI_master_loop_int_test(void ) {
char *txStr,*rxStr;
c0=0;
printf("[One Board SPI0(Master Tx), Another Board SPI0(Slave Rx) Interrupt test]\n");
printf("First Slave is ready? Press any key, Start\n");
getchar();
ElaseRxReg();
endSpi0Tx=0;
spi0TxStr="zxyvwturspqnolmjkhifgdebcaZXYVWTURSPQNOLMJKHIFGDEBCA8967452301";
spi0RxStr=(char *) SPI_BUFFER0; // Rx Buffer to receive
txStr=(char *)spi0TxStr;
rxStr=(char *)spi0RxStr;
SPI_Port_Init(0);
SPI_Baud_Rate_Set(SPI_CHANNEL0, SPI_CLOCK); // SPI Channel 0, 25MHz
rSPCON0=(1<<5)|(1<<4)|(1<<3)|(1<<2)|(0<<1)|(0<<0);//Interrupt,en-SCK,master,low,A,normal
rSPPIN0=(1<<3)|(0<<2)|(1<<1)|(1<<0);//dis-ENMUL,KEEP
Master_nSS_Con(0); // Activate nSS
pISR_SPI0=(unsigned)Spi0_M_Int;
rINTMSK&=~(BIT_SPI0);
while(endSpi0Tx==0);
rINTMSK|=(BIT_SPI0);
Master_nSS_Con(1); // Activate nSS
*spi0RxStr++=RdSPRDAT0(); // Get last rx data
*spi0RxStr='\0'; // attach End of String(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_Return();
printf("c0=%d\n",c0);
}
void spi_release_transmission( SPI_channel port ) {
if( port == SPI_CHANNEL0 ) {
// rSPPIN0 = 0;
// rSPCON0 = 0;
rSPPIN0 |= (1<<1);
rSPCON0 |= (1<<11)|(1<<10);
rSPCON0 &= ~((3<<8)|(1<<4));
}
else {
// rSPPIN1 = 0;
// rSPCON1 = 0;
rSPPIN1 |= (1<<1);
rSPCON1 |= (1<<11)|(1<<10);
rSPCON1 &= ~((3<<8)|(1<<4));
}
}
static void __irq spi_dma_done0(void)
{
ClearPending(BIT_DMA0);
spi_dma_done[0] = 1;
printf("spi_dma_done0\n" );
}
static void __irq spi_dma_done1(void)
{
ClearPending(BIT_DMA1);
spi_dma_done[1] = 1;
printf("spi_dma_done1\n" );
}
static void __irq spi_dma_done2(void)
{
ClearPending(BIT_DMA2);
spi_dma_done[2] = 1;
printf("spi_dma_done2\n" );
}
static void __irq spi_dma_done3(void)
{
ClearPending(BIT_DMA3);
spi_dma_done[3] = 1;
printf("spi_dma_done3\n" );
}
void Test_Spi_DMA_Set(int dma_channel, SPI_channel spi_channel, unsigned char* tx_buf,
unsigned char* rx_buf, SPI_direction rxtx, int withFIFO) {
unsigned int tsz = 0, dsz=0, tc;
int dma_request_source;
int incDISRCC=0, incDIDSTC=0;
DMA *pDMA;
tsz = (withFIFO == TRUE) ? (1) : (0);
if ( spi_channel == SPI_CHANNEL0 ) {
dma_request_source = (rxtx == SPI_TX ) ? (0) : (1);
}
else if ( spi_channel == SPI_CHANNEL1 ) {
dma_request_source = (rxtx == SPI_TX ) ? (2) : (3);
}
else {
printf ( "dma is not support channel : %d\n", spi_channel);
return;
}
switch(dma_channel) {
case 0:
pISR_DMA0=(int)spi_dma_done0;
rINTMSK&=~(BIT_DMA0);
pDMA=(void *)0x4b000000;
break;
case 1:
pISR_DMA1=(int)spi_dma_done1;
rINTMSK&=~(BIT_DMA1);
pDMA=(void *)0x4b000040;
break;
case 2:
pISR_DMA2=(int)spi_dma_done2;
rINTMSK&=~(BIT_DMA2);
pDMA=(void *)0x4b000080;
break;
case 3:
pISR_DMA3=(int)spi_dma_done3;
rINTMSK&=~(BIT_DMA3);
pDMA=(void *)0x4b0000c0;
break;
default:
printf ( "channel error :%d\n", dma_channel );
return;
}
spi_dma_done[dma_channel] = 0;
tc = RXTX_SIZE / (1<<dsz);
tc = ( tsz == 1 ) ? tc/4 : tc;
tc = (tc>0xfffff)?(0xfffff):(tc);
if ( rxtx == SPI_TX ) {
if ( withFIFO == TRUE ) {
if ( spi_channel == SPI_CHANNEL0 ) {
rx_buf = (unsigned char*)0x59000018;
}
else {
rx_buf = (unsigned char*)0x59000118;
}
}
else {
if ( spi_channel == SPI_CHANNEL0 ) {
rx_buf = (unsigned char*)0x59000010;
}
else {
rx_buf = (unsigned char*)0x59000110;
}
}
incDIDSTC = 1;
incDISRCC = 0;
}
else {
if ( withFIFO == TRUE ) {
if ( spi_channel == SPI_CHANNEL0 ) {
tx_buf = (unsigned char*)0x5900001C;
}
else {
tx_buf = (unsigned char*)0x5900011C;
}
}
else {
if ( spi_channel == SPI_CHANNEL0 ) {
tx_buf = (unsigned char*)0x59000014;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -