硬件准备
ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器
软件准备
Visual DSP++软件
硬件链接
接口功能介绍
PPI(Parallel Peripheral Interface )接口在 ADSP-BF53x 上常用于视频信号和同步数据的传输,是半双工接口,支持数据的采集和数据的传输。
ADSP-BF533 上有一个 16Bit 的 PPI 接口,最高速度可以到系统时钟的 1/2,有视频信号传输使用的行、列、场是三个同步信号,支持ITU656,ITU601 等模式,可兼容大部分视频相关的芯片。
PPI 接口自身不能产生时钟信号,所以 PPICLK 信号必须由外部设备或者晶振提供,它没有专门的行,列同步信号管脚,在使用 PPI 时,需采用与其复用的 Timer1 和 Timer2 管脚来作为行列同步信号管脚,PPI 接口的场同步
管脚 FS3 与 PF3 脚复用,该信号是在传输电视视频信号时,指示当前传输的信号是奇场还是偶场信号,在通常不使用的情况下,该管脚必须下拉。
PPI 接口与其他接口不同,他没有发送和接收数据的寄存器,不能采用 Core 来操作数据,只能采用 DMA 传输。
PPI 接口管脚与复用定义:
接口寄存器说明
核心代码分析
*pDMA0_START_ADDR = 0; //配置 PPIDMA 数据起始地址
*pDMA0_X_COUNT = 480; //配置 DMA 一行要传输多少次数据
*pDMA0_X_MODIFY = 2; //配置每次传输行地址的增量
*pDMA0_Y_COUNT = 286; //配置要传输多少行数据
*pDMA0_Y_MODIFY = 2; //配置每次列数据地址的增量
*pDMA0_CONFIG = 0x1034; //配置 DMA 工作模式
*pPPI_CONTROL = 0x781e; //配置 PPI 工作偶是
*pPPI_DELAY = 0; //配置时钟延时为 0
*pPPI_COUNT = 479; //配置 PPI 每行要传输 480 次
*pPPI_FRAME = 286; //配置每帧图像有 286 行
*pTIMER1_PERIOD = 525; //配置行同步信号产生的周期
*pTIMER1_WIDTH = 41; //配置行同步信号宽度
*pTIMER1_CONFIG = 0x00a9;//配置行同步信号工作模式
*pTIMER2_PERIOD = 150150;//配置列同步信号产生的周期
*pTIMER2_WIDTH = 5250; //配置列同步信号宽度
*pTIMER2_CONFIG = 0x00a9; //配置列同步信号工作模式
*pDMA0_CONFIG |= 0x1; //使能 DMA
asm(“ssync;”); //系统同步 /
*pPPI_CONTROL |= 0x1; //使能 PPI
asm(“ssync;”); //系统同步
*pTIMER_ENABLE|= 0x0006; //使能行场同步信号
asm(“ssync;”); //系统同步
PPI 的行场同步信号与 TIMER1 和 TIMER2 复用,所以要配置 TIMER 寄存器来启动 PPI 的同步信号。
代码实现功能
代码实现了 PPI 连续发送 525286 尺寸图像的数据,其中图像有效数据尺寸为 480286。
PPI 接口传输设置的数据。该代码实现了使用 PPIDMA 传输数据的功能,没有实际的设备与其通讯来观察结果,如需要看结果,可以运行板卡驱动下的液晶屏代码,观察传输的图像数据。
完整代码
#include
void InitDMA(void);
void InitEPPI0(void);
void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm(“ssync;”);
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm(“ssync;”);
asm(“idle;”);
}
}
void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}
void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
}
void InitDMA(void)
{
*pDMA0_START_ADDR = 0;
*pDMA0_X_COUNT = 480;
*pDMA0_X_MODIFY = 2;
*pDMA0_Y_COUNT = 286;
*pDMA0_Y_MODIFY = 2;
*pDMA0_CONFIG = 0x1034;
}
void InitPPI(void)
{
*pPPI_CONTROL = 0x781e;
*pPPI_DELAY = 0;
*pPPI_COUNT = 479;
*pPPI_FRAME = 286;
}
void InitTimer(void)
{
*pTIMER1_PERIOD = 525;
*pTIMER1_WIDTH = 41;
*pTIMER1_CONFIG = 0x00a9;
*pTIMER2_PERIOD = 150150;
*pTIMER2_WIDTH = 5250;
*pTIMER2_CONFIG = 0x00a9;
}
void PPI_TMR_DMA_Enable(void)
{
*pDMA0_CONFIG |= 0x1;
asm(“ssync;”);
InitTimer();
*pPPI_CONTROL |= 0x1;
asm(“ssync;”);
*pTIMER_ENABLE|= 0x0006;
asm(“ssync;”);
}
void PPI_TMR_DMAR_Disable(void)
{
*pDMA0_CONFIG &= (~0x1);
*pPPI_CONTROL &= (~0x1);
}
void main(void)
{
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
InitDMA();
InitPPI();
InitTimer();
PPI_TMR_DMA_Enable();
while(1);
}