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.

28377S在SYSBIOS里移植MODBUS,上位机通过串口发送数据,程序无法进入接收中断

Other Parts Discussed in Thread: SYSBIOS

一开始没有用SYSBIOS做,测试程序好用没有问题,发送的数据和返回的数据都是正确的。

改为用SYSBIOS后发现程序一直无法进入串口中断,首次调试的时候能进入串口接收中断。换了一块开发板(买的28377STI官方的开发板)重新下载程序,串口接收发送中断都无效了。程序能正常跑,就是无法进入串口中断,但是能进入定时器中断。

把代码传上来。在附件里。期待大家帮忙看看。刚接触SYSBIOS,不熟悉,出了错误调试很久也没有进展。

task28_TMS320F28377S.rar
  • 建议调试时观察下receiver's error flags状态,数据手册SCIRXST register(RXERROR, BRKDT, FE, OE, PE),table 18-13

    请参考下 C2000Ware 中F2837x SCI interrupt example 

  • 您好,我仿真查看了一下串口相关寄存器,都没有出现错误的标志位。中断标志也没有置位。看起来就像是串口没有反应。

    不知道还有没有其他方法可以调试。

    期待您的回答。

  • 您好,看描述似乎并没有跑串口程序,不知您工程中是如何调度这块任务的呢?

  • Int main()
    {

    InitPeripheralClocks();
    InitGpio();
    LED_INIT();
    Log_info0("Hello world\n");
    eMBInit(MB_RTU, 0x11, 0x05, 115200, MB_PAR_NONE);
    eMBEnable();

    /* 

    * Start BIOS.
    * Begins task scheduling.
    */
    BIOS_start(); /* does not return */
    return(0);
    }

    这是main函数 串口初始化在eMBInit(MB_RTU, 0x11, 0x05, 115200, MB_PAR_NONE);里实现

    BOOL
    xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity )
    {
    GPIO_SetupPinMux(90, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(90, GPIO_INPUT, GPIO_PUSHPULL);
    GPIO_SetupPinMux(89, GPIO_MUX_CPU1, 6);
    GPIO_SetupPinOptions(89, GPIO_OUTPUT, GPIO_ASYNC);

    ScicRegs.SCICCR.bit.ADDRIDLE_MODE = 0;//选择通信协议,选择空闲模式,此模式兼容RS232协议
    ScicRegs.SCICCR.bit.LOOPBKENA = 0;//自测试模式使能位:为1使能,为0禁用
    ScicRegs.SCICCR.bit.PARITY = 0;//奇偶校验位选择位:0为奇校验,1为偶校验
    ScicRegs.SCICCR.bit.PARITYENA = 0;//奇偶校验位使能:为1使能,为0禁用
    ScicRegs.SCICCR.bit.SCICHAR = 7;//该配置选择SCI的一个字符的长度可配置为1到8位(单位bit)
    ScicRegs.SCICCR.bit.STOPBITS = 0;//停止位的配置: 0 1位停止位 1 2位停止位
    //SCIC控制寄存器的配置
    ScicRegs.SCICTL1.bit.RXENA = 1;//SCI接收器使能位
    ScicRegs.SCICTL1.bit.RXERRINTENA = 0;//SCI接受中断错误使能
    ScicRegs.SCICTL1.bit.SLEEP = 0;//睡眠模式使能位
    //ScicRegs.SCICTL1.bit.SWRESET = 0;//SCI软件复位
    ScicRegs.SCICTL1.bit.TXENA = 1;//SCI发送器使能位
    ScicRegs.SCICTL1.bit.TXWAKE = 0;//SCI发送器唤醒模式选择位,具体的不是太明白
    //-------------------------------------------------------------------
    ScicRegs.SCICTL2.bit.RXBKINTENA = 0;//接收中断使能
    ScicRegs.SCICTL2.bit.TXINTENA = 0;
    ScicRegs.SCIHBAUD.all = 0x0002;
    ScicRegs.SCILBAUD.all = 0x008B;
    //ScicRegs.SCICTL1.bit.SWRESET = 1;
    //以下代码是配置SCI的接收数据的FIFO和发送数据的FIFO
    //-------------------接收数据的FIFO配置
    ScicRegs.SCIFFRX.bit.RXFFIENA = 1;//使能接收中断
    ScicRegs.SCIFFRX.bit.RXFIFORESET = 0;//复位接收器的FIFO
    ScicRegs.SCIFFRX.bit.RXFIFORESET = 1;
    ScicRegs.SCIFFRX.bit.RXFFIL = 0x01;//接受1个字节之后产生一个中断
    //---------------------发送数据的FIFO配置
    ScicRegs.SCIFFTX.bit.SCIRST = 0;//复位SCIC模块
    ScicRegs.SCIFFTX.bit.SCIRST = 1;//复位SCIC模块
    ScicRegs.SCIFFTX.bit.SCIFFENA = 1;//使能FIFO功能
    ScicRegs.SCIFFTX.bit.TXFFIENA = 1;
    ScicRegs.SCIFFTX.bit.TXFIFORESET = 0;
    ScicRegs.SCIFFTX.bit.TXFIFORESET = 1;
    ScicRegs.SCIFFTX.bit.TXFFINTCLR = 1;
    ScicRegs.SCIFFTX.bit.TXFFIL = 0x01;//发送完一个字节产生中断

    return TRUE;
    }

    以上是串口初始化配置

    在仿真观察中这些寄存器的数值与我配置的数值一样。

    我的程序里还有一个定时器中断,定时器中断就没有问题。