This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好,
我想用DSP和Matlab共同实现一个控制问题。我的DSP板子是EVM6678L,CCS版本是v5.0.3,Matlab版本是7.0。
请问一下是否用EVM套件配套的RS-232串口线就可以实现板子和Matlab间的通讯?如果可以,在哪里能找到DSP串口通讯的程序?
谢谢!
你所需做的就是DSP与PC的通信,UART,EMAC,PCIe等接口都可以,但是我们只有DSP侧的相关例子:www.deyisupport.com/.../215.aspx
Hi, Yang lu,
附件是一个C6713用RS-232串口线连接实现异步串口通信的程序(程序中有详细注释),编程方面主要是通过CSL函数来设置各种寄存器,使用EDMA事件结束中断来进行控制。
您可以根据此程序做相应的更改,比如更改:宏(把6713改成6678)、波特率(改程序中ConfigMcBSP函数中srgr寄存器的后两位)、帧长(BUFFER_SIZE的值)等等。
另外,《TMS320C6000DSP实用技术与开发案例》一书中的6.8节分析了“DSP和异步串口的连接”,讲得比较详细,您可以找来参考下,希望对您有所帮助。
#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 ConfigEDMA1(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]; ProcessTransmitData(); ConfigEDMA(); EDMA_intEnable(14); EDMA_enableChannel(hEdma14); MCBSP_enableXmt(hMcbsp1); } }; } void initMCBSP(void) // ��ʼ�����崮�ں��� { int waittime = 0; hMcbsp1 = MCBSP_open(MCBSP_DEV1, MCBSP_OPEN_RESET); ConfigMcBSP(); // ���û��崮�� MCBSP_enableSrgr(hMcbsp1); // �������ʱ�ӷ����� for (waittime=0; waittime<0x10F; waittime++); hEdma14 = EDMA_open(EDMA_CHA_XEVT1, EDMA_OPEN_RESET); hEdma15 = EDMA_open(EDMA_CHA_REVT1, EDMA_OPEN_RESET); // ����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); } }