McAsp接口的发送使能了对应DMA,且配置了两个等长度缓存作为源地址(双缓存),在DMA配置中两个PaRAM相互Link来实现双缓存循环发送。
由于需求上要定时对DMA进行重启,设定了两个方案:
一. 关闭mcbsp -> 关闭DMA -> 配置dma源地址重新link -> 开启DMA -> 开启mcbsp
实现后发现一个问题,在最后一步开启mcbsp的瞬间,会发出一段1us左右的不可控的低电平,对接收器件有一定的影响,是否是138硬件接口本身的问题?有避免方法吗,望解答。
二. 关闭DMA -> 配置dma源地址重新link -> 开启DMA
第二个方案想通过不处理mcbsp避免第一个方案中出现的问题。 但发现运行一段时间后mcbsp接口发送固定数据,说明DMA没有工作。 以下附上相关代码操作:
关闭DMA:
1.set EECR
2.set ECR
3.set SECR
4.set EMCR
开启DMA:
1.set EESR
是否是我的实现方法或寄存器配置存在问题,望解答,谢谢大大们
Tony Tang:
McBSP做主还是做从?即帧同步和时间由外部给还是内部产生?
频率多高?你指的关闭McBSP如何操作的?操作McBSP还是PSC?
这里更多的问题应该是在关闭McBSP,McBSP是一个连续工作的接口,你在什么时间去关McBSP是一个问题,比如你在一个中断以为当前发送完成了去关它,其实它的发送事件已发给EDMA了,而EDMA可能正在传输当中,你又把EDMA关掉了。所以这里需要好好理一理。
tthe:
回复 Tony Tang:
谢谢,是我描述的不够详细。 补充一下, McBSP作为从设备,12MHz的CLK 与 240KHz的FS 由逻辑提供,且在McBSP重启过程中也不会间断。
关闭与开启McBSP的操作均由寄存器SPCR的XRST位来实现, 另外在我遇到的问题中,影响比较大的是开启mcbsp的瞬间产生的不可控的低电平,而关闭操作导致的数据不完整或异常对我的影响不大,再次感谢。
关于我原贴中的第二个方案遇到的dma工作异常的问题已解决,问题原因是对dma寄存器操作顺序不对,参考了论坛里置顶帖的代码后已修复。