ADI Blackfin DSP处理器-BF533的开发详解11:PPI视频接口的驱动和应用(含源代码)

硬件准备

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 接口管脚与复用定义:

ADI Blackfin DSP处理器-BF533的开发详解11:PPI视频接口的驱动和应用(含源代码)_第1张图片

接口寄存器说明

ADI Blackfin DSP处理器-BF533的开发详解11:PPI视频接口的驱动和应用(含源代码)_第2张图片

核心代码分析

*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);

}

你可能感兴趣的:(ADI,DSP资料下载,ADI,DSP技术中心,Blackfin专题,ADI,DSP,ADI,DSP中文资料)