完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我用SPI(在dsPIC33EP512MU810上)有问题,因为某种原因,我不断地得到SPI溢出,但我不能解释为什么。奇怪的是,SPI第一次工作得很好,但后来就掉下来了。我用SPI从外部EEPROM(25LC1024)读取数据(8位单声道)d然后使用为I2S配置的DCI模块将其发送到编解码器(TLV320AIC32)。这4个字节是:EEPROM读取命令(0x03)1地址字节2地址字节3地址字节从那时起,我使用DMA从EEPROM读取剩余数据,一旦读取了所有数据,就禁用该数据。当这个函数第一次被调用时,它全部工作,数据从EEPROM中读出,然后由编解码器播放:)但是,当该函数在初始调用之后被调用时,它就失败了(此时它在1秒任务中被调用,EEPROM音频数据最多只持续0.5秒。)它掉落的原因是因为在发送第一个地址字节之后出现SPI溢出。请参考下面的链接了解范围跟踪(从“h t p s”中移除空间)……h t p s://dl.dropboxusercontent.com/u/383887/SPI.pdf当SPI2中断时有一个切换引脚输入(LATD1)相关帖子:www.micro..com/for./m931870.aspxSPI2模块配置:SPI2 DMA配置:SPI2中断:DMA3 Rx SPI2中断:DCI2SDMA配置:DMA2 Rx I2S中断:FunctionsEEPROM音频剪辑信息DMA缓冲区内容解释:
|
|
相关推荐
19个回答
|
|
|
在安装4个字节(通过写入SPI2BUF)时,您确切地设置DMA并启用SPI RX中断吗?
|
|
|
|
|
|
在进入WHER()循环之前,在DIMAN()设置中配置DMA。在函数调用EEPROMReadByte中启用SPI2中断,这是在1秒的任务中。见下文:
|
|
|
|
|
|
啊哈,与预期不同,但是仍然……似乎您没有意识到,在主模式下,每次TX传输完成一个RX也完成一个RX。(虽然您可以在范围中看到所有这些MISO-“主IN...”活动。)即使您不需要这些字节,也必须清空RX寄存器防止“溢出”。SPI不仅在数据和时钟方面是同步的,它还是同步的,因为每次发送数据时,也会收到“一些东西”。
|
|
|
|
|
|
是的,我知道SPI RX和RX一起完成。这就是为什么在SPI2中断中,将SPI2BUF读入一个临时未使用的变量。TX DMA(0)和RX DMA(1)同时启用,并且缓冲器大小相同。所以不应该有一个SPI缓冲区溢出的情况,这就是我困惑的原因。它第一次运行,但第二次下降。
|
|
|
|
|
|
噢,遗漏了部分。然后,当它在第二个序列期间失败时:可能是第一个序列接收的最后一个字节仍然在缓冲区中(没有读取,但是默认情况下IF被清除)然后启动下一个序列,这将导致收到的oone更多的字节,直到ISR插入……
|
|
|
|
|
|
感谢DU000 00 01,我怎么知道第一个序列接收到的最后一个字节仍然在缓冲区中?有4个SPI2中断:第一个中断发生在EEPROM读取命令(0x03)被发送之后,第二个中断发生在EEPROM第一个地址字节被发送之后,第二个地址字节被发送中断发生在EEPROM第二个地址字节被发送之后(并且最后一个)中断发生在EEPROM3a之后。此时已经发送了ddress字节,SPI2中断被禁用,DMA SPI2 Rx和Tx通道和中断被启用。在每个SPI2中断中,SPI2BUF被读入“temp”变量,因此“应该”SPI2BUF中没有留下数据。来自EEPROM的YTES。SPI DMA缓冲器(A和B)的数组的大小是每个4字节(即,SPI2RxBuffA[4]、SPI2RxBuffB[4]),DMA被配置为乒乓球,一次击球。因此,DMA3 SPI2 Rx中断在每次接收到4个字节的数据时发生,在缓冲区A和缓冲区B之间交替进行。DMA1 SPI2 Tx与Rx缓冲区(A和B)的大小相同,并且只包含零。在DMA3 SPI2 Rx中断期间,字节数被计数如下……然后检查计数,看看是否已经满足(或超过)总字节数……字节数可以在ping'A'DMA中断期间或pong'B'DMA中断期间达到。在这种情况下,在ping pong'B'DMA中断期间将达到17338个字节。DMA2 I2S Rx中断。pt处于乒乓连续模式,并且在“B”DMA中断期间,如果未从EEPROM读取17338字节,则它请求下一块SPI2数据。读命令和3地址字节不需要重新传输,它只是从它停止的地方继续。
|
|
|
|
|
|
你好,关于你的问题(“我怎么说…”):因为“整个事情”比稍微复杂一些,所以试一下:当禁用DMA时,再对SPI RX缓冲区进行伪读。最好两个。读一些已经读过的东西并没有什么坏处。关于“稍微复杂”:DMA TX将导致至少1个字节被填充到TX缓冲区中。如果TX是双缓冲的,那么它可能导致2个字节。-而且这里可能就是重点!它很可能是双缓冲的-意味着TX中断1可能在第一字节被发送之前发生-因此在第一RX字节被接收之前。在这种情况下,第一个伪读没有任何效果,而且在RX“链”中比预期的多了一个字节。似乎在整个“DMA故事”中都保留了这种滞后。导致第二次运行中出现问题。
|
|
|
|
|
|
感谢du00000001,在禁用DMA时,我添加了两个SPI2BUF的虚拟读取(你的意思是当我禁用DMA信道或中断btw时?)不幸的是,这并没有造成任何不同。这是代码中禁用DMA通道和中断的部分,我在其中添加了SPI2BUF读取到一个临时变量。我编写EEPROM读取命令,然后将3个地址字节写入SPI2BUF(而不是使用DMA)的原因是保留tDMA Rx缓存流数据,而不必每次我请求新数据时都编写EEPROM读取命令和地址字节。如果整个操作使用DMA,并且将EEPROM读命令(0x03)和3个地址字节存储在DMA SPI2 Tx缓冲区中,那么DMA SPI2 Rx缓冲区将读回EEPROM命令和地址字节。DMA SPI2 RX中断需要考虑到这一点并忽略该数据。目前,DMA-RX缓冲器是一个4字节的数组,但是它可以变成更大的数组,所以这不会太难。但是,如果阵列大于4字节,那么在DMA RX缓冲器A中的前4个字节将包含EEPROM读命令和地址字节,然后接着跟随音频数据。这需要用额外的代码来考虑,所以我相信我还是坚持使用现有的方法编写SPI2BUF,然后启用DMA。也许有更好的方法可以做到这一点,但是因为这是我第一次编写代码来做这样的事情,我不知道还有什么更好的!
|
|
|
|
|
|
嗨,我好像想得不够清楚……把这两个虚读移到写EEPROM读命令的地方(最好:直接之前)。这应该清空任何挂起的字节,并允许重复读操作。
|
|
|
|
|
|
感谢du00000001,在编写EEPROM读命令之前,我设置了虚拟读数,如下所示……为了确保,我还将其放入SPI2中断……看起来稍微好了一点,但仍然存在问题。我设置了函数调用来启动从EEPROM(然后通过I2S播放)读取的音频。在1秒的任务中。有时播放声音剪辑,有时不播放。在从EEPROM开始读音频的随机数次调用之后,它完全崩溃了。
|
|
|
|
|
|
|
|
|
慢进度……如果你放慢回放的速度,会发生什么?比如说每5秒慢一次。或者读一次,回放5次,然后读下一遍。我查看了你的累计线程:你确定问题是SPI读取,而不是DAC回放?
|
|
|
|
|
|
“SPI森”是什么信号?我想看看MOSI信号:
|
|
|
|
|
|
SPI SEN只是使用_LATG9端口进行位碰撞。我将对MOSI信号进行范围跟踪,并用SPI2中断切换引脚(_LATD1)替换它。由于它只发送EEPROM读取命令(0x03),后面跟着3个地址字节,所以在MSI信号上看不到太多内容。起始地址是0x00,DMA SPI2 TX缓冲器也都是零。
|
|
|
|
|
|
|
|
|
我试着把速度减慢到5秒,而不是1秒,但是还是会掉下来。问题在于SPI(不是I2S),如范围跟踪所示。可以看到,SCK、MISO和SEN行不是每隔1秒钟(有些是错过的,每隔2秒钟)并且当它落到SCK上时,它们将永久保持打开。
|
|
|
|
|
|
难道DMA在整个事情崩溃的时候不会停止吗?继续的SPI时钟似乎表明。我猜你只填写了EEPROM的一部分(或相当小)als从某点只有FF收到。
|
|
|
|
|
|
没错,我只是用17338字节的地址从0x00的音频数据编程EEPROM。EEPROM的其余部分(1024兆位)为0xFF。你说的没错,当它掉下来的时候,DMA并没有被禁用。假设这是我应该开始查看的地方,但是仍然存在有时EEPROM不被读取并跳过请求的问题。
|
|
|
|
|
|
第一件事第一件事!-我们知道(相当)DMA有问题。这可能会干扰TX启动-有时会阻止它。所以,当您解决了DMA的谜团时,请再次测试。也许第二个问题没有了。如果结果是相反的(TX导致DMA问题),那么在搜索DMA问题时,您很可能会发现:)
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475 浏览 0 评论
5794 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1125浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1098浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 14:49 , Processed in 1.224359 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
7265