DSP论坛
直播中

沈士杰

12年用户 106经验值
擅长:模拟技术
私信 关注

【创龙TMS320C6748开发板试用】+ uPP配置


       OMAPL138有多种地址数据总线如I2CSPIUART,这些接口能够满足一般的低速传送要求,但是在高速协同中却不能满足数据传输的需求。我们知道,并行数据传输肯定要比串行传输快,TMS320C6748平台上搭载了uPP(通用并行IO)。在ti公司的66系列DSP中搭载了更高速的RapidIO接口,最高速率达10Gbps,相比TCPIP协议软件开销较低,与 FPGA互联方便,是一种比较有前景的通信技术。

       1uPP硬件IO资源,通信时需要用到的管脚:


       由上图可看出uPP有两个通道即通道A和通道B,通道AB都具有各自STARTENABLEWAITCLOCK信号控制管脚。而两个十六位的数据管脚DATA[15:0]不直接对应通道AXDATA[15:0]也不直接对应通道B。数据管脚DATA[15:0]XDATA[15:0]与通道AB的对应关系是通过配置寄存器UPCTL来实现的。


       UPCTL寄存器中的CHNIWAIWB决定AB通道与DATA[15:0]XDATA[15:0]的关系。IWA为高,A通道使用16bit数据,反之则为8bit数据,IWB同理;CHN为高,AB通道均使能,反之只使用A通道。

2、时钟选择

无论是同步还是异步,都必须有时钟源。uPP是同步的,发送方提供时钟源。

传输模式使用内部时钟:

I/O Clock = Transmit Clock/(2 × (UPICR.CLKDIVn + 1))


上图的transmit Clock通过查看相关的手册可知是锁相环得出的,来自PLL0_SYSCLK2,再将其二分频后再经过(UPICR.CLKDIV+1)分频,得到CLOCK pin的频率。


       3、数据格式

       uPP支持任何字长介于8~16bit的数据,显然,要操作8bit16bit很简单,那么对于数据字长介于8bit~16bit之间的数据应该怎么操作呢。下图给出了12bit数据的打包方式。


Right-Justify, Zero Extend –很简单,就是字面上的意思,右对齐,高位空出的位清零。

Right-Justify, Sign Extend –右对齐,高位的状态取决于最高bit的状态,当为1那么所有空出的高位补1,例如ABCh(101010111100),最高位为1,转换为16bit数据为FABCh。

Left-Justify, Zero Fill–左对齐,低位空出的位补零。

       4、模式选择


      

       5数据触发方式

单倍数据传输:(SDR)数据信号只能在时钟上升沿或者下降沿触发有效

双倍数据传输:(DDR)数据信号在时钟上升沿和下降沿都触发有效  

       uPP具有2个独立的DMA模块,分别称为DMA模块IDMA模块Q

通道AB在传输数据时是通过DMA模块来实现的,DMA模块与通道的对应关系如下图:


6DMA专用术语Windows AddressByte CountLine CountLine Offset Address在内存中关系。












       上图很清楚的告诉我们Windows Address只指其起始地址,Line Offset Address是指其偏移地址。然后一个疑问是为什么在图中看来,Line1Line2永远都分开着,LineLine之间是连续存放的还是无间隙的?

       仔细阅读datasheet会发现,在述说这段的文字中总强调起始地址最好设置为aligned to a 64-bit (that is, the3 LSBs must equal 0).再一琢磨,如果起始地址达到了alignedto a 64-bit 的要求,那LineLine就是无缝连接了。而且在实际应用中,LineLine之间都是连续存放的,因为配置DMA channel 的寄存器UPTCR只提供了64Bytes 128Bytes 256Bytes选项。


       7、时序图

(1)单倍数据发送


(2)单倍数据接收


(3)双倍数据接收


上图是单通道接收SDR模式,看似好好的时序图,START信号高电平使能整个uPP接收,但是datasheet中却表示START的极性是可以通过STARTx bit in UPICR来修改的,即START可以低电平触发使能uPP。给人一种感觉:startenalbewait信号又是可以禁止又是可以使能的,很容易迷惑人。到底怎么配置能达到通信要求,参考时序图,还是发送方接收方不一样配置?

       回头一想,startenable的极性都可以自己定义,只要发送和接收配置成一致就行了,因为uPP大多时候用于与adc的无缝连接,虽然adc都是高电平触发使能的,但也没准有的adc是下降沿使能触发的。即adc也可能是高电平使能也可能是低电平使能。startenable信号极性使能的可配置型使得应用adc更加自由不再拘束了。


8、程序

1uPP初始化文件

/*

*uPP.h

*

*  Created on: 2015-7-2

*      Author: JJS

*/


#ifndef UPP_H_

#define UPP_H_

#define M 256

Uint32 Buffer_Trans[1000];

Uint32 Buffer_Recv[1000];

/*

extern voidsetup_uPP_receive(void)

{

         uppRegs->UPPCR=  (CSL_UPP_UPPCR_SWRST_RESET<
              delay(10);

              uppRegs->UPPCR=  (CSL_UPP_UPPCR_SWRST_RUNNING<
              uppRegs->UPCTL=0;

              uppRegs->UPICR=0;

              uppRegs->UPIVR=0;

              uppRegs->UPIES=0;

              uppRegs->UPDLB=0;

              uppRegs->UPPCR=0;

              uppRegs->UPTCR=0;


              uppRegs->UPCTL= (

                                            (CSL_UPP_UPCTL_IWA_16BIT  << CSL_UPP_UPCTL_IWA_SHIFT)|//数据传输16Bit

                                            (CSL_UPP_UPCTL_DRA_SINGLE  << CSL_UPP_UPCTL_DRA_SHIFT)|//单数据模式

                                      (CSL_UPP_UPCTL_DPWA_FULL <
                                      (CSL_UPP_UPCTL_CHN_ONE    << CSL_UPP_UPCTL_CHN_SHIFT)|//双通道

                                      (CSL_UPP_UPCTL_MODE_RECEIVE  << CSL_UPP_UPCTL_MODE_SHIFT ));//A接


              uppRegs->UPICR=   (( 0<
                                                 (0<
                                                 (1<
                                                 (1<

              uppRegs->UPTCR=   (( CSL_UPP_UPTCR_TXSIZEB_64B<
                                             (CSL_UPP_UPTCR_TXSIZEA_64B<
                                             (CSL_UPP_UPTCR_RDSIZEQ_64B<
                                             (CSL_UPP_UPTCR_RDSIZEI_64B<

              uppRegs->UPIVR=   ( (0x0AAA <
                                                  (0x0AAA   <

              uppRegs->UPIES=  ((CSL_UPP_UPIES_EOLQ_SET<
                                            (CSL_UPP_UPIES_EOWQ_SET<
                                            (CSL_UPP_UPIES_EOLI_SET<
                                            (CSL_UPP_UPIES_EOWI_SET<
       //

              uppRegs->UPDLB=((CSL_UPP_UPDLB_BA_DISABLE<
                                      (CSL_UPP_UPDLB_AB_DISABLE<

              uppRegs->UPPCR=  ((CSL_UPP_UPPCR_EN_ENABLE<
                                      (CSL_UPP_UPPCR_SOFT_ENABLE<
                                      (CSL_UPP_UPPCR_RTEMU_ENABLE<
}

*/


void setup_uPP_LoopBack(void)

{

        uppRegs->UPPCR=  (CSL_UPP_UPPCR_SWRST_RESET<
             delay(300);

             uppRegs->UPPCR=  (CSL_UPP_UPPCR_SWRST_RUNNING<
             uppRegs->UPCTL =0;

             uppRegs->UPICR=0;

             uppRegs->UPIVR=0;

             uppRegs->UPIES=0;

             uppRegs->UPDLB =0;

             uppRegs->UPPCR=0;

             uppRegs->UPTCR=0;



             uppRegs->UPCTL = ((CSL_UPP_UPCTL_IWB_16BIT << CSL_UPP_UPCTL_IWB_SHIFT)|//数据传输16Bit

                                           (CSL_UPP_UPCTL_IWA_16BIT  << CSL_UPP_UPCTL_IWA_SHIFT)|//数据传输16Bit

                                           (CSL_UPP_UPCTL_DRB_SINGLE  << CSL_UPP_UPCTL_DRB_SHIFT)|//单数据模式

                                           (CSL_UPP_UPCTL_DRA_SINGLE  << CSL_UPP_UPCTL_DRA_SHIFT)|//单数据模式

                                     (CSL_UPP_UPCTL_DPWB_FULL  << CSL_UPP_UPCTL_DPWB_SHIFT)|//全数传输

                                     (CSL_UPP_UPCTL_DPWA_FULL <
                                     (CSL_UPP_UPCTL_CHN_TWO    << CSL_UPP_UPCTL_CHN_SHIFT)|//双通道

                                     (CSL_UPP_UPCTL_MODE_DUPLEX1  << CSL_UPP_UPCTL_MODE_SHIFT ));//A发B接


              uppRegs->UPICR=   (( 2<
                                                 (2<
                                          //     (2<
                                          //     (2<
                                                 (2<
                                                 (2<


             uppRegs->UPTCR=   ((CSL_UPP_UPTCR_TXSIZEB_64B<
                                            (CSL_UPP_UPTCR_TXSIZEA_64B<
                                            ( CSL_UPP_UPTCR_RDSIZEQ_64B<
                                            (CSL_UPP_UPTCR_RDSIZEI_64B<

             uppRegs->UPIVR=   (  (0x0AAA   <
                                                 (0x0AAA    <

             uppRegs->UPIES=   ((CSL_UPP_UPIES_EOLQ_SET<
                                           (CSL_UPP_UPIES_EOWQ_SET<
                                           (CSL_UPP_UPIES_EOLI_SET<
                                           (CSL_UPP_UPIES_EOWI_SET<



             uppRegs->UPDLB =((CSL_UPP_UPDLB_BA_DISABLE<
                                    (CSL_UPP_UPDLB_AB_ENABLE<

             uppRegs->UPPCR=  ((CSL_UPP_UPPCR_EN_ENABLE<
                                      (CSL_UPP_UPPCR_SOFT_ENABLE<
                                     (CSL_UPP_UPPCR_RTEMU_ENABLE<
}


extern void uPP_Loopback()

{

       /*******B通道*******/

//     setup_uPP_reset();

           uppRegs->UPQD0= (Uint32)&Buffer_Recv;//发送数组地址,8Bit对齐

              uppRegs->UPQD1 = 0x00010000+M*4*3;//128*2*4*2

              uppRegs->UPQD2 = 0x00010000;


//     setup_uPP_reset();

              /*******A通道*******/

              uppRegs->UPID0= (Uint32)&Buffer_Trans;//接收数组地址,8Bit对齐

              uppRegs->UPID1 = 0x00010000+M*4*3;//128*2*4

              uppRegs->UPID2 = 0x00010000;

}


2uPP功能程序

extern void uPP_Resiver()

{

//     setup_uPP_reset();

       /*******A通道*******/

           uppRegs->UPID0= (Uint32)&Buffer_Recv;//接收数组地址,8Bit对齐

              uppRegs->UPID1 = 0x00010000+M*4*3;//128*2*4

              uppRegs->UPID2 = 0x00010000;

}

extern void uPP_Transfer()

{

//     setup_uPP_reset();

       /*******B通道*******/

           uppRegs->UPQD0= (Uint32)&Buffer_Recv;//接收数组地址,8Bit对齐

              uppRegs->UPQD1 = 0x00010000+M*4*3;//128*2*4

              uppRegs->UPQD2 = 0x00010000;

}

#endif /* UPP_H_ */


3uPP功能主程序

int jj=0;

int kk=0;

//float data;

//int PaRAM_event10_Buffer_Ping();

void main(void)

{   

       //setup_uPP_receive();

    setup_uPP_LoopBack();

       for(kk=0;kk<768;kk++)

         {

                Buffer_Trans[kk]=kk;

         }

    //uPP_Transfer();

    //uPP_Resiver();

    uPP_Loopback();

       while(1);

}


回帖(4)

h1654155920.4618

2015-12-18 22:11:34
看看
举报

王自如

2017-2-17 16:14:19
那个数据口(data)在哪接啊
举报

CaoSix

2017-2-18 14:12:57
恩 不错 ,在 同一块 电路板上
相互传输 数据,根本用不着 TCP/IP 。
举报

程亮

2017-4-11 14:35:04
2通道,B发A收,数据宽度都是8bit,回环测试,不知道为什么,要发8次,才能收到一次数据?
举报

更多回帖

×
20
完善资料,
赚取积分