完善资料让更多小伙伴认识你,还能领取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机通信那张图)。如图: |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
嵌入式操作教程_数字信号处理_音频编解码:3-6 AAC音频解码实验
423 浏览 0 评论
数字信号处理实验操作教程:3-3 mp3音频编码实验(AD7606采集)
1299 浏览 0 评论
嵌入式DSP教学实验箱操作教程:2-20 数模转换实验(模拟SPI总线输出电压值)
1252 浏览 0 评论
目前在2837x系列用的最多的、性能最好、性价比最高的是哪一款?
1016 浏览 0 评论
国产嵌入式DSP教学实验箱_操作教程:22-AD采集DA输出实验(采集输出正弦波)
2207 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-4-20 12:24 , Processed in 0.460898 second(s), Total 61, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号