F28335的串口通讯SCI输出乱码,程序一个是别人试验过的,一个是自己编写的,输出都乱码,不知道为什么,求能人帮忙解答一下,谢谢。
第一个程序!
#include "DSP2833x_Device.h"// DSP2833x Headerfile Include File #include "DSP2833x_Examples.h"// DSP2833x Examples Include File // Prototype statements for functions found within this file. void scic_echoback_init(void); void scic_fifo_init(void); void scic_xmit(int a); void scic_msg(char *msg); // Global counts used in this example Uint16 LoopCount; Uint16 ErrorCount; void main(void) {Uint16 ReceivedChar;char *msg; // Step 1. Initialize System Control: // PLL, WatchDog, enable Peripheral Clocks // This example function is found in the DSP2833x_SysCtrl.c file.InitSysCtrl(); // Step 2. Initalize GPIO: // This example function is found in the DSP2833x_Gpio.c file and // illustrates how to set the GPIO to it's default state.// InitGpio(); Skipped for this example // For this example, only init the pins for the SCI-A port. // This function is found in the DSP2833x_Sci.c file.InitScicGpio();InitXintf16Gpio(); // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interruptsDINT; // Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the DSP2833x_PieCtrl.c file.InitPieCtrl(); // Disable CPU interrupts and clear all CPU interrupt flags:IER = 0x0000;IFR = 0x0000; // Initialize the PIE vector table with pointers to the shell Interrupt // Service Routines (ISR). // This will populate the entire table, even if the interrupt // is not used in this example. This is useful for debug purposes. // The shell ISR routines are found in DSP2833x_DefaultIsr.c. // This function is found in DSP2833x_PieVect.c.InitPieVectTable(); // Step 4. Initialize all the Device Peripherals: // This function is found in DSP2833x_InitPeripherals.c // InitPeripherals(); // Not required for this example // Step 5. User specific code:LoopCount = 0;ErrorCount = 0;scic_fifo_init();// Initialize the SCI FIFOscic_echoback_init(); // Initalize SCI for echobackmsg = "\r\n\n\nHello Yan Xu!\0";scic_msg(msg);msg = "\r\nYou will enter a character, and the DSP will echo it back! \n\0";scic_msg(msg); for(;;){msg = "\r\nEnter a character: \0";scic_msg(msg);// Wait for inc characterwhile(ScicRegs.SCIRXST.bit.RXRDY !=1) { } // wait for XRDY =1 for empty state// Get characterReceivedChar = ScicRegs.SCIRXBUF.all;// Echo character backmsg = " You sent: \0";scic_msg(msg);scic_xmit(ReceivedChar);LoopCount++;} } // Test 1,SCIA DLB, 8-bit word, baud rate 0x000F, default, 1 STOP bit, no parity void scic_echoback_init() {// Note: Clocks were turned on to the SCIA peripheral// in the InitSysCtrl() function ScicRegs.SCICCR.all =0x0007;// 1 stop bit, No loopback// No parity,8 char bits,// async mode, idle-line protocol ScicRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,// Disable RX ERR, SLEEP, TXWAKE ScicRegs.SCICTL2.all =0x0003; ScicRegs.SCICTL2.bit.TXINTENA = 1; ScicRegs.SCICTL2.bit.RXBKINTENA =1; #if (CPU_FRQ_150MHZ)ScicRegs.SCIHBAUD=0x0001; // 9600 baud @LSPCLK = 37.5MHz.ScicRegs.SCILBAUD=0x00E7; #endif #if (CPU_FRQ_100MHZ)ScicRegs.SCIHBAUD=0x0001; // 9600 baud @LSPCLK = 20MHz.ScicRegs.SCILBAUD=0x0044; #endif ScicRegs.SCICTL1.all =0x0023; // Relinquish SCI from Reset } // Transmit a character from the SCI void scic_xmit(int a) {while (ScicRegs.SCICTL2.bit.TXRDY == 0) {}ScicRegs.SCITXBUF=a; } void scic_msg(char * msg) {int i;i = 0;while(msg[i] != '\0'){scic_xmit(msg[i]);i++;} } // Initalize the SCI FIFO void scic_fifo_init() {ScicRegs.SCIFFTX.all=0x8000; //ScicRegs.SCIFFRX.all=0x204f; //ScicRegs.SCIFFCT.all=0x0; } //=========================================================================== // No more. //===========================================================================
第二个程序!
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_Examples.h" // DSP2833x Examples Include File #define SCI 1 #define UART_INT 0 interrupt void scicTxFifoIsr(void); void InitScicGpio(void); void scic_fifo_init(); void error(void); Uint16 sdataB[6]={9,5,1,0,2,0}; void main(void) { //Uint16 i; InitSysCtrl(); //InitGpio(); //InitSciGpio(); DINT; InitPieCtrl(); IER = 0x0000; IFR = 0x0000; InitPieVectTable(); InitScicGpio(); EALLOW; PieVectTable.SCITXINTC = &scicTxFifoIsr; EDIS; //IER = M_INT8; scic_fifo_init(); PieCtrlRegs.PIECTRL.bit.ENPIE = 1;//在DSP281x_PieVect文件的InitPieVectTable函数里有PieCtrlRegs.PIECRTL.bit.ENPIE = 1;//所以InitPieCtrl总是在InitPieVectTable的前面;在主函数中再写这么一句是多余的! //PieCtrlRegs.PIEIER8.bit.INTx5=1;//使能SCIRXINTB PieCtrlRegs.PIEIER8.bit.INTx6=1;//使能SCITXINTB IER = M_INT8;//使能CPU中断 EINT; for(;;); } interrupt void scicTxFifoIsr(void) { Uint16 i; for(i=0;i<6;i++)//发送数据 { ScicRegs.SCITXBUF=sdataB[i]; } //ScicRegs.SCIFFTX.bit.TXFIFOXRESET=0;//复位FIFO //ScicRegs.SCIFFTX.bit.TXFIFOXRESET=1;// 使能FIFO ScicRegs.SCIFFTX.bit.TXFFINTCLR=1; //清除发送FIFO中断标志位,在此处如果清零会导致发送FIFO中断一直产生,因此要关闭才行 PieCtrlRegs.PIEACK.bit.ACK8 = 1;//通知可以接受第9组中断中的所有中断[第9组中断:SCI-A/SCI-B;第8组中断:SCI-C] } void scic_fifo_init() { ScicRegs.SCICCR.all =0x0007;//空闲线协议 / 8位数据 ScicRegs.SCICTL1.all =0x0002;//SCI接受和发送使能[发送使能置位数据才能通过SCITXD引脚发送;接收使能才能将接收到的字符复制到SCIRXEMU和SCIRXBUF] ScicRegs.SCICTL2.bit.TXINTENA =1;//使能TXRDY中断,可以通过置位TXRDY标志位引发中断请求 //ScicRegs.SCICTL2.bit.RXBKINTENA =1; ScicRegs.SCIHBAUD =0x0001;//波特率设置 9600 ScicRegs.SCILBAUD =0x00E7; //ScicRegs.SCICCR.bit.LOOPBKENA =0;//屏蔽自测模式!!! ScicRegs.SCIFFTX.all=0xE066;//C:SCI FIFO能继续发送或接收;SCI FIFO功能使能 | 2:使能TX FIFO中断 //ScicRegs.SCIFFTX.bit.TXFFIL = 6; ScicRegs.SCIFFCT.all=0x00; ScicRegs.SCICTL1.all =0x0022;//禁止SCI软件复位 ScicRegs.SCIFFTX.bit.TXFIFOXRESET=1; //ScicRegs.SCIFFRX.bit.RXFIFORESET=1; } void error(void) { asm(" ESTOP0"); // Test failed!! Stop! for (;;); } void InitScicGpio(void) { EALLOW; GpioCtrlRegs.GPBPUD.bit.GPIO62 = 0;// 使能内部上拉功能 GpioCtrlRegs.GPBPUD.bit.GPIO63 = 0; GpioCtrlRegs.GPBQSEL2.bit.GPIO62 = 3;//不同步采样 GpioCtrlRegs.GPBQSEL2.bit.GPIO63 = 3; GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 1;//配置GPIO62为SCIRXDC引脚 GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 1;//配置GPIO62为SCITXDC引脚 GpioCtrlRegs.GPBDIR.bit.GPIO62=0; GpioCtrlRegs.GPBDIR.bit.GPIO63=1; EDIS; } //=========================================================================== // No more. //===========================================================================
第二个程序的乱码!
Seven Han:这两个代码看着像TIcontrolsuite中的例程,调试时您需要注意以下几点:
1.gpio的配置
2.时钟配置
3.波特率设置
另外还建议您更换个串口软件试试。