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.

F28335串口通信SCI输出乱码问题



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 interrupts
   DINT;

// 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 FIFO
    scic_echoback_init();  // Initalize SCI for echoback

    msg = "\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 character
       while(ScicRegs.SCIRXST.bit.RXRDY !=1) { } // wait for XRDY =1 for empty state

       // Get character
       ReceivedChar = ScicRegs.SCIRXBUF.all;

       // Echo character back
       msg = "  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.
//===========================================================================

第二个程序的乱码!