打印

C6713环境下 mcasp口配置

[复制链接]
2131|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
zhangmangui| | 2013-7-22 19:37 | 只看该作者
本帖最后由 zhangmangui 于 2013-7-22 19:38 编辑

McASP由发送和接收两部分组成,两部分即可以同步工作也可以分开独立工作,使用不同的时钟源,同步帧和传输模式,可以支持发送和接收的速率不相同。

       McASP的三种传输模式:突发传输模式,TDM和DIT
       McASP的时钟发生器的时钟源可以源自:

·内部     将内部时钟源通过两个分频器产生时钟;

·外部     直接由ACLKX/R引脚输入;

·混合     一个外部高频时钟输入到McASP的AHCLKX/R一脚,然后被分频器进行分频。



       串行器用来负责将串行数据移入或者移出McASP。

       所有的发送器使用的是同一个数据化格式单元,所以同一时间McASP只能支持一种发送格式。同样,McASP的接收部分,也是一次只支持一种接收格式,并且这种格式对所有接收串行器都适用。然而同一时间,McASP的接收和发送格式可以不相同。

即使McASP引脚被用作串行通道功能(非GPIO),也必须正确设置McASP GPIO寄存器PFUNC和PDIR,确定其功能和方向。不管管脚的功能是什么,PDIN寄存器通常反映了引脚的状态。

       一旦一个时钟引脚被配置为输出,时钟引脚就开始以时钟控制寄存器所定义的频率输出时钟信号,因此必须确保在将引脚设置为输出前对时钟控制寄存器进行正确的配置,这一要求对帧同步信号引脚也同样适用。



       在对GBLCTL进行配置的时候需要进行回读操作,以保证操作的成功。因为发送器和接收器分别以各自的时钟运行,它们一般比DSP芯片内部的总线时钟慢几十到几百倍,因此在DSP向GBLCTL写数据,到McASP真正识别到这一写操作之间需要好多个时钟周期。ACLKX/R输入的时钟信号决定的是McASP数据发送的速率,并不是McASP工作时的时钟频率。



       TDM模式中所有的数据为AXR[n]都是与时钟同步,同时数据传输是连续的,数据单元之间没有延迟,单元N的最后一位后面紧跟着下一单元的第一位。同时帧同步信号可能会相对于第一个单元的第一位有0,1或者2个周期的延迟。



       一般通过DMA端口来访问McASP的XRBUF寄存器,通过DMA端口,DMA/CPU可以仅仅通过一个地址来对所有的串行器服务,也就是CPU/DMA可以通过DMA端口按照升序的顺序循环地对每个被使能的接收/发送通道进行写/读取操作。如有4个通道(1,3,5,6)被使能为接收通道,则读取的时候需要进行4次读取操作,得到的数据分别为通道1,3,5,6的数据。与DMA端口访问不同,通过外围配置总线访问访问XRBUF时,CPU/DMA必须提供每次访问的准确XBUFn或者RBUFn地址。推荐使用DMA端口对McASP进行访问。



       当数据从XBUF移入XRSR时,XDATA被置位,表示可以再次向XBUF写数据,当DSP向所有被配置为发送的串行器写入数据或者向XDATA写入1时,该标志为被清除。当XDATA被置位时,有一个DMA事件和中断会产生。RDATA位与此相似。



       对于McASP来说,DMA事件的产生和CPU中断产生之间是有区别的,DMA事件是在数据准备就绪后自动产生的,不需要对寄存器进行设置,而CPU中断的产生需要将XINTCTL/RINTCTL寄存器中的中断使能。



       编程的时候可以通过增加活跃的时隙数来提高数据的传输速度,不过该方法只是适用于TDM模式,不适于突发模式,在TDM模式下一个帧同步信号会触发多个时隙,而在突发模式下,一个帧同步信号只会触发一个时隙的传输。在更改时隙数的时候既要改X/RTDM(Transmit/Receive TDM Time Slot Register)中激活的时隙,也要改AFSRCTL/AFSXCTL(Receive/Transmit Frame Sync ControlRegister)中的TDM模式的时隙数X/RMOD。



       当发送器发生欠载的时候,XUNDRN标志就会被置位,一旦被置位,XUNDRN会一直保持这一置位状态,直到DSP向XUNDRN写入一个1来清除XUNDRN位。相应的,接收器发生超载的时候,对ROVRN标志位的操作也是一样的。



       数字回环模式(DLB),即发送串行器的输出端连接到了接收串行器的输入端,可以利用此模式来检测McASP的设置是否正确。数字回送模式仅用于TDM模式,不适用于DIT和突发模式。在数字回环模式下发发送器和接收器共用发送器的发送时钟和帧同步信号。



       McASP有两种复位模式,即软件复位和硬件复位,当进行软件复位的时候必须有有效的时钟提供给McASP,而硬件复位可以通过PSC模块实现。



       当CPU向XBUF中写入数据时,则会使得XSTAT寄存器中的XDATA位置位,同时产生一个帧同步信号,将写入的数据发送出去,接收端在接收到帧同步信号时开始接收数据。



McASP触发EDMA的过程:

        当对McASP初始化的过程中,将McASP中相应的串行器带出复位状态后(GBLCTL寄存器中的XSRCLR位从0变到1),会使得传输状态寄存器XSTAT中的XDATA位从0变为1,即表示发送串行器的XBUF中内容为空,需要写入数据,该变化会触发一个EDMA事件(也可以触发中断事件,如果中断使能的话),使得EDMA对XBUF进行写操作,并且每次XBUF的数据被移入XRSR后XDATA都会置位,触发EDMA数据传输,直到EDMA中的计数器达到0。



       若用EDMA来服务与McASP,则每次McASP发送完数据或者接收完数据后便会产生一个EDMA事件,告诉EDMA将数据移入或者移出McASP。当发送McASP所对应的EDMA通道对应的源地址的数据发送完后,则EDMA对于McASP数据发送完后产生的EDMA事件不反映,从而使得McASP进入停止状态。

       程序调试过程中,不能通过McASP的XBUF或者RBUF寄存器来查看数据是否发送或者接收,只能将数据移出该寄存器后再查看,不然直接查看XBUF或者RBUF时,看到的数据都将是0。

来自网上分享   还望你能慢慢琢磨

使用特权

评论回复
板凳
Panzer1221|  楼主 | 2013-8-5 10:57 | 只看该作者
zhangmangui 发表于 2013-7-22 19:37
McASP由发送和接收两部分组成,两部分即可以同步工作也可以分开独立工作,使用不同的时钟源,同步帧和传输 ...

这个在网上也已经看过 都是介绍方面的内容 实际编写没有一个引导向的参考。
现在采用的是直接写寄存器的方式 按照Userguide上注明的地址对寄存器定位。 然后依照Userguide上的步骤进行赋值但是依旧会出现问题。 不知道有没也是用这种思路解决的呢。。

使用特权

评论回复
地板
Panzer1221|  楼主 | 2013-8-8 11:09 | 只看该作者
顶一下  有没有哪位大神做过mcasp直接对寄存器写入 作初始化配置的大神呢

使用特权

评论回复
5
Panzer1221|  楼主 | 2013-9-5 15:51 | 只看该作者
有没有大神配过呀。。 直接对寄存器的地址写入值来进行初始化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

14

帖子

0

粉丝