电子产品世界 » 论坛首页 » 嵌入式开发 » DSP系统 » 关于用28335编程读取某个支持modbus协议模块内部寄存器的问题,用的是04


共1条 1/1 1 跳转至

关于用28335编程读取某个支持modbus协议模块内部寄存器的问题,用的是04功能

菜鸟
2016-11-17 08:53:14    评分

我先贴程序,我想读取某个模块中寄存器的值,那个模块支持modbus协议,我先用pc机和该模块通信,(如下图)

下面就是我写的程序,结果出现大问题,我把问题贴在程序后面。
#include "DSP2833x_Device.h"     // Headerfile Include File
#include "DSP2833x_Examples.h"   // Examples Include File




//#define  Transmit_EN   GpioDataRegs.GPBSET.bit.GPIO34=1
//#define   Receive_EN   GpioDataRegs.GPBCLEAR.bit.GPIO34=1
#define key_receive       GpioDataRegs.GPADAT.bit.GPIO13
void configureModbus(void);
void scibTxFifoIsr(void);
void rxbint_isr(void);
Uint16 count,rv;
struct funcode{
        Uint16 RBuf[22];//数据存放地址 8位地址,8位功能码 252*8位数据,16位CRC校验码   接收寄存器
        Uint16 TBuf[10];//                                          发送寄存器
        Uint16 RxTimes;
} modbusmodule;




void main(void)
{
          InitSysCtrl();
            InitScibGpio();
            DINT;
            InitPieCtrl();
            IER = 0x0000;
            IFR = 0x0000;
            InitPieVectTable();
            EALLOW;
            PieVectTable.SCIRXINTB=&rxbint_isr;
            PieVectTable.SCITXINTB=&scibTxFifoIsr;
            EDIS;
            scib_echoback_init();
            scib_fifo_init();
            InitCpuTimers();
            ConfigCpuTimer(&CpuTimer0, 100,5000);
            PieCtrlRegs.PIEIER9.bit.INTx3=1;
            PieCtrlRegs.PIEIER9.bit.INTx4=1;
            IER |=0x0100;
            EINT;
        /*EALLOW;
        GpioCtrlRegs.GPBMUX1.bit.GPIO34 =0; //GPIO
        GpioCtrlRegs.GPBDIR.bit.GPIO34=1;  //OUTPUT
        GpioCtrlRegs.GPBPUD.bit.GPIO34=0;
        GpioDataRegs.GPBSET.bit.GPIO34=1;
        EDIS;*/
        configureModbus();
        for(;;)
        {/*if(key_receive==0)
                DELAY_US(5);
           {if(key_receive==0)
                   ScibRegs.SCIFFTX.bit.TXFFIENA=1;
           }*/
        {if((CpuTimer0.RegsAddr)->TCR.bit.TIF==1)
         {
                (CpuTimer0.RegsAddr)->TCR.bit.TRB=1;
                (CpuTimer0.RegsAddr)->TCR.bit.TSS=1;
                modbusmodule.RxTimes=0;
        }
        }
        }
}


/**********************************接收中断****************************************/
interrupt void rxbint_isr(void)
{




                  /* ScibRegs.SCICTL1.bit.SWRESET=0;
                   DELAY_US(2);
                   ScibRegs.SCICTL1.bit.SWRESET=1;*/
           Uint16 data;
           data=0;
    //PieCtrlRegs.PIEACK.bit.ACK9=1;
    //while(ScibRegs.SCIRXST.bit.RXRDY!=1){}
      data = ScibRegs.SCIRXBUF.all & 0xFF;
      count++;
      if(modbusmodule.RxTimes==0)
      {
              modbusmodule.RBuf[0]=data;
              modbusmodule.RxTimes=1;
              (CpuTimer0.RegsAddr)->TCR.bit.TRB=1;
              (CpuTimer0.RegsAddr)->TCR.bit.TSS=0;
      }
      else
      {
             (CpuTimer0.RegsAddr)->TCR.bit.TSS=1;
             modbusmodule.RBuf[modbusmodule.RxTimes] = data;
             modbusmodule.RxTimes++;
             (CpuTimer0.RegsAddr)->TCR.bit.TRB=1;
             (CpuTimer0.RegsAddr)->TCR.bit.TSS=0;
      }
      ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;
      ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
      PieCtrlRegs.PIEACK.all |=0x100;
}


/*******************赋初值函数********************************/
void configureModbus(void)
     {   Uint16 i;
             {
             for(i=0;i<10;i++)
                     modbusmodule.TBuf=0;
             }
             for(i=0;i<22;i++)
             {
                     modbusmodule.RBuf=0;
             }


                  count=0;
                  rv=0;
             modbusmodule.RxTimes=0;
         modbusmodule.TBuf[0]=0x01;
         modbusmodule.TBuf[1]=0x04;
         modbusmodule.TBuf[2]=0x00;
         modbusmodule.TBuf[3]=0x03;
         modbusmodule.TBuf[4]=0x00;
         modbusmodule.TBuf[5]=0x04;
         modbusmodule.TBuf[6]=0x01;
         modbusmodule.TBuf[7]=0xC9;
         //ScibRegs.SCIFFTX.bit.TXFFIENA=1;(下面两个截图是针对这一句)




     }


/********************************发送中断*******************************************/


interrupt void scibTxFifoIsr(void)
        {
           Uint16 i;
           //Transmit_EN;
       //DELAY_US(5);


            for(i=0; i< 8; i++)
            {
                    ScibRegs.SCITXBUF=modbusmodule.TBuf;
                    rv++;// Send data
                }
                     ///Receive_EN;
                         //DELAY_US(5);
           ScibRegs.SCIFFTX.bit.TXFFIENA=0;
           //SciaRegs.SCIFFRX.bit.RXFFIENA=1;
                ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;        // Clear SCI Interrupt flag
                //ScibRegs.SCIFFTX.bit.TXFFIENA=0;
                PieCtrlRegs.PIEACK.all |=0x100;     // Issue PIE ACK
             //ScibRegs.SCIFFRX.bit.RXFFIENA=1;


        }


程序完了我编译通过,然后进行调试,结果发现,按道理应该进入13次接受中断,结果进入了16次,而且没有一个数据是正确的(参照上面于pc机通信那张图)。如图:


,然后我又把发送中断屏蔽了,不让他发送命令结果,莫名其妙进入了8次接受中断。而且接受到的数据,就是我要发送的命令。如图,求大神解答,用的是dsp28335,我在贴一下我程序的图片
 
 

 

我用28335编写modbus成功和电脑通信实现03和16功能,该模块和电脑也成功通信,但是就是28335和这个模块通信的时候就没有成功,希望来位高人为我解答一下。




关键词: dsp-F28335 modbus-rtu     

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]