ADI Blackfin DSP处理器-BF533的开发详解63:DSP接总线屏的硬件和驱动设计(含源码)

news2024/9/22 7:18:00

硬件准备

ADSP-EDU-BF533:BF533开发板
AD-HP530ICE:ADI DSP仿真器

软件准备

Visual DSP++软件

硬件链接

在这里插入图片描述
EBIU总线LCD屏

在这里插入图片描述

硬件实现原理

LCD2.4 寸液晶屏子卡板连接在 ADSP-EDU-BF53x 开发板的扩展端口 PORT1 和 PORT2 上,板卡插入时,应将扩展子卡板上标注的“圆圈”符号与板卡上的“圆圈”对准插入,避免子卡板反向接入板卡。

LCD2.4 寸液晶屏子卡板采用 EBIU 接口的液晶屏,液晶屏型号为 ILI9325。和通用的 TFT 液晶屏不同,TFT 液晶屏在显示时,需要处理器对其不断的送入数据,一旦数据中断,液晶屏上将出现花屏。而 ILI9325 液晶屏内部有
维持液晶屏持续显示的缓存,只需通过 EBIU 接口送入一帧图像的数据后,液晶屏将持续显示该数据图片,无需处理器不断刷新维持。

ILI9325 为 2.4 寸 240*320RGB 格式 26 万色的液晶屏,支持 MPU,SPI,RGB 三种总线接口。MPU 接口即 i80处理器总线接口,支持 8/9/16/18 位总线宽度。SPI 接口为串行外设接口。RGB 接口是常用的包含行场同步信号的视频接口。

BF53X 板卡的 EBIU 接口符合 ILI9325 液晶屏 MPU 接口的标准。在 BF53X 处理器上,因为只有一个 PPI 接口,在做视频处理时,摄像头和液晶屏共用 1 个 PPI 接口,使得无法实现实时采集显示功能。采用 ILI9325 液晶屏,将
其连接在 EBIU 接口上,这样摄像头通过 PPI 接口采集数据,然后将数据处理后,通过 EBIU 接口送到液晶屏上,就可以实现实时的采集和显示的功能。

ILI9325 采用扩展接口的 EBIU 接口连接,扩展接口 EBIU 接口片选由 CPLD 映射,其映射寄存器为:
#define pEXT_CS (volatile unsigned short *)0x203A0000
ILI9325 液晶屏的命令和数据控制接口,映射在 BF53X 处理器 EBIU 接口的地址线 A3 上,通过 A3 地址线的高
低电平来告知液晶屏当前操作是命令操作还是数据操作。
当 A3 为 1 时,为数据操作
当 A3 为 0 时,为命令操作
为方便使用,将对液晶屏操作的寄存器重新做了映射:
#define pEXT_CS_DAT (volatile unsigned short *)0x203A0008
#define pEXT_CS_CMD (volatile unsigned short *)0x203A0000
访问上面的寄存器,A3 地址线会根据映射的地址进行 0 和 1 电平的切换,达到通过映射地址控制液晶屏的功能。

硬件连接示意图

在这里插入图片描述

代码实现功能

代码实现了通过 include 载入一张测试的图片数据到内存,数据格式为 240*320,RGB24。运行代码后,代码对ILI9325 初始化,然后将 RGB24 格式的数据转为 RGB565 格式,转完后将数据通过 EBIU 接口,送入液晶屏。执行代码后,在液晶屏上可以看到一幅图片。

测试步骤

1. 将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好,将 LCD-24 子卡板按板上“圆圈”符号提示,插入板卡的 PORT1 和 PORT2 接口。
2. 先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
3. 运行 VisualDSP++ 5.0 软件,选择合适的 BF53x 的 session 将仿真器与软件连接。
4. 加载 VisualDSP++ 5.0 工程文件 BF53x_LCD24.dpj 文件,编译并全速运行。

测试结果

代码运行完成后,会在液晶屏端看到一幅图像。

在这里插入图片描述

程序源码

9325.c

#include <cdefBF533.h>
#include <ccblkfn.h>
#include “cpld.h”
//============================================================
//根据芯片资料定义
#define WINDOW_XADDR_START 0x0050 // Horizontal Start Address Set
#define WINDOW_XADDR_END 0x0051 // Horizontal End Address Set
#define WINDOW_YADDR_START 0x0052 // Vertical Start Address Set
#define WINDOW_YADDR_END 0x0053 // Vertical End Address Set
#define GRAM_XADDR 0x0020 // GRAM Horizontal Address Set
#define GRAM_YADDR 0x0021 // GRAM Vertical Address Set
#define GRAMWR 0x0022 // memory write

