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

📄 uart.c

📁 TMS320C6713用EDMA实现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 + -