ADI Blackfin DSP处理器-BF533的开发详解24:触摸屏的实现和应用(含源代码)

硬件准备**

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

软件准备

Visual DSP++软件

硬件链接

使用到硬件模块原理图

ADI Blackfin DSP处理器-BF533的开发详解24:触摸屏的实现和应用(含源代码)_第1张图片

功能介绍

四线电阻式触摸屏,拿笔和指甲划拉的,不是现在的容性触摸屏。

ADSP-EDU-BF53x 板卡的 TFT 液晶屏上,覆盖了一层触摸屏(Touch),触摸屏连接触摸屏控制器芯片 ADS7843, ADSP-BF53x 通过 SPI 接口连接该控制器,采用 PF2 实现控制器设备的控制,由于板卡上有 SD 卡和触摸屏控制器两个 SPI 设备,所以通过 CPLD 将 PF2 接口做了个 2 选 1 切换,通过配置 CPLD 的 DEVICE_OE 寄存器,来使能和 选通 PF2 连接哪一个 SPI 设备。

DEVICE_OE 寄存器(读/写):
DEVICE_OE 寄存器地址:0x20320000
DEVICE_OE 寄存器设置硬件设备上一些控制管脚的电平状态。

DEVICE_OE 寄存器位功能:

在这里插入图片描述

SPI_SEL1~0:SPI 片选选择位
00:SPI_SEL 选通触摸屏模块
01:SPI_SEL 选通 SD 卡模块
10:SPI_SEL 选通外部 SPI0 模块
11:SPI_SEL 选通外部 SPI1 模块

在使用触摸屏时,需将 SPI_SEL0 位设置为 0,将 SPI_SEL1 位设置为 0。

硬件连接示意图

ADI Blackfin DSP处理器-BF533的开发详解24:触摸屏的实现和应用(含源代码)_第2张图片

代码实现功能

代码实现了 12Bit 的触摸屏控制器对触摸屏坐标的读取,代码采用中断触发方式,当中断触发后,读出中断数据寄存器,判断确认为触摸屏中断,然后调用触摸屏读坐标函数分别读取 X 坐标和 Y 坐标。并将坐标打印在
VisualDSP++ 软件上。

测试步骤

1. 将仿真器(ICE)与 ADSP-EDU-BF53x 开发板和计算机连接好。
2. 先给 ADSP-EDU-BF53x 开发板上电,再为仿真器(ICE)上电。
3. 运行 VisualDSP++ 5.0 软件,选择合适的 BF533 的 session 将仿真器与软件连接。
4. 加载 VisualDSP++ 5.0 工程文件 BF53x_TOUCH,编译并全速运行。

测试结果

用手点击触摸屏,在 VisualDSP++ 5.0 软件上打印被触发的触摸屏坐标。

ADI Blackfin DSP处理器-BF533的开发详解24:触摸屏的实现和应用(含源代码)_第3张图片

程序源码

ADS7843.C

#include

void SPIinit(void)
{
*pSPI_BAUD=30;
*pSPI_FLG |=FLS2;
*pSPI_CTL = 0x1001|CPHA| CPOL;
*pSPI_CTL = (*pSPI_CTL | SPE);
}

unsigned char spi_byte_rw(unsigned char value)
{
unsigned char incoming=0;
while(!(*pSPI_STAT & SPIF));
*pSPI_TDBR = value;
while(*pSPI_STAT & RXS)
incoming = *pSPI_RDBR;

return(incoming);	

}

int read_x(void)
{
int x_dat = 0;
int temp = 0;
delay(0xff);
*pSPI_FLG &= ~FLG2;
delay(0xff);
spi_byte_rw(0x90);
delay(0xff);
spi_byte_rw(0x00);
x_dat = (spi_byte_rw(0x00)&0xff)<<1;
temp = (spi_byte_rw(0x00)&0xff)<<1;
x_dat = (x_dat<<8)|temp;
x_dat >>=4;
*pSPI_FLG |= FLG2;
delay(0xff);

return x_dat;

}

int read_y(void)
{
int y_dat = 0;
int temp = 0;
delay(0xff);
*pSPI_FLG &= ~FLG2;
delay(0xff);
spi_byte_rw(0xd4);
delay(0xff);
spi_byte_rw(0x00);
y_dat = (spi_byte_rw(0x00)&0xff)<<1;
temp = (spi_byte_rw(0x00)&0xff)<<1;
y_dat = (y_dat<<8)|temp;
y_dat>>=4;
*pSPI_FLG |= FLG2;
delay(0xff);

return y_dat;	

}

cpu.c

#include
#include
EX_INTERRUPT_HANDLER(FlagA_ISR);
/**********************************************************************************

  • 名称 :Set_PLL
  • 功能 :初始化内核时钟和系统时钟
  • 入口参数 :pmsel pssel 设置参数
  • 出口参数 :无
    ***********/
    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;”);
    }
    }
    /
  • 名称 :Setup_Flags
  • 功能 :初始化PF口
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void Setup_Flags(void)
    {
    *pFIO_INEN = 0x0020;
    *pFIO_DIR = 0x001f;
    *pFIO_EDGE = 0x0000;
    *pFIO_MASKA_S = 0x0020;
    *pFIO_POLAR = 0x0020;
    }

/****************************************************************************

  • 名称 :Init_EBIU
  • 功能 :初始化并允许异步BANK存储器工作
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

/****************************************************************************

  • 名称 :Init_SDRAM
  • 功能 :初始化SDRAM
  • 入口参数 :无
  • 出口参数 :无
    ****************************************************************************/
    void Init_SDRAM(void)
    {
    *pEBIU_SDRRC = 0x00000817;
    *pEBIU_SDBCTL = 0x00000013;
    *pEBIU_SDGCTL = 0x0091998d;
    ssync();
    }

void Init_Flags(void)
{
*pFIO_INEN = 0x0001;
*pFIO_DIR = 0x0000;
*pFIO_EDGE = 0x0001;
*pFIO_POLAR = 0x0001;
*pFIO_MASKA_D = 0x0001;
}

void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xffffffff;
*pSIC_IAR2 = 0xffff5fff;

register_handler(ik_ivg12, FlagA_ISR);		
*pSIC_IMASK = 0x00080000;

}

/****************************************************************************

  • 名称 : delay
  • 功能 : 延时函数
  • 入口参数 :无
  • 返回值 :无
    ****************************************************************************/
    void delay(unsigned int tem)
    {
    int i;
    for(i=0;i asm(“nop;”);
    }

main.c

#include
#include
#include
#include “cpld.h”

EX_INTERRUPT_HANDLER(FlagA_ISR)
{
unsigned char interrupt=0;
int tem_x = 0,tem_y=0;

interrupt = (~*pINTERRUPT_DAT&0x3f)&0x02;	

if(interrupt == 0x02)
{
	tem_x = read_x();
	tem_y = read_y();
	if(tem_x!=0xfff)
		printf("x is %x\n",tem_x);

	if(tem_y!=0)
		printf("y is %x\n",tem_y);	
}	
*pFIO_FLAG_C = 0x0001;	

}

void main(void)
{
Set_PLL(16,4);
Init_EBIU();
Interrupt_Enable();
Touch_Enable();

Init_Flags();
SPIinit();
Init_Interrupts();
printf("Please press the touch screen!\n"); 

while(1);

}

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