📄 main.c.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 + -