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

📄 main.c.c

📁 TIC6000系列MCBSP控制AD的程序
💻 C
字号:
#define CHIP_6713 1
#include <csl.h>
#include <csl_mcbsp.h>
#include <csl_edma.h>
#include <csl_irq.h>
#include <stdio.h>

#pragma DATA_SECTION(xmitbuf,"xmit_buf");    // 预留buffers,并且分配到L2空间
unsigned short xmitbuf[0x0400];
#pragma DATA_SECTION(recvbuf,"recv_buf");
unsigned short recvbuf[0x0400];
#define BUFFER_SIZE 19                       // UART一次通信的数据个数
#define TRUE 1
#define FALSE 0
#define McBSP1Mux 0x90080006
MCBSP_Handle hMcbsp1;                      //  McBSP1句柄函数
EDMA_Handle hEdma14;                      //  EDMA 14句柄函数
EDMA_Handle hEdma15;                      //  EDMA 15句柄函数
volatile int receive_done = FALSE;
volatile int transmit_done = TRUE;
volatile int cnt=0;
char xmit_msg[BUFFER_SIZE] = "DSP6713W00E\n";
char recv_msg[BUFFER_SIZE] = "\n";
extern far void vectors();
void ConfigMcBSP(void);
void ConfigEDMA(void);
void ProcessTransmitData(void);
unsigned char ProcessReceiveData(void);
short VoteLogic(unsigned short);
int CheckTestCase(void);
interrupt void c_int08(void);
void initMCBSP(void);


void main(void)                         		// 主函数
{
    int i;
    CSL_init();                             		// 初始化CSL库
    IRQ_nmiEnable();                       		// 使能nmi中断
    IRQ_globalEnable();                     		// 使能全局中断
    IRQ_setVecs(vectors);                    		// 设置中断向量表地址
    IRQ_reset(IRQ_EVT_EDMAINT);
    EDMA_clearPram(0x00000000);					// 清空EDMA参数RAM
    
    initMCBSP();									// 打开缓冲串口1
    
    while(1)
    {	if(cnt>=BUFFER_SIZE)
		{   
		cnt=0;
		for(i=0;i<=BUFFER_SIZE;i++)
		xmit_msg[i]=recv_msg[i];		
		EDMA_enableChannel(hEdma14);
		MCBSP_enableXmt(hMcbsp1);
		}
    };
} 

void initMCBSP(void) 									// 初始化缓冲串口函数
{
    int waittime = 0;
    hMcbsp1 = MCBSP_open(MCBSP_DEV1, MCBSP_OPEN_RESET);
    ConfigMcBSP();									// 配置缓冲串口
    MCBSP_enableSrgr(hMcbsp1);						// 开启采样时钟发生器
    							// 配置EDMA通道14发送数据,通道15接收数据
    ConfigEDMA();									// 配置EDMA控制器
    IRQ_enable(IRQ_EVT_EDMAINT);					// 使能EDMA中断CPU
    EDMA_intEnable(14);
    EDMA_intEnable(15);
    EDMA_enableChannel(hEdma14);
    EDMA_enableChannel(hEdma15);
    MCBSP_enableRcv(hMcbsp1);						// 缓冲串口使能接收和发送
    MCBSP_enableFsync(hMcbsp1);
}

void ConfigEDMA(void)     							// EDMA参数RAM设置
{
    EDMA_configArgs(hEdma14,						// 设置EDMA通道14
        EDMA_OPT_RMK(
            EDMA_OPT_PRI_HIGH,
            EDMA_OPT_ESIZE_16BIT, 
            EDMA_OPT_2DS_NO, 
            EDMA_OPT_SUM_INC, 
            EDMA_OPT_2DD_NO,
            EDMA_OPT_DUM_NONE, 
            EDMA_OPT_TCINT_YES, 
            EDMA_OPT_TCC_OF(14), 
            EDMA_OPT_LINK_NO, 
            EDMA_OPT_FS_NO 
                        ),
        EDMA_SRC_RMK((Uint32) xmitbuf),      			// 设置SRC寄存器
        EDMA_CNT_RMK(					  			// 设置CNT寄存器
            EDMA_CNT_FRMCNT_DEFAULT,
            EDMA_CNT_ELECNT_OF(BUFFER_SIZE*10)
                        ),
        EDMA_DST_RMK(MCBSP_getXmtAddr(hMcbsp1)),	// 设置DST寄存器
        EDMA_IDX_RMK(0,0),							// 设置IDX寄存器
        EDMA_RLD_RMK(0,0)							// 设置RLD寄存器
                        );

        EDMA_configArgs(hEdma15, 						// 设置EDMA通道15
            EDMA_OPT_RMK(
                EDMA_OPT_PRI_HIGH, 
                EDMA_OPT_ESIZE_16BIT, 
                EDMA_OPT_2DS_NO, 
                EDMA_OPT_SUM_NONE, 
                EDMA_OPT_2DD_NO, 
                EDMA_OPT_DUM_INC,
                EDMA_OPT_TCINT_YES, 
                EDMA_OPT_TCC_OF(15),
                EDMA_OPT_LINK_NO, 
                EDMA_OPT_FS_NO
                              ),

            EDMA_SRC_RMK(MCBSP_getRcvAddr(hMcbsp1)),	// 设置SRC寄存器
            EDMA_CNT_RMK(0, (10)),							// 设置CNT寄存器
            EDMA_DST_RMK((Uint32) recvbuf), 				// 设置DST寄存器
            EDMA_IDX_RMK(0,0),							// 设置IDX寄存器
            EDMA_RLD_RMK(0,0)							// 设置RMK寄存器
                              );
}									

