C6748
的高速传输接口即uPP
(通用并行接口),专门用于大量数据送入内存或从中读出数据。uPP
的传输速率为每时钟周期1
个数据字(8
位或16
位)
;或者针对双数据速率为每时钟周期2
个数据字,但是时钟速率必须减半。uPP
时钟速率可以高达处理器时钟速率的一半。对于在300MHz
下运行的C6748处理器,uPP
时钟可以达到75MHz
。这使吞吐量可以达到150MB/s
。以下是笔者在使用过程中对uPP
的一些理解,记录以备忘。1、
首先是uPP
都有哪些IO
资源,通信时会使用其中的哪些管脚?上图可看出uPP有两个通道即通道A和通道B,通道A、B都具有各自START、ENABLE、WAIT、CLOCK信号控制管脚。而两个十六位的数据管脚DATA[15:0]不直接对应通道A、XDATA[15:0]也不直接对应通道B。数据管脚DATA[15:0]、XDATA[15:0]与通道A、B的对应关系是通过配置寄存器uPCTL来实现的,如下图
UPCTL寄存器中的CHN 、 IWA 、 IWB 决定A、B通道与DATA[15:0]、XDATA[15:0]的关系。
举个例子,如果只想用通道A
来发送数据,B通道接收数据,8
位数据宽,配置代码如下config.UPCTL.bits.IWA = 0; //
8位接口宽度config.UPCTL.bits.CHN = 1; //双通道模式config.UPCTL.bits.MODE = 3; // 双工模式1
其中MODE
位配置uPP
的收发模式,见下图:其中检测
数字回路(DLB)模式是一种配置,该 uPP 外设从一个通道到另一个通道的内部路线数据和控
制信号。 DLB 只能用于外设配置为双工模式时(即, UPCTL.MODE=2h或3h)。 DLB 是主要
用于调试目的的,并要求通道之间没有物理连接 。2、
时钟无论是同步还是异步,都必须有时钟源。uPP
是同步的,发送方提供时钟源。传输模式使用内部时钟:
上图的transmit Clock通过查看相关的手册可知是锁相环得出的PLL0_SYSCLK2,再将其二分频后再经过(UPICR.CLKDIV+1)分频,得到CLOCK pin的频率,即
接收模式使用外部时钟方式:
3
、数据触发方式单倍数据传输:(SDR)数据信号只能在时钟上升沿或者下降沿触发有效 双倍数据传输:(DDR)数据信号在时钟上升沿和下降沿都触发有效 4、DMA,uPP具有2个独立的DMA模块(暂且这么翻译),分别称为DMA模块I,DMA模块Q。
通道A
、B
在传输数据时是通过DMA
模块来实现的,DMA
模块与通道的对应关系如下图:
什么时候用到DMA I
模块,什么时候用到DMA Q
模块呢?或者两者都用上了,这是有你的通道A
、B
使用情况决定的,如果是前面例子中的配置即config.UPCTL.bits.IWA = 0; //8位接口宽度config.UPCTL.bits.CHN = 1; //双通道模式config.UPCTL.bits.MODE = 3; // 双工模式1
则使用2-Channel Duplex 模式。5
、DMA
专用术语Windows Address
、Byte Count
、Line Count
、Line Offset Address
在内存中关系。
上图很清楚的告诉我们Windows Address
只指其起始地址,Line Offset Address
是指其偏移地址。然后一个疑问是为什么在图中看来,Line1
和Line2
永远都分开着,Line
与Line
之间是连续存放的还是无间隙的?仔细阅读datasheet
会发现,在述说这段的文字中总强调起始地址最好设置为aligned to a 64-bit (that is, the 3 LSBs must equal 0).
再一琢磨,如果起始地址达到了aligned to a 64-bit
的要求,那Line
与Line
就是无缝连接了。而且在实际应用中,Line
与Line
之间都是连续存放的,因为配置DMA channel
的寄存器UPTCR
只提供了64Bytes 128Bytes 256Bytes
选项。6
、时序图
上图是单通道接收SDR
模式,看似好好的时序图,START
信号高电平使能整个uPP
接收,但是datasheet
中却表示START
的极性是可以通过STARTx bit in UPICR
来修改的,即START
可以低电平触发使能uPP
。给人一种感觉:start
、 enalbe
、 wait
信号又是可以禁止又是可以使能的,很容易迷惑人。到底怎么配置能达到通信要求,参考时序图,还是发送方接收方不一样配置?回头一想,start、enable的极性都可以自己定义,只要发送和接收配置成一致就行了。