打印

28035 485通讯不正常

[复制链接]
4621|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
z_jzhao|  楼主 | 2012-10-30 15:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下部分代码在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.
//===========================================================================

相关帖子

沙发
z_jzhao|  楼主 | 2012-10-30 15:57 | 只看该作者
此程序功能为:当PC机串口调试软件向DSP发送0时,应收到返回信息H;向DSP发送1时,应收到返回信息e

使用特权

评论回复
板凳
爱之翼V| | 2012-10-30 20:28 | 只看该作者
2楼主讲得对。:handshake

使用特权

评论回复
地板
z_jzhao|  楼主 | 2012-10-31 08:47 | 只看该作者
现在通讯可以正常接收和响应了,但是接收的数据每不稳定,比如。PC发送0时,DSP接收的数据应该是48,有时是正确的,有时其它的数据。为什么?

使用特权

评论回复
5
qwempty| | 2012-10-31 18:28 | 只看该作者
不知道  2L再来看下

使用特权

评论回复
6
superman2012| | 2012-10-31 23:27 | 只看该作者
你可以使用串口调试工具看看你的缓冲区的数据

使用特权

评论回复
7
hawksabre| | 2012-11-1 21:40 | 只看该作者
使用串口调试工具试一下   看看工作是否正常   如果还不正常   建议先看看硬件电路   确保硬件电路正常情况下   在仔细阅读代码查错

使用特权

评论回复
8
hawksabre| | 2012-11-1 21:40 | 只看该作者
个人的一点意见   希望对你有帮助   你在看看别人的意见

使用特权

评论回复
9
z_jzhao|  楼主 | 2012-11-16 13:40 | 只看该作者
现在已解决了,我把程序的流程重新改变了一下。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

72

帖子

0

粉丝