完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
大家好,我使用的DSP是TMS320F28027。现在我需要做PC和DSP的双向通讯,利用PC来监控。数据格式:1位起始位,8位数据位,一位停止位,无校验位和校验位。双向通讯时:DSP每隔5分钟,发送一次数据至PC;而只有当需要改变DSP工作状态时,PC才需要发送数据给DSP,由于PC每次发送数据为4帧,所以使用了28027的FIFO功能,原本打算28027一次FIFO中断可以接收4帧数据,但此功能在程序中没有实现,只能每次中断接收这4帧数据中的第一帧数据。如下是SCI FIFO配置和接收程序:
void InitSci(void) [ // Initialize SCI-A: SciaRegs.SCICCR.all =0x0007; // 1bit 停止位 无循环模式 // 无极性, 字符长度:8 bits, // 异步模式, 空闲线协议 SciaRegs.SCICTL1.all =0x0003; // 使能 TX, RX, 内部 SCICLK, // 禁止 RX ERR, SLEEP, TXWAKE SciaRegs.SCIHBAUD = 0x00; // Baud=15MHz/((0x00C2+1)*8) SciaRegs.SCILBAUD = 0xC2; SciaRegs.SCICTL2.bit.TXINTENA = 1; // 使能SCI发送中断 SciaRegs.SCICTL2.bit.RXBKINTENA = 1; // 使能SCI接收中断 SciaRegs.SCIFFTX.all = 0xE060; // bit 15 = 1 : 退出复位 // bit 14 = 1 : 使能FIFO增强模式 // bit 13 = 1 : 使能 TX FIFO操作 // bit 6 = 1 : CLR TXFFINT-标志 // bit 5 = 1 : 使能TX FIFO匹配 // bit 4-0 : 如果TX FIFO等于0,产生TX-ISR中断 SciaRegs.SCIFFRX.all = 0xE064; // Rx 中断级设置为4 SciaRegs.SCICTL1.all =0x0023; // 使SCI退出复位 ] void InitSciGpio() [ InitSciaGpio(); ] void InitSciaGpio() [ EALLOW; GpioCtrlRegs.GPAPUD.bit.GPIO19 = 0; // Enable pull-up for GPIO19 (SCIRXDA) GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1; // Disable pull-up for GPIO12 (SCITXDA) GpioCtrlRegs.GPAQSEL2.bit.GPIO19 = 3; // Asynch input GPIO19 (SCIRXDA) GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 2; // Configure GPIO19 for SCIRXDA operation GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2; // Configure GPIO12 for SCITXDA operation EDIS; ] interrupt void sciaRxFifoIsr(void) [ static int l=0; Uint16 k=0; static int rdd[4]; /*********************************************************************************************************************/ EINT; // Enable Global interrupt INTM EALLOW; SciaRegs.SCIFFRX.bit.RXFIFORESET = 0; SciaRegs.SCIFFRX.bit.RXFIFORESET = 1; SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1; // clear receive FIFO interrupt flag PieCtrlRegs.PIEACK.bit.ACK9 |= PIEACK_GROUP9; // Issue PIE ack EDIS; /*********************************************************************************************************************/ /*** Receive Data ***/ /*********************************************************************************************************************/ for(l=0;l<4;l++) [ rdataA[l] = SciaRegs.SCIRXBUF.bit.RXDT; ] if(l==4) // recieve 4 Remote control data [ l = 0; Recive_OK_Flag = 1; ] else [ l = 0; Recive_OK_Flag = 0; ] rdd[0] = rdataA[0]; // For testing rdd[1] = rdataA[1]; rdd[2] = rdataA[2]; rdd[3] = rdataA[3]; k++; ] 此程序功能没有实现,比如PC发出了"01 02 03 04”,而DSP却只接收了第一帧数据,即"01"。原本是希望FIFO接收中断一次就可以将这4帧数据全部接收,所以请大家帮忙看看,是哪里设置错误。谢谢! |
|
相关推荐
4 个讨论
|
|
您好!
首先PC每次发送数据为4帧,正常情况下,每收到一帧然后进入中断,您可以这样实现。 个人感觉 SciaRegs.SCIFFRX.all这个寄存器的配置有问题,建议您对照着例程进行修改。无非就是设置一下FIFO深度为4然后触发中断。 另外,在中断前面部分加入断点,看一下接收Buf中4个数据是不是都进来了。 确认一下是不是在以下程序段中出问题。 for(l=0;l<4;l++) [ rdataA[l] = SciaRegs.SCIRXBUF.bit.RXDT; ] 提醒您的是,您需要一定的机制去判断4帧数据的次序,比如1、2、3、4,如果处理不好,会出现2、3、4、1。 Young Hu |
|
|
|
|
|
只有小组成员才能发言,加入小组>>
336 浏览 1 评论
529 浏览 2 评论
NA555DR VCC最低电压需要在5V供电,为什么用3.3V供电搭了个单稳态触发器也使用正常?
774 浏览 3 评论
MSP430F249TPMR出现高温存储后失效了的情况,怎么解决?
651 浏览 1 评论
对于多级放大电路板,在PCB布局中,电源摆放的位置应该注意什么?
1130 浏览 1 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
58浏览 29评论
143浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
252浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
201浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
57浏览 13评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 11:33 , Processed in 0.852578 second(s), Total 49, Slave 42 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号