//====================================================//
//函数声明

void ILI9325_Initial(void);
void Write_Cmd_Data(unsigned char x, unsigned int y);
void Write_Cmd(unsigned char DH,unsigned char DL);
void Write_Data(unsigned char DH,unsigned char DL);
void delays(unsigned int tt);
void Write_Data_U16(unsigned int y);
void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1);
void ClearScreen(unsigned int bColor);
void Show_RGB (unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1,unsigned int Color);
void LCD_PutString(unsigned short x, unsigned short y, char *s, unsigned int fColor, unsigned int bColor);

void Write_pic(unsigned short Cow_num,unsigned char *buffer)

{
int i;
LCD_SetPos(0,240,0,320);
for(i=0;i<76800;i++)
{
Write_Data(buffer[2i+1],buffer[2i]);
}
}

//===============================================================
//写命令数据

void Write_Cmd_Data (unsigned char x,unsigned int y)
{
unsigned char m,n;
m=y>>8;
n=y;
Write_Cmd(0x00,x);
Write_Data(m,n);

}

//====================== 写命令 ==========================//

void Write_Cmd(unsigned char DH,unsigned char DL)
{
*pEXT_CS_CMD = DH;
*pEXT_CS_CMD = DL;

}

//===================== 写数据 ===========================//

void Write_Data(unsigned char DH,unsigned char DL)
{
*pEXT_CS_DAT = DH;
*pEXT_CS_DAT = DL;
}

//============================================================
//延时程序
void delays(unsigned int count)
{
int i,j;
for(i=0;i<count;i++)
{
for(j=0;j<260;j++);
}
}

//=============================================================
//液晶初始化

void ILI9325_Initial(void)
{
delays(50);
Write_Cmd_Data(0x0001,0x0100);
Write_Cmd_Data(0x0002,0x0700);
Write_Cmd_Data(0x0003,0x1030);
Write_Cmd_Data(0x0004,0x0000);
Write_Cmd_Data(0x0008,0x0207);
Write_Cmd_Data(0x0009,0x0000);
Write_Cmd_Data(0x000A,0x0000);
Write_Cmd_Data(0x000C,0x0000);
Write_Cmd_Data(0x000D,0x0000);
Write_Cmd_Data(0x000F,0x0000);
//power on sequence VGHVGL
Write_Cmd_Data(0x0010,0x0000);
Write_Cmd_Data(0x0011,0x0007);
Write_Cmd_Data(0x0012,0x0000);
Write_Cmd_Data(0x0013,0x0000);
//vgh
Write_Cmd_Data(0x0010,0x1290);
Write_Cmd_Data(0x0011,0x0227);
//vregiout
Write_Cmd_Data(0x0012,0x001d); //0x001b
//vom amplitude
Write_Cmd_Data(0x0013,0x1500);
//vom H
Write_Cmd_Data(0x0029,0x0018);
Write_Cmd_Data(0x002B,0x000D);

//gamma
Write_Cmd_Data(0x0030,0x0004);
Write_Cmd_Data(0x0031,0x0307);
Write_Cmd_Data(0x0032,0x0002);// 0006
Write_Cmd_Data(0x0035,0x0206);
Write_Cmd_Data(0x0036,0x0408);
Write_Cmd_Data(0x0037,0x0507); 
Write_Cmd_Data(0x0038,0x0204);//0200
Write_Cmd_Data(0x0039,0x0707); 
Write_Cmd_Data(0x003C,0x0405);// 0504
Write_Cmd_Data(0x003D,0x0F02); 
//ram
Write_Cmd_Data(0x0050,0x0000); 
Write_Cmd_Data(0x0051,0x00EF);
Write_Cmd_Data(0x0052,0x0000); 
Write_Cmd_Data(0x0053,0x013F);  
Write_Cmd_Data(0x0060,0xA700); 
Write_Cmd_Data(0x0061,0x0001); 
Write_Cmd_Data(0x006A,0x0000); 
//
Write_Cmd_Data(0x0080,0x0000); 
Write_Cmd_Data(0x0081,0x0000); 
Write_Cmd_Data(0x0082,0x0000); 
Write_Cmd_Data(0x0083,0x0000); 
Write_Cmd_Data(0x0084,0x0000); 
Write_Cmd_Data(0x0085,0x0000); 
//
Write_Cmd_Data(0x0090,0x0010); 
Write_Cmd_Data(0x0092,0x0600); 
Write_Cmd_Data(0x0093,0x0003); 
Write_Cmd_Data(0x0095,0x0110); 
Write_Cmd_Data(0x0097,0x0000); 
Write_Cmd_Data(0x0098,0x0000);
Write_Cmd_Data(0x0007,0x0133);

}

