|
3.1 配置和初始化 3.1.1 McASP 输出/输入 部分初始化: 1)设置GBLCTL为0,重置McASP到默认值 2)按照以下顺序配置McASP寄存器,除了GBLCTL寄存器。 a)PWRDEMU:掉电及仿真管理 b)输入寄存器:RMASK、RFMT、AFSRCTL、ACLKRCTL、AHCLKRCTL、RTDM、RINTCTL、RCLKCHK。如果使用外部时钟AHCLKR和(或者)ACLKR寄存器,他们必须已经运行,以保证GBLCTL寄存器的正常同步。 c)输出寄存器:XMASK、XFMT、AFSXCTL、ACLKXCTL、AHCLKXCTL、XTDM、XINTCTL、XCLKCHK。如果使用外部时钟AHCLKX和(或者)ACLKX,他们必须已经运行,以保证GBLCTL寄存器的正常同步。 d)串行寄存器:SRCTL【n】。 e)全局寄存器:PFUNC、PDIR、DITCTL、DLBCTL、AMUTE。注意PDIR寄存器只能在上面步骤中完成时钟和帧的配置后,才能进行编程控制。这是因为此刻一个时钟管脚被配置为PDIR的一个输出,同时这个时钟管脚开始固定于一定的速率,这个速率由相应的时钟控制寄存器定义。这样的话,必须确保在时钟管脚被配置为输出之前,正确配置这个时钟控制寄存器。同样,对于帧同步管脚也是这样。 f)DIT寄存器:对于DIT模式操作,配置DITCSRA【n】、DITCSTB【n】、DITUDRA【n】,和DITUDRB【n】。
3)启动相关的高频串行时钟寄存器AHCLKX和(或者)AHCLKR。如果使用外部高频串行时钟并且他们在运行,可以跳过此步。 a)将相关内部高频串行时钟分割器(可能有多个)从复位(reset)寄存器中移出,方法是设置GBLCTL寄存器中的位RHCLKRST(对应输入)和(或者)位XHCLKRST(对应输出)。GBLCTL寄存器中的其他位保持为0。 b)读回GBLCTL寄存器数值,确保在操作之前所写入的GBLCTL寄存器位成功闭锁。 4)启动相关的串行时钟ACLKX和(或者)ACLKR。如果使用外部串行时钟并且他们已经运行,可以跳过该步。 a)将相关的内部串行时钟分割器移出复位(reset)寄存器,方法是设置GBLCTL寄存器的位RCLKRST(对应输入)和(或者)位XCLKRST(对应输出)。GBLCTL寄存器中所有其他位保持为0。 b)读回GBLCTL寄存器数值,确保在操作之前所写入的GBLCTL寄存器位成功闭锁。 5)按照要求,配置数据获得: a)如果使用EDMA,按照要求配置数据获得,同时在McASP走出复位(reset)状态前,在此步中启动EDMA。 b)如果使用CPU中断,按照要求使能输出和(或者)输入中断。 c)如果使用CPU查询(polling),此步不用额外操作。 6)激活串行。 a)在启动之前,清楚相关的输出和输入状态寄存器,方法是写入0xFFFFh到XSTAT和RSTAT寄存器。 b)将相关的串行移出复位(reset),方法是设置BGLCTL寄存器的位RSRCLR(对应输入)和(或者)位XSRCLR(对应输出)。GBLCTL寄存器所有其他位保持原来数值不变。 c)读回GBLCTL寄存器数值,确保在操作之前所写入的GBLCTL寄存器位成功闭锁。 7)检验所有输出缓冲可用。如果不使用输出,可以跳过此步。同时,如果选择时间插槽0位不激活状态(特殊情况,参见图3-2,第二个波形),可以跳过此步。一旦输出串行被移出复位(reset),XSTAT寄存器中的XDATA位将被设置,表明XBUFF为空、就绪可用。XDATA状态产生EDMA事件AXEVT,并且如果它在XINTCTL中被使能的话,将产生AXINT中断。 a)如果使用EDMA,一旦接收到AXEVT事件,EDMA自动响应McASP。在此步操作之前,应该检验XSTAT寄存器的XDATA位是否清零,这表明EDMA已经可以响应所有输出缓冲。 b)如果使用CPU中断,一旦接收到AXINT中断,将进入中断服务例程。该中断服务例程应该响应XBUF寄存器。在此步操作之前,应该检验XSTAT寄存器的XDATA位是否清零,这表明CPU已经可以响应所有输出缓冲。 c)如果使用CPU查询(polling),在此步中应当写入XBUF寄存器。 8)从复位(reset)中释放状态机。 a)将相关的状态机(可能是多个)移出复位(reset),方法是设置GBLCTL寄存器的位RSMRST(对应输入)和(或者)位XSMRST(对应输入)。GBLCLK寄存器所有其他位保持该步之前数值。 b)读回GBLCTL寄存器数值,确保在操作之前所写入的GBLCTL寄存器位成功闭锁。 9)从复位(reset)中释放多个帧同步发生器(frame sync generators)。注意,即便使用一个外部帧同步,也必须释放这个内部帧同步发生器。因为帧同步错误探测逻辑创建在这个帧同步发生器内部。 a)将相关的帧同步发生器(可能有多个)移出复位(reset),方法是设置GBLCTL寄存器的位RFRST(对应输入)和(或者)位XFRST(对应输出)。GBLCTL寄存器的所有其他位保持该步之前数值。 b)读回GBLCTL寄存器数值,确保在操作之前所写入的GBLCTL寄存器位成功闭锁。 10)一旦接受到第一个帧同步信号,McASP开始传输。McASP和帧同步管脚的信号边沿保持同步,而不是帧同步管脚的水平沿。这一点便于将状态机和帧同步发生器移出复位(reset)。 a)举例来说,如果配置McASP为上升沿输出帧同步,那么在从复位(reset)中释放McASP输出状态机和多个帧同步发生器之前,不必等待来自帧同步管脚的低水平沿。 3.1.2 分离输出和输入初始化 在许多情况下,需要分别初始化McASP的输出和输入部分。例如,可能需要延迟输出部分初始化,直到识别出进入输入部分的数据类型。或者输入部分得到的数据流发生改变,这需要对输出部分重新初始化。 这种情况下,仍可以参照章节3.1.1描述的流程,但是要对输出、输入部分分别进行。为GBLCTL寄存器建立别名RGBLCTL和XGBLCTL,以便于对输出、输入部分分别初始化。 同样,确保初始化或者重新初始化顺序按照表A-1的指示。 3.1.3 读回GBLCTL寄存器数值的重要性。 在章节3.1.1中,步骤3b、4b、6b、8b和9b申明应当读回GBLCTL寄存器数值,直到写入的寄存器位成功闭锁。这很重要,因为输出和输入状态机要比相关的位时钟跑得快,这些位时钟通常要比DSP的内部总线时钟慢数十到数百倍。这样的话,DSP写入GBLCTL(或者RGBLCTL和XGBLCTL)的时候和McASP实际识别到写操作的时候,两者之间会消耗许多DSP时钟周期循环。如果跳过该步,那么McASP可能永远看不到全局控制寄存器的复位(reset)位获得警报和解除警报;导致产生没有初始化的McASP。 这样的话,McASP中的执行逻辑如下:一旦DSP写入GBLCTL、RGBLCTL,或者XGBLCTL寄存器,通过读回GBLCTL寄存器数值看不到写入结果,直到McASP已经识别到这个变化。通常这需要两个位时钟加上两个DSP总线时钟。 同样,如果能够完全停止位时钟,任何查询(polling)GBLCTL寄存器的软件应该给定超时(time-out)去执行。如果GBLCTL寄存器没有超时(time-out),并且位时钟终止,写入GBLCTL寄存器的变化将不会反映出来,直到位时钟重新启动。 最后,请注意RGBLCTL和XGBLCTL寄存器允许分别改变GBLCTL寄存器的输入半部和输出半部,他们也立刻在更新数值中反映出来(对调试有利)。只有GBLCTL寄存器可以使用读回数值。 3.1.4 输出和输入同步进行(ASYNC = 0) 如果ACLKXCTL的ASYNC位为0,输出和输入部分操作按照输出部分时钟和输出部分帧同步信号进行同步。输入部分可以采用不同的数据格式(但必须在槽尺寸上兼容)。 如果ASYNC位为0,输出和输入部分必须共享某些同样的设置,由于他们使用同样的时钟和帧同步信号: ◎寄存器DITCTL的位DITEN为0(TDM模式被使能)。 ◎每帧的总数据位数必须一样(就是说,RSSZ×RMOD必须等于XSSZ×XMOD)。 ◎输出和输入同时配置为爆发(burst)模式或者TDM模式,但是不能混合。 ◎寄存器ACLKRCTL中的设置没有相关性(译者补:没有作用)。 ◎FSXM必须和FSRM一致。 ◎FXWID必须和FRWID一致。 对于所有其他配置,输出和输入部分可以独立编程设置。 3.1.5 输出和输入异步操作(ASYNC = 1) 如果ACLKXCTL寄存器中的ASYNC位为1,输出和输入部分完全独立运行,拥有分离的时钟和帧同步信号(图2-2、图2-3,和图2-4)。每个部分产生的事件异步到来。
|