完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
您好,我只有一个问题,在Tx模式下用SPI运行DMA。我选择一个没有乒乓球的投篮模式,我用一个按钮测试我的代码。我尝试发送帧6字节时,我推它。不幸的是,我的代码不工作。当我按下按钮时,第一个字节被发出,然后在第二个按下,它是我表的第二个字节被发出,然后第三个字节被发出……你能帮我吗?我的SPI驱动程序和配置:和主要:谢谢你提前
|
|
相关推荐
7个回答
|
|
想到三件事:1)一般需要SPI的2个DMA通道(一个用于Tx,一个用于RX)。您可能只需要一个通道,但是SPI外围设备必须处于主模式,并且您需要忽略所有Rx溢出和将要发生的其他错误。我通常设置一个第二DMA通道,它简单地将接收到的值转储到一个字节中。2)不要处理SPI中断——DMA通道需要自己处理它。这意味着不要设置IE位,也不要为它编写ISR 3)看起来您依赖于被清除的FORCE位来显示DMA传输的结束。然而,一旦它触发了第一个SPI交换,它将被硬件清除。最好使用DMA ISR来设置一个标志位或您自己的标志位,并测试该起始位,或在CHEN位上旋转,当传输完成时该位将清除。另外:4)直接查看连接到按钮或开关的端口引脚,而不使用某些M的反跳系统。使用硬件或软件,但你确实应该处理将要发生的接触弹跳。5)除非你真的需要(即,这是一个更大的代码库的一部分)你应该避免EDS空间。根据我的经验,很少需要它(除非,如我所说,您正在运行非常位数据阵列——甚至随后将DMA缓冲区放入正常内存空间),并且编译器并不总是非常擅长为它生成代码。DMA通道上的大小位也为0,表示地址的16位增量。我知道您已经将“Spi1TxBuffA”定义为“int”,但是这有点不一致,稍后在调试时会混淆任何人(包括您)。至少提出评论来表明这是有意的。苏珊
|
|
|
|
|
|
|
|
|
|
非常感谢你的回答,为什么不呢?但是我只是试着跟随我删除的数据表!是的,我试过了,我也尝试过这种语法对齐的int Spi1TxBuffA[16]u.((space(dma),aligned(16),eds));或者无符号int TxBufferA[16]u.((space(x.));(Datasheet syntax)Indeed,我现在在16位模式下工作也是个错误。我有16位的单词(这是正常的:)。奇怪的是,如果我按DMACOUNT值的按钮次数,就会检测到DMA TX中断。事实上,我的印象是SPI IRQ没有发出,而且我看到一个接一个的单词。
|
|
|
|
关于通用答案,我已经说过了很多。您需要告诉我们您使用的确切处理器。关于我的第5点,我们需要看看您使用的是什么设备,因为有些设备具有专用DMA内存,而另一些则不具备。但我认为没有任何具有专用DMA内存的设备在EDS空间中具有该内存。您解决了我的第3点和第4点吗?它们实际上需要被扩展,以说明您应该检测按钮,启动DMA传输,然后忽略所有内容,直到传输完成并释放按钮。
|
|
|
|
适用于SPI和DMA1。有些允许在没有TX2的情况下进行RX。您必须RX或错误将停止DMA3。对于同一个DMA缓冲区,您可以使用TX和RX(这是基于PIC24HJ的)。
|
|
|
|
只有小组成员才能发言,加入小组>>
5162 浏览 9 评论
2000 浏览 8 评论
1928 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3172 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2226 浏览 5 评论
731浏览 1评论
613浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
503浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
629浏览 0评论
527浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-23 11:59 , Processed in 1.351849 second(s), Total 89, Slave 72 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号