void ConfigEDMA1(void)
{
    EDMA_configArgs(hEdma15,							// 设置EDMA通道15
       EDMA_OPT_RMK(
            EDMA_OPT_PRI_HIGH,
            EDMA_OPT_ESIZE_16BIT, 
            EDMA_OPT_2DS_NO, 
            EDMA_OPT_SUM_NONE, 
            EDMA_OPT_2DD_NO, 
            EDMA_OPT_DUM_INC, 
            EDMA_OPT_TCINT_YES, 
            EDMA_OPT_TCC_OF(15), 
            EDMA_OPT_LINK_NO, 
            EDMA_OPT_FS_NO
                        ),
       EDMA_SRC_RMK(MCBSP_getRcvAddr(hMcbsp1)),		// 设置SRC寄存器
       EDMA_CNT_RMK(0, (10)),							// 设置CNT寄存器
       EDMA_DST_RMK((Uint32) recvbuf),					// 设置DST寄存器
       EDMA_IDX_RMK(0,0),								// 设置IDX寄存器
       EDMA_RLD_RMK(0,0)								// 设置RMK寄存器
                     );
} 

void ConfigMcBSP(void)									// 配置缓冲串口
{
MCBSP_Config mcbspCfg1 = {
       0x00000010, 										// 配置spcr寄存器
       0x80450840, 										// 配置rcr寄存器
       0x80400840, 										// 配置xcr寄存器
       0x20000050, 										// 配置srgr寄存器
       0x00000000, 										// 配置mcr寄存器
       0x00000000, 										// 配置rcer寄存器
       0x00000000, 										// 配置xcer寄存器
       0x00000B0C 										// 配置pcr寄存器
                     };
    MCBSP_config(hMcbsp1, &mcbspCfg1);
} 														//完成缓冲串口的配置

void ProcessTransmitData(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 int)); i++)
        {
            xmitbufptr[i] = 0xFFFF; 						// 发送数据缓冲区清0
        }
    xmitbufptr = (unsigned short *)xmitbuf;					// 处理数据字节
    for (i = 0; i < BUFFER_SIZE; i++)
        {
            xmit_char = xmit_msg[i];
            for (cnt = -1; cnt < 9; cnt++)					// 发送每个字节的8位数据
                {
                    if (cnt == -1)
                        *xmitbufptr++ = 0x0000;
                        else if (cnt >=8)
                            *xmitbufptr++ = 0xFFFF;
                        else if (xmit_char & (1 << cnt))
                            *xmitbufptr++ = 0xFFFF;
                    else
                        *xmitbufptr++ = 0x0000;

                }					 					// 结束8位的数据发送
        } 				

} 														// 数据发送结束

unsigned char ProcessReceiveData(void) 						// 数据接收程序
{
    unsigned char recv_char = 0;
    short cnt = -1;
    short recv_val;
    unsigned short raw_data;
    unsigned short *recvbufptr;
    recvbufptr = (unsigned short *)recvbuf;               // 指向接收数据缓冲区
    recv_char = 0;
    for (cnt = -1; cnt < 9; cnt++)							// 处理每个接收到的数据帧
        {
            if(cnt == -1 || cnt == 8 || cnt == 9)
                {
                    *recvbufptr++;					// 放弃开始位和停止位
                }
            else
                {
                    raw_data = *recvbufptr;				 // 得到16位的数据
                    recvbufptr++;
                    recv_val = VoteLogic(raw_data);
                    recv_char += recv_val << cnt;
                }
        }					 					    // 结束8位的数据接收
    return(recv_char);
} 													// 数据接收结束

short VoteLogic(unsigned short value)
{
    short returnvalue;
    switch ((value >> 6) & 0x0F)
        {
            case 0:
            case 1:
            case 2:
            case 3:
            case 4:
            case 5:
            case 6:
            case 8:
            case 9:
            case 10:
            returnvalue = 0;
            break;
            case 7:
            case 11:
            case 12:
            case 13:
            case 14:
            case 15:
            returnvalue = 1 ;
            break;
        } 											
   return (returnvalue);
} 						

interrupt void c_int08(void)					// EDMA传输结束发送中断
{
   int i;

   if (EDMA_intTest(15))
      {	
      	EDMA_intClear(15);
	    recv_msg[cnt]=ProcessReceiveData();	
	    cnt++;
	    ConfigEDMA1();
	    EDMA_intEnable(15);
     }

   if (EDMA_intTest(14))
      { 	
         EDMA_intClear(14);
         transmit_done = TRUE;
         EDMA_disableChannel(hEdma14);
      }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -