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);
}
回帖 (4)
2015-12-18 22:11:34
看看
看看
举报
2017-2-17 16:14:19
那个数据口(data)在哪接啊
那个数据口(data)在哪接啊
举报
2017-2-18 14:12:57
恩 不错 ,在 同一块 电路板上
相互传输 数据,根本用不着 TCP/IP 。
恩 不错 ,在 同一块 电路板上
相互传输 数据,根本用不着 TCP/IP 。
举报
2017-4-11 14:35:04
2通道,B发A收,数据宽度都是8bit,回环测试,不知道为什么,要发8次,才能收到一次数据?
2通道,B发A收,数据宽度都是8bit,回环测试,不知道为什么,要发8次,才能收到一次数据?
举报
更多回帖