?? 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 + -