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.

TMS320F28377D: 使用SCI和RS485通讯时,只有特定波特率可以正常通讯

Part Number: TMS320F28377D


如题,希望能够使用28377和板子上的RS485模块实现2.5MHz的串口通讯,但目前发现,改变LSPCLK为100MHz时,只有波特率为19200才能正常通讯。LSPCLK默认配置时,也有很多波特率无法正常工作。哪怕设置波特率为12500、1250这类理论上无误差的波特率,也无法正常通讯。

代码如下:

/*---------------------自定义头文件-----------------------------*/
#include "database.h"
/*-----------------------函数申明-----------------------------*/
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr);
void delay (Uint16 t);
void scia_xmit(int a);
void scia_msg(char *msg);
void scia_msg2(Uint16 *msg);
/*-----------------------变量申明-----------------------------*/
Uint16  nBufIndex;
Uint16  Buff_index;
//===========================================================

Uint16 ReceivedChar;		//接收暂存
char *msg;					//发送暂存
//-----------------------------------------------------------
void main(void)
{

   InitSysCtrl();			//系统时钟初始化
   InitIpc();
   #ifdef _STANDALONE
   #ifdef _FLASH
 //    Send boot command to allow the CPU02 application to begin execution
     IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_FLASH);
   #else
//    Send boot command to allow the CPU02 application to begin execution
    IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM);
   #endif
   #endif
//-----------------------------------------------------
   InitGpio();
   DINT;
   IER = 0x0000;
   IFR = 0x0000;

   InitPieVectTable();
//--------------------外设初始化-----------------
   InitPeripheral();
//--------------------------------写FLASH程序-----------------------------------
   MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
   InitFlash();
   PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
   PieCtrlRegs.PIECTRL.bit.ENPIE = 1; //使能PIE
   IER |=(M_INT1);
   EINT;
//----------------------------------------------------testing---------------------------------------------------
    EALLOW;
    GpioCtrlRegs.GPBMUX1.bit.GPIO36=0;			//RS485输出输入选择
	GpioCtrlRegs.GPBDIR.bit.GPIO36=1;
	ClkCfgRegs.LOSPCP.bit.LSPCLKDIV=1; //LSPCLK设为100Mhz
    EDIS;
    GpioDataRegs.GPBSET.bit.GPIO36=1;			//将RS485配置为发送
    ScibRegs.SCIHBAUD.all =0x0000; //LSPCLK=100M
    ScibRegs.SCILBAUD.all =0x0004; //CLK=2.5M
   //
    // Note: Clocks were turned on to the SCIA peripheral
    // in the InitSysCtrl() function
    //

    SciaRegs.SCICCR.all = 0x0007;  // 1 stop bit,  No loopback
                                   // No parity,8 char bits,
                                   // async mode, idle-line protocol
    SciaRegs.SCICTL1.all = 0x0003; // enable TX, RX, internal SCICLK,
                                   // Disable RX ERR, SLEEP, TXWAKE
    SciaRegs.SCICTL2.all = 0x0003;
    SciaRegs.SCICTL2.bit.TXINTENA = 1;
    SciaRegs.SCICTL2.bit.RXBKINTENA = 1;
    SciaRegs.SCICCR.bit.LOOPBKENA = 1; // Enable loop back
    SciaRegs.SCICTL1.all = 0x0023;     // Relinquish SCI from Reset
    SciaRegs.SCIFFTX.all = 0xE040;
    SciaRegs.SCIFFRX.all = 0x2044;
    SciaRegs.SCIFFCT.all = 0x0;


    for(;;)
    {

		scia_xmit(0x02);

		delay (50000);
		delay (50000);
     }
//--------------------------------------------------------------
}
void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
{
    while(SourceAddr < SourceEndAddr)
    {
       *DestAddr++ = *SourceAddr++;
    }
    return;
}
void delay (Uint16 t)		//延时函数
{ Uint16 i;
  while(t--)
  {
     for(i=0;i<125;i++)
     asm(" RPT #3 || NOP");
  }
}
void scia_xmit(int a)
{
    while (ScidRegs.SCIFFTX.bit.TXFFST != 0) {}
    ScidRegs.SCITXBUF.all = a;
}