这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» FPGA» 关于用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 跳转至

回复

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