以下部分代码在28335中用RS232与PC机串口调试软件通讯正常,我作少许改动,移动28035中,用ADM483E芯片,作成485通讯,但是与PC机不能正常通讯,PC机不停向DSP发送数据,DSP可以接收到(但有时不数据不准确),但不能发送数据,即PC机没有接收到响应的数据。代码如下,请问我还那些遗漏需改动的,请各位指教!
#include "DSP28x_Project.h" // Device Headerfile and Examples Include File
unsigned int Sci_VarRx;
unsigned int Sci_VarTx;
int Send_Flag;
int SciaTx_Ready(void);
int SciaRx_Ready(void);
int Rx_flag;
int Tx_flag;
void Scia_init(void);
void main(void)
{
Rx_flag=0;
Tx_flag=0;
Sci_VarRx = 0;
Sci_VarTx = 0;
Send_Flag = 0;
InitSysCtrl();//LSPCLK=SYSCLKOUT/2=60MHZ/2=30MHZ
InitSciaGpio();
EALLOW;
GpioCtrlRegs.GPAPUD.bit.GPIO25 = 0; //配置485-RTS使能上拉
GpioCtrlRegs.GPAMUX2.bit.GPIO25 = 0; //配置485-RTS的GPIO25为IO功能
GpioCtrlRegs.GPADIR.bit.GPIO25 = 1; //配置485-RTS为输出
GpioDataRegs.GPADAT.bit.GPIO25 = 0; //设置485-RTS默认输出为低电平
//控制ADM483E2、3脚电平(2、3脚已短路)
EDIS;
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
Scia_init();
EnableInterrupts();
PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
EINT; // Enable Global interrupt INTM
ERTM; // Enable Global realtime interrupt DBGM
for(;;)
{
SciaTx_Ready();
if((Tx_flag == 1) && (Send_Flag == 1))
{
switch(Sci_VarRx)
{
case 48:Sci_VarTx=50; //H
break;
case 49:Sci_VarTx=101; //e
break;
case 50:Sci_VarTx=108; //l
break;
case 51:Sci_VarTx=108; //l
break;
case 52:Sci_VarTx=111; //o
break;
default: Sci_VarTx=48;
}
SciaRegs.SCITXBUF =Sci_VarTx;
Send_Flag = 0;
}
SciaRx_Ready();
if(Rx_flag == 1)
{
Sci_VarRx = SciaRegs.SCIRXBUF.all;
Send_Flag = 1;
}
}
}
void Scia_init()
{
SciaRegs.SCICCR.all =0x0007; // 设置通信控制寄存器
// 0x0007 = 0000 0111
//STOP BITS = 0(1 个停止位)
//EVEN/ODD PARITY = 0(奇校验)
//PARITY ENABLE = 0(奇偶校验禁用)
//LOOP BACK ENA = 0(自测试模式禁用)
//ADDR/IDLE MODE = 0(选择空闲线模式协议)
//SCI CHAR2-0 = 7(选择8位SCI字符长度)
SciaRegs.SCICTL1.all =0x0003; // 设置SCI控制寄存器1
// 0x0007 = 0000 0011
//RX ERR INT ENA = 0(接收错误中断禁用)
//SW RESET = 0(向此位写入0将初始化SCI状态机和操作标志(寄存器SCICTL2和SCIRXST)为复位条件)
//TXWAKE = 0(发送特征未选择)
//SLEEP = 1(休眠模式使能)
//TXENA = 1(发送器使能)
//RXENA = 1(接收器使能)
SciaRegs.SCICTL2.all =0x0003;//设置控制寄存器2
//0x0003 = 0000 0011
//TXRDY = 0(SCITXBUF已满)
//TX EMPTY = 0(发送器缓冲寄存器和移位寄存器均为空)
//RX/BK INT ENA = 1(使能RXRDY/BRKDT中断)
//TX INT ENA = 1(使能TXRDY中断)
SciaRegs.SCICTL2.bit.TXINTENA =1; //使能TXRDY中断
SciaRegs.SCICTL2.bit.RXBKINTENA =1; //使能RXRDY/BRKDT中断
SciaRegs.SCIHBAUD =0x0000; //
SciaRegs.SCILBAUD =0x00C2; //波特率为LSPCLK/[(194+1)*8]=30M/(195*8)=19200(波特率取19200)
//ScibRegs.SCICCR.bit.LOOPBKENA =1; // 自测试模式使能
SciaRegs.SCICTL1.all =0x0023; // 0x0023 = 0010 0011
//SW RESET = 1(系统复位后,向此位写入1将重新使能SCI)
}
int SciaRx_Ready()
{
GpioDataRegs.GPADAT.bit.GPIO25 = 0; //低电平
DELAY_US(1000);
if(SciaRegs.SCIRXST.bit.RXRDY == 1)
/*数据从RXSHF接收移位器移入缓冲寄存器(SCIRXBUF)时,SIC接收器就绪标志位(RXRDY)置1,表明一个新的字符已经接收,*/
{
Rx_flag = 1;
}
else
{
Rx_flag=0;
}
return(Rx_flag);
}
int SciaTx_Ready(void)
{
GpioDataRegs.GPADAT.bit.GPIO25 = 1; //高电平
DELAY_US(1000);
if(SciaRegs.SCICTL2.bit.TXRDY == 1)
/*当SCI发送缓冲寄存器(SCITXBUF)中的数据传送到TXSHF寄存器时,则发送就绪,标志位TXRDY被置1*/
{
Tx_flag=1;
}
else
{
Tx_flag=0;
}
return(Tx_flag);
}
//===========================================================================
// No more.
//=========================================================================== |