📄 uart.c
字号:
#include "C6713.h"
#include "stdio.h"
#define BUFFER_SIZE 29
#define TRUE 1
#define FALSE 0
#pragma DATA_SECTION(xmitbuf,"xmit_buf");
unsigned short xmitbuf[0x01d0];
#pragma DATA_SECTION(recvbuf,"recv_buf");
unsigned short recvbuf[0x0400];
volatile int receive_done = FALSE;
volatile int transmit_done =FALSE;
char xmit_msg[BUFFER_SIZE]= "PengYuhui apply McBSP to UART";
char recv_msg[BUFFER_SIZE]= "Peng Yuhui is success";
void initemif(void);
void initPLL(void);
void initInterrupt(void);
void initMcBSP0(void);
void initEDMA(void);
void ProTranData(void);
void ProRecData(void);
short VtoLogic(unsigned short value);
void interrupt EDMAInt(void);
int checkTestCase(void);
void main()
{
int works = FALSE;
initemif();
initPLL();
initInterrupt();
printf("TransmitData...\n");
ProTranData();
printf("TransmitData:%s\n",xmit_msg);
initEDMA();
(*(int *)CIER) &= 0xffff3fff;
(*(int *)EER) &= 0xffff3fff;
initMcBSP0();
while(!receive_done || !transmit_done);
works = checkTestCase();
if (works !=0)
{
printf("transmission err...\n\n");
}
else
{
printf("received data matched transmitted data!...\n\n");
}
printf("ReceiveData...\n");
ProRecData();
printf("ReceiveData:%s\n",recv_msg);
}
//McBSP0初始化
void initMcBSP0(void)
{
int waittime=0;
(*(int *)SPCR0) &=0xFF3EFFFE;
(*(int *)SRGR0) =0x2000009B;
(*(int *)SPCR0) =0x00000000;
(*(int *)PCR0) =0x00000b0c;
(*(int *)RCR0) =0x00050940;
(*(int *)XCR0) =0x00040940;
(*(int *)SPCR0) |=0x00400000;
for(waittime=0;waittime<0x5f;waittime++);
(*(int *)SPCR0) |=0x00010001;
(*(int *)SPCR0) |=0x00800000;
}
//EMIF初始化
void initemif(void)
{
(*(int *)GBLCTL)=0x00000078;
(*(int *)CECTL0)=0xffffff13;
(*(int *)CECTL1)=0xffffff23;
(*(int *)CECTL2)=0xffffff13;
}
//中断初始化
void initInterrupt(void)
{
CSR=CSR&0xfffffffe;
ISTP=0x800;
(*(int *)MUXL)=0x20000000;
ICR=0xffff;
IER=0x203;
CSR=CSR|1;
}
//PLL初始化
void initPLL(void)
{
(*(int *)PLLCSR) &=0xfffffffe;
(*(int *)PLLCSR) |=0x00000008;
(*(int *)PLLM ) =0x00000010;
(*(int *)PLLDIV0) =0x00008000;
(*(int *)OSCDIV1) =0x00008001;
(*(int *)PLLDIV3) =0x00008001;
(*(int *)PLLDIV2) =0x00008003;
(*(int *)PLLDIV1) =0x00008000;
(*(int *)PLLCSR) &=0xfffffff7;
(*(int *)PLLCSR) |=0x00000001;
}
//EDMA初始化
void initEDMA(void)
{
(*(int *)OPT12)=0x291e0000;
(*(int *)SRC12)=(unsigned int) xmitbuf;
(*(int *)CNT12)=BUFFER_SIZE*11;
(*(int *)DST12)=DXR0;
(*(int *)IDX12)=0x00000000;
(*(int *)RLD12)=0x00000000;
(*(int *)OPT13)=0x283f0000;
(*(int *)SRC13)=DRR0;
(*(int *)CNT13)=BUFFER_SIZE*11;
(*(int *)DST13)=(unsigned int) recvbuf;
(*(int *)IDX13)=0x00000000;
(*(int *)RLD13)=0x00000000;
(*(int *)ECR) = 0x0000ffff;
(*(int *)CIER)= 0x00003000;
(*(int *)EER) = 0x00003000;
}
//传输数据
void ProTranData(void)
{
int i;
short cnt=-1;
unsigned char xmit_char;
unsigned short *xmitbufptr;
xmitbufptr =(unsigned short *)xmitbuf;
for(i=0;i<sizeof(xmitbuf)/sizeof(unsigned short);i++)
{
xmitbufptr[i]=0x0000;
}
xmitbufptr =(unsigned short *)xmitbuf;
for(i=0;i<BUFFER_SIZE;i++)
{
xmit_char=xmit_msg[i];
for (cnt=-1;cnt<9;cnt++)
{
if(cnt==-1)
*xmitbufptr++ = 0x0000;
else if (cnt==8)
*xmitbufptr++ = 0xffff;
else if (xmit_char & (1<<cnt))
*xmitbufptr++ = 0xffff;
else
*xmitbufptr++ = 0x0000;
}
}
}
//接受数据
void ProRecData(void)
{
int i;
unsigned char recv_char = 0;
short cnt = -1;
short recv_val;
unsigned short raw_data;
unsigned short *recvbufptr;
recvbufptr = (unsigned short *)recvbuf;
for (i=0;i<BUFFER_SIZE;i++)
{
recv_char = 0;
for(cnt=-1;cnt<9;cnt++)
{
if(cnt == -1 || cnt == 8 )
{
*recvbufptr++;
}
else
{
raw_data = *recvbufptr;
recvbufptr++;
}
recv_val = VtoLogic(raw_data);
recv_char += (recv_val << cnt);
}
recv_msg[i]=recv_char;
}
}
short VtoLogic(unsigned short value)
{
short returnvalue;
if (value>1000)
{
returnvalue = 1;
}
else
{
returnvalue = 0;
}
return(returnvalue);
}
//EDMA中断服务函数
void interrupt EDMAInt(void)
{
if((*(int *)ER)&0x00001000)
{
(*(int *)ECR) |= 0x00001000;
transmit_done=TRUE;
printf("Transmit Completed\n");
}
if((*(int *)ER)&0x00002000)
{
(*(int *)ECR) |= 0x00002000;;
receive_done=TRUE;
printf("Teceive Completed\n");
}
}
int checkTestCase(void)
{
char *source;
char *result;
int i=0;
int err=0;
source = (char *)xmit_msg;
result = (char *)recv_msg;
for (i=0;i<BUFFER_SIZE;i++)
{
source++;
result++;
if((* source)!=(* result))
{
err=err+1;
break;
}
}
return(err);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -