完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
|
我先贴程序,我想读取某个模块中寄存器的值,那个模块支持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机通信那张图)。如图:
|
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
TMS320C6748 板卡设计中是否一定需要有SDRAM或者DDR
1958 浏览 0 评论
988 浏览 0 评论
3654 浏览 1 评论
【六岳微LY-F335开发板试用体验】epwm启动ADC并在OLED上显示结果
4493 浏览 0 评论
【六岳微LY-F335开发板试用体验】软件开发环境及调试下载
4541 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 09:05 , Processed in 0.821532 second(s), Total 73, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
721