OMAPL138有多种地址数据总线如I2C、SPI、UART,这些接口能够满足一般的低速传送要求,但是在高速协同中却不能满足数据传输的需求。我们知道,并行数据传输肯定要比串行传输快,TMS320C6748平台上搭载了uPP(通用并行IO)。在ti公司的66系列DSP中搭载了更高速的RapidIO接口,最高速率达10Gbps,相比TCPIP协议软件开销较低,与 FPGA互联方便,是一种比较有前景的通信技术。
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]的关系。IWA为高,A通道使用16bit数据,反之则为8bit数据,IWB同理;CHN为高,A、B通道均使能,反之只使用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的数据,显然,要操作8bit、16bit很简单,那么对于数据字长介于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模块I,DMA模块Q。
通道A、B在传输数据时是通过DMA模块来实现的,DMA模块与通道的对应关系如下图:
6、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, the3 LSBs must equal 0).再一琢磨,如果起始地址达到了alignedto a 64-bit 的要求,那Line与Line就是无缝连接了。而且在实际应用中,Line与Line之间都是连续存放的,因为配置DMA channel 的寄存器UPTCR只提供了64Bytes 128Bytes 256Bytes选项。
7、时序图
(1)单倍数据发送
(2)单倍数据接收
(3)双倍数据接收
上图是单通道接收SDR模式,看似好好的时序图,START信号高电平使能整个uPP接收,但是datasheet中却表示START的极性是可以通过STARTx bit in UPICR来修改的,即START可以低电平触发使能uPP。给人一种感觉:start、enalbe、wait信号又是可以禁止又是可以使能的,很容易迷惑人。到底怎么配置能达到通信要求,参考时序图,还是发送方接收方不一样配置?
回头一想,start、enable的极性都可以自己定义,只要发送和接收配置成一致就行了,因为uPP大多时候用于与adc的无缝连接,虽然adc都是高电平触发使能的,但也没准有的adc是下降沿使能触发的。即adc也可能是高电平使能也可能是低电平使能。start、enable信号极性使能的可配置型使得应用adc更加自由不再拘束了。
8、程序
(1)uPP初始化文件
/*
*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;
}
(2)uPP功能程序
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_ */
(3)uPP功能主程序
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);
}
|