📄 sio.c
字号:
#include <string.h>
#include "..\include\k401.h"
#include "..\include\k401lib.h"
#include "..\include\sio.h"
#include "..\include\def.h"
volatile char *sio0TxStr,*sio0RxStr, *sio1TxStr, *sio1RxStr;
volatile int endSio0Tx, endSio1Tx;
volatile int dma0siostop,dma1siostop;
void __irq SIO0_Int(void);
void __irq SIO1_Int(void);
void __irq DMA0_Int(void);
void __irq DMA1_Int(void);
int SIO0_TxRx_Test(void);
int SIO1_TxRx_Test(void);
int Test_Sio(void)
{
int isYes;
Uart_Printf("SIO Function Test\n");
Uart_Printf("=========================================================================\n");
Uart_Printf(" #1: ");
isYes=0;
isYes+=SIO0_TxRx_Test();
Uart_Getch();
Uart_Printf(" #2: ");
isYes+=SIO1_TxRx_Test();
Uart_Printf("=========================================================================\n");
if(isYes==2)Uart_Printf("SIO Function Test OK!!!!\n");
else Uart_Printf("SIO Function Test Fail!!!\n");
}
int SIO0_TxRx_Test(void)
{
int isYes;
unsigned int savePcon6;
char *txStr0, *rxStr0;
Uart_Printf("[SIO0 Tx to SIO0 Rx Loopback Test]\n");
pISR_SIO0=(unsigned)SIO0_Int;
rINTPND=0x0;
rSYSCON|=BIT_GLOBAL;
rINTMSK=(BIT_SIO0);
endSio0Tx=0;
sio0TxStr="0123456789abcdefghijklmnopqrstuvwxyz";
sio0RxStr=(char *)malloc(strlen((char *)sio0TxStr)+1);
txStr0=(char *)sio0TxStr;
rxStr0=(char *)sio0RxStr;
savePcon6=rPCON6;
rPCON6|=(0x5<<2); //SIOCLK0=Output
rSBRDR0=0x4; // if MCLK=50MHz, SIOCLK0=12.5MHz
rITVCNT0=0x4;
rSIOCON0=1|(0<<2)|(0<<3)|(1<<4)|(1<<5)|(0<<6)|(0<<7);
//Interrupt, Auto run, SIO start, Rising edge, Received only, MSB, Internal clk
rSIODAT0='0';
sio0TxStr++;
rSIOCON0|=(1<<3);
while(endSio0Tx==0);
*sio0RxStr='\0';
Uart_Printf("Tx Strings: %s\n",txStr0);
Uart_Printf("Rx Strings: %s :",rxStr0);
if(strcmp(rxStr0,txStr0)==0) isYes=1;
else isYes=0;
rPCON6=savePcon6;
rSYSCON&=~(BIT_GLOBAL);
rINTMSK=0x0;
free(rxStr0);
if(isYes==1)
{
Uart_Printf("OK!!!\n");
return 1;
}
else
{
Uart_Printf("Error!!!\n");
return 0;
}
}
int SIO1_TxRx_Test(void)
{
int isYes;
unsigned int savePcon6;
char *txStr1, *rxStr1;
Uart_Printf("[SIO1 Tx to SIO1 Rx Loopback Test]\n");
pISR_SIO1=(unsigned)SIO1_Int;
rINTPND=0x0;
rSYSCON|=BIT_GLOBAL;
rINTMSK=(BIT_SIO1);
endSio1Tx=0;
sio1TxStr="0123456789abcdefghijklmnopqrstuvwxyz";
sio1RxStr=(char *)malloc(strlen((char *)sio1TxStr)+1);
txStr1=(char *)sio1TxStr;
rxStr1=(char *)sio1RxStr;
savePcon6=rPCON6;
rPCON6|=(0x5<<12); //SIOCLK0=Output
rSBRDR1=0x4; // if MCLK=50MHz, SIOCLK0=12.5MHz
rITVCNT1=0x4;
rSIOCON1=1|(0<<2)|(0<<3)|(1<<4)|(1<<5)|(0<<6)|(0<<7);
//Interrupt, Auto run, SIO start, Rising edge, Received only, MSB, Internal clk
rSIODAT1='0';
sio1TxStr++;
rSIOCON1|=(1<<3);
while(endSio1Tx==0);
*sio1RxStr='\0';
Uart_Printf("Tx Strings: %s\n",txStr1);
Uart_Printf("Rx Strings: %s :",rxStr1);
if(strcmp(rxStr1,txStr1)==0) isYes=1;
else isYes=0;
rPCON6=savePcon6;
rSYSCON&=~(BIT_GLOBAL);
rINTMSK=0x0;
free(rxStr1);
if(isYes==1)
{
Uart_Printf("OK!!!\n");
return 1;
}
else
{
Uart_Printf("Error!!!\n");
return 0;
}
}
void __irq SIO0_Int(void)
{
rINTPND=~(BIT_SIO0);
*sio0RxStr++=rSIODAT0;
if(*sio0TxStr!='\0')
{
rSIODAT0=*sio0TxStr++;
rSIOCON0|=(1<<3);
}
else endSio0Tx=1;
}
void __irq SIO1_Int(void)
{
rINTPND=~(BIT_SIO1);
*sio1RxStr++=rSIODAT1;
if(*sio1TxStr!='\0')
{
rSIODAT1=*sio1TxStr++;
rSIOCON1|=(1<<3);
}
else endSio1Tx=1;
}
void Test_SIO0_DMA_Tx(void)
{
int i;
unsigned int savePcon6;
char *txStr0, *rxStr1;
Uart_Printf("[SIO0 DMA Tx Test]\n");
pISR_DMA0=(unsigned)DMA0_Int;
pISR_DMA1=(unsigned)DMA1_Int;
rINTPND=0x0;
rSYSCON|=BIT_GLOBAL;
rINTMSK=(BIT_DMA0|BIT_DMA1);
dma0siostop=0;
dma1siostop=0;
txStr0="0123456789abcdefghijklmnopqrstuvwxyz";
rxStr1=(char *)malloc(strlen((char *)txStr0)+1);
for(i=0;i<(strlen((char *)txStr0)+1);i++)
{
*(rxStr1+i)=0x0;
}
savePcon6=rPCON6;
rPCON6=0x280b4;
// DMA0 Configuration : Mode=SIO, Source=Increase, Destination=Fix, Stop Interrupt, Single, Byte Transfer
rDMASRC0=(int)txStr0;
rDMADST0=SIODAT0;
rDMACNT0=strlen(txStr0);
rDMACON0=0x014d;
Uart_Printf("C=0x%x\n",rDMACNT0);
rSBRDR0=0x8; // if MCLK=50MHz, SIOCLK0=12.5MHz
rITVCNT0=0x4;
// SIO0 Configuration : Mode=DMA0, Auto run, Rising edge, Rx/Tx mode, MSB, Internal clk
rSIOCON0=(0<<7)|(0<<6)|(1<<5)|(0<<4)|(0<<2)|2;
while(dma0siostop==0);
Uart_Printf("Tx Complete!!!! C=0x%x\n",rDMACNT0);
// DMA1 Configuration : Mode=SIO, Source=Fix, Destination=Increase, Stop Interrupt, Single, Byte Transfer
rDMASRC1=SIODAT1;
rDMADST1=(int)rxStr1;
rDMACNT1=strlen(txStr0);
rDMACON1=0x018d;
// SIO1 Configuration : Mode=DMA1, Auto run, Rising edge, Rx only, MSB, External clock
rSIOCON1=(1<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<2)|3;
rSIOCON1|=(1<<3);
Uart_Printf("Rx Start!!!!\n");
while(dma1siostop==0);
*(rxStr1+strlen((char *)txStr0))='\0';
Uart_Printf("Tx Strings: %s\n",txStr0);
Uart_Printf("Rx Strings: %s :",rxStr1);
if(strcmp(rxStr1,txStr0)==0)Uart_Printf("OK!!!\n");
else Uart_Printf("Error!!!\n");
rPCON6=savePcon6;
rSYSCON&=~(BIT_GLOBAL);
free(rxStr1);
}
void Test_SIO0_DMA_Rx(void)
{
int i;
unsigned int savePcon6;
char *txStr0, *rxStr0;
Uart_Printf("[SIO0 DMA Rx Test]\n");
pISR_DMA0=(unsigned)DMA0_Int;
pISR_DMA1=(unsigned)DMA1_Int;
rINTPND=0x0;
rSYSCON|=BIT_GLOBAL;
rINTMSK=(BIT_DMA0|BIT_DMA1);
dma1siostop=0;
dma0siostop=0;
txStr0="0123456789abcdefghijklmnopqrstuvwxyz";
rxStr0=(char *)malloc(strlen((char *)txStr0)+1);
for(i=0;i<(strlen((char *)txStr0)+1);i++)
{
*(rxStr0+i)=0x0;
}
savePcon6=rPCON6;
rPCON6=0x2d0a0;
// DMA1 Configuration : Mode=SIO, Source=Increase, Destination=Fix, Stop Interrupt, Single, Byte Transfer
rDMASRC1=SIODAT0;
rDMADST1=(int)rxStr0;
rDMACNT1=strlen(txStr0);
rDMACON1=0x018d;
// SIO0 Configuration : Mode=DMA1, Auto run, Rising edge, Rx/Tx mode, MSB, Internal clk
rSIOCON0=(1<<7)|(0<<6)|(0<<5)|(0<<4)|(0<<2)|3;
rSIOCON0|=(1<<3);
while(dma1siostop==0);
*(rxStr0+strlen((char *)txStr0))='\0';
Delay(100);
// DMA1 Configuration : Mode=SIO, Source=Fix, Destination=Increase, Stop Interrupt, Single, Byte Transfer
rDMASRC0=(int)rxStr0;
rDMADST0=SIODAT1;
rDMACNT0=strlen(txStr0);
rDMACON0=0x014d;
rSBRDR1=0x8;
rITVCNT1=0x4;
// SIO1 Configuration : Mode=DMA0, Auto run, Rising edge, Rx only, MSB, External clock
rSIOCON1=(0<<7)|(0<<6)|(1<<5)|(0<<4)|(0<<2)|2;
while(dma0siostop==0);
Uart_Printf("Tx Strings: %s\n",txStr0);
Uart_Printf("Rx Strings: %s :",rxStr0);
if(strcmp(rxStr0,txStr0)==0)Uart_Printf("OK!!!\n");
else Uart_Printf("Error!!!\n");
rPCON6=savePcon6;
rSYSCON&=~(BIT_GLOBAL);
free(rxStr0);
}
void __irq DMA0_Int(void)
{
rINTPND=~(BIT_DMA0);
dma0siostop=1;
}
void __irq DMA1_Int(void)
{
rINTPND=~(BIT_DMA1);
dma1siostop=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -