DSP C6748的upp通信

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=2h3h)。 DLB 是主要
用於調試目的的,並要求通道之間沒有物理連接
 。

2、  時鐘

無論是同步還是異步,都必須有時鐘源。uPP是同步的,發送方提供時鐘源。

傳輸模式使用內部時鐘:



上圖的transmit Clock通過查看相關的手冊可知是鎖相環得出的PLL0_SYSCLK2,再將其二分頻後再經過(UPICR.CLKDIV+1)分頻,得到CLOCK pin的頻率,即

接收模式使用外部時鐘方式:

3、數據觸發方式

單倍數據傳輸:SDR數據信號只能在時鐘上升沿或者下降沿觸發有效 

雙倍數據傳輸:DDR數據信號在時鐘上升沿和下降沿都觸發有效  

 

 4、DMA,uPP具有2個獨立的DMA模塊(暫且這麼翻譯),分別稱爲DMA模塊I,DMA模塊Q。

通道AB在傳輸數據時是通過DMA模塊來實現的,DMA模塊與通道的對應關係如下圖:


什麼時候用到DMA I模塊,什麼時候用到DMA Q模塊呢?或者兩者都用上了,這是有你的通道AB使用情況決定的,如果是前面例子中的配置即

config.UPCTL.bits.IWA = 0;             //8位接口寬度

config.UPCTL.bits.CHN = 1;            //雙通道模式

config.UPCTL.bits.MODE = 3;         // 雙工模式1

則使用2-Channel Duplex 模式。

5DMA專用術語Windows AddressByte CountLine CountLine Offset Address在內存中關係。


上圖很清楚的告訴我們Windows Address只指其起始地址,Line Offset Address 是指其偏移地址。然後一個疑問是爲什麼在圖中看來,Line1Line2永遠都分開着,LineLine之間是連續存放的還是無間隙的?

仔細閱讀datasheet會發現,在述說這段的文字中總強調起始地址最好設置爲aligned to a 64-bit (that is, the 3 LSBs must equal 0).再一琢磨,如果起始地址達到了aligned to a 64-bit 的要求,那LineLine就是無縫連接了。而且在實際應用中,LineLine之間都是連續存放的,因爲配置DMA channel 的寄存器UPTCR只提供了64Bytes 128Bytes 256Bytes選項。

6、時序圖


上圖是單通道接收SDR模式,看似好好的時序圖,START信號高電平使能整個uPP接收,但是datasheet中卻表示START的極性是可以通過STARTx bit in UPICR來修改的,即START可以低電平觸發使能uPP。給人一種感覺:start  enalbe  wait 信號又是可以禁止又是可以使能的,很容易迷惑人。到底怎麼配置能達到通信要求,參考時序圖,還是發送方接收方不一樣配置?回頭一想,startenable的極性都可以自己定義,只要發送和接收配置成一致就行了。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章