⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sio.c

📁 smdk40100 40mhz test code
💻 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 + -