//===============================================================
//定义坐标
static void LCD_SetPos(unsigned int x0,unsigned int x1,unsigned int y0,unsigned int y1)
{
Write_Cmd_Data(WINDOW_XADDR_START,x0);
Write_Cmd_Data(WINDOW_XADDR_END,x1);
Write_Cmd_Data(WINDOW_YADDR_START,y0);
Write_Cmd_Data(WINDOW_YADDR_END,y1);
Write_Cmd_Data(GRAM_XADDR,x0);
Write_Cmd_Data(GRAM_YADDR,y0);
Write_Cmd (0x00,0x22);
}

cpu.c

#include <cdefBF533.h>

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 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;”);
}
}

main.c

#include <cdefBF533.h>
#include <ccblkfn.h>
#include <stdio.h>

section(“sdram0_bank1”) unsigned char load_buffer[230400]=
{
#include “lcd24.dat”
};
section(“sdram0_bank1”) unsigned char dst[153600];

void main(void)
{
int i,j;
int m=0,n=0,line=0;

Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
ILI9325_Initial();
delays(20000);

for (n = 0; n < 230400; n += 3)
{
     dst[m+1] = load_buffer[n+2] &0xf8; 			//B 
     dst[m+1] |= ((load_buffer[n+1]>>5) & 0x07);	//GH
     dst[m] = ((load_buffer[n+1]<<3) & 0xe0);  		//GL  
     dst[m] |= ((load_buffer[n]>>3) &0x1f); 		//R
     m += 2;         	
}
Write_pic(line,dst);		    			
delays(100000);
while(1);

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99105.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于JAVA的水产批发系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

【Linux】低级IO

目录 一、文件的概念 二、C语言文件操作回顾 三、使用系统调用进行文件I/O 1、系统调用open 1.1open接口介绍 1.2open形参中标记位flags的意义 1.3open的使用 2、系统调用write 2.1write接口介绍 2.2write的使用 3、系统调用read 3.1read接口介绍 3.2read的使用 …

什么是 SAP ABAP FDA - Fast Data Access 技术?

快速数据访问 (Fast Data Access&#xff0c;缩写为 FDA) 是一种可在 SAP ABAP 环境中访问的协议。 它允许针对 SAP HANA 提交 OPEN SQL SELECT 语句&#xff0c;从而使用 SAP ABAP 的数据格式。 在快速数据访问场景里&#xff0c;SAP ABAP 内表数据传输到数据库并返回。这种方…

Java+MySQL基于ssm的物理竞赛管理系统

物理竞赛是对课堂上所学的理论知识的实践运用,加深所学知识的理解,锻炼团队协作能力。学生可以根据个人爱好,个人特长选择参与,不仅能培养学生的创新意思、提高专业技能,还能锻炼学生的组织能力和协作能力。物理竞赛是在中国科协的领导下,由中国物理学会主办,各省、自治区、直辖…

【力扣周赛#324】6266. 使用质因数之和替换后可以取到的最小值+6267. 添加边使所有节点度数都为偶数+6268. 查询树中环的长度

目录 6265. 统计相似字符串对的数目 - ac 6266. 使用质因数之和替换后可以取到的最小值 分解质因数 1、tle代码 2、优化ac代码 6267. 添加边使所有节点度数都为偶数 - 建图分类讨论 关于建图 6268. 查询树中环的长度 - LCA最近公共祖先 6265. 统计相似字符串对的数目…

[附源码]Nodejs计算机毕业设计基于微信平台的车险投保系统设计与实现Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

Vue实现后台管理系统

目录 前言 登录页面 后台界面 前言 今天用Vue实现一个简易的后台&#xff0c;不借助接口和后端代码&#xff0c;仅通过前端实现&#xff0c;本案例涉及Vue路由相关知识&#xff0c;不熟悉Vue路由可以先看一下右边的文章再接着看下面的项目案例&#xff1a;Vue路由 这篇文章详…

[CISCN2019 华北赛区 Day1 Web2]

目录 前言 涉及考点 部分记录 前言 第一次看到这题时没有思路&#xff0c;通过搜索相关WP并简单了解考点所涉及的知识后&#xff0c;通过解题来扩展自己的知识面 涉及考点 python爬虫&#xff0c;支付逻辑漏洞&#xff0c;cookie篡改&#xff0c;重放攻击&#xff0c;JWT…

C++11后的STL算法

文章目录一、函数对象二、预定义的函数对象三、算法函数1.自己实现foreach算法2.自己实现的findif算法3.自己实现bsort算法一、函数对象 STL提供了很多处理容器的函数模板&#xff0c;它们的设计是相同的&#xff0c;有以下特点&#xff1a; 1&#xff09;用迭代器表示需要处理…

数据结构---用栈实现队列

用栈实现队列模拟入队模拟出队JAVA实现总结用栈来模拟一个队列&#xff0c;要求实现队列的两个基本操作&#xff1a;入队、出队。栈是先入后出&#xff0c;队列是先入先出 用两个栈来实现一个队列功能 让其中一个栈作为队列的入口&#xff0c;负责插入新元素&#xff1b;另一个…

ARM9和STM32什么关系?

已剪辑自: https://mp.weixin.qq.com/s/QHARY-D2SwFoQbFsJoCNlg 有小伙伴问&#xff1a;ARM9和STM32什么关系&#xff1f;如果时间倒退10年&#xff0c;ARM9、 s3c2410还算是比较流行的年代&#xff0c;但STM32这类“新时代”的ARM处理器也问世了。 ARM9是早期的ARM处理器&…

Java+MySQL基于ssm的打车管理系统的设计与实现

随着时代的发展,交通也变的越来越便利,但是很多时候人们出行的时候因为各种原因还是会进行打车,因为一些地区比较偏远或者处于特殊的时间段而用户又急需用车等情况导致没办法及时的打到车,这种情况下就急需一套基于互联网的打车系统出现了。 本打车管理系统采用JAVA语言来进行开…

Vivado2019+Modelsim仿真环境搭建

目录 一、安装准备 二、安装与配置 2.1 Vivado安装 2.2 modelsim安装 2.3 Vivado设置modelsim仿真环境 1&#xff09;仿真库生成设置 2&#xff09;modelsim添加仿真库&#xff08;逐个添加&#xff09; 3&#xff09;modelsim添加仿真库&#xff08;批量添加&#xff…

Spring 中 @Value 注解使用和源码分析

1、Value 注解使用 先配置本地 application.properties 如下&#xff1a; apple.nameabc代码如下&#xff1a; PropertySource("application.properties") public class Apple {Value("${apple.name}")public String name; }ComponentScan public class …

非零基础自学Golang 第9章 结构体 9.7 匿名结构体 9.8 小结 9.9 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第9章 结构体9.7 匿名结构体9.7.1 匿名结构体定义与初始化9.7.2 匿名结构体的应用9.8 小结9.9 知识拓展9.9.1 使用结构体解析XML文件第9章 结构体 9.7 匿名结构体 9.7.1 匿名结构体定义与初始化 匿名结构体&#xff0c;顾名思…

blender源代码编译运行

其实在blender官网上已经给出了编译步骤https://wiki.blender.org/wiki/Building_Blender/Windows&#xff0c;由于在源码编译的过程中还遇到了很多问题&#xff0c;特此记录一下。 文章目录前提准备代码下载1. blender源码下载2. lib下载编译前提准备 Visual Studio2019或者2…

Innodb存储引擎-执行流程分析和二阶段提交分析

文章目录执行流程分析基本流程WAL(Write-Ahead Log)write和fsync区别innodb_flush_logs_at_trx_commit & sync_binlog二阶段提交执行流程分析 基本流程 &#xff08;1&#xff09;连接,分析,优化,执行 客户端与MySQL Server建立连接&#xff0c;发送语句给MySQL Server&a…

2022.12.18 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.RNNConventional Recurrent Neural Networks5.Deep Recurrent Neural Networks5.1 Deep Transition RNN5.2 Deep Output5.3 Stacked RNN6.实验6.1 训练6.2 结果与分析7.讨论深度学习GRU公式推导1.GRU前向传播2.GRU反向传播GRU代码实现…

关于数学中“函数(function)”的含义

目录 1. 问题 2. “function”是如何翻译成“函数”的&#xff1f; 3. “function”是谁引入数学中的&#xff0c;其意义何在&#xff1f; 3.1 “function”的词源 3.2 “function”引入数学中 3.3 “function”的含义 4. 常见的函数(Common Functions) 4.1 线性函数(L…

word页码如何设置为章节加页码,例如第一章第一页1-1、第二章章第一页2-1

由于用到word页码分章节页码的形式&#xff0c;从网上查了一下&#xff0c;质量真的很差&#xff0c;没有一篇文章讲清楚的&#xff0c;有的所答非所问&#xff0c;一怒之下&#xff0c;利用几个小时的时间解决问题并写下这篇文章&#xff0c;以供大家学习参考&#xff01;&…