如题,希望能够使用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;
}