第三章 系统软件设计
图3.5 测量关系
图3.6 笔中断请求
ADS7846通过笔中断请求向MCU表示有触摸发生。如图图3.6所示,当没有触摸时,
MOSFET①和 ②打开、③关闭,则笔中断输出引脚通过外加的上拉电阻输出为高。当有触摸时,①和③打开、②关闭,则笔中断输出引脚通过③内部连接到地而输为低,从而向MCU发中断请求。MCU通过中断获取是否有按键按下,在得到中断以后读取ADS7846的数据,得到X,Y的坐标值。此时的坐标是在触摸屏上的绝对坐标(0~4096),并不是对应到LCD上的实际坐标(0~320)。所以要把绝对坐标变换为实际坐标,这就需要校正了。 校正原理
我们传统的鼠标是一种相对定位系统,只和前一次鼠标的位置坐标有关。而触摸屏则是一种绝对坐标系统,要选哪就直接点哪,与相对定位系统有着本质的区别。绝对坐标系统的特点是每一次定位坐标与上一次定位坐标没有关系,每次触摸的数据通过校准转为屏幕上的坐标,不管在什么情况下,触摸屏这套坐标在同一点的输出数据是稳定的。不过由于技术原理的原因,并不能保证同一点触摸每一次采样数据相同,不能保证绝对坐标定位,点不准,这就是触摸屏最怕出现的问题:漂移。对于性能质量好的触摸屏来说,漂移的情况出现并不是很严重。所以很多应用触摸屏的系统启动后,进入应用程序前,先要执行校准程序。 通常应用程序中使用的LCD坐标是以像素为单位的。比如说:左上角的坐标是一组非0的数值,比如(20,20),而右下角的坐标为(220,260)。
31
华南理工大学学士学位论文
这些点的坐标都是以像素为单位的,而从触摸屏中读出的是点的物理坐标,其坐标轴
的方向、XY值的比例因子、偏移量、缩放因子都与LCD坐标不同,所以,可以在获取坐标的时候要首先把物理坐标转换为像素坐标,然后再赋给POS结构,达到坐标转换的目的。 触摸屏校正思路
我们从触摸屏上采集到了4个角的物理坐标,假设是2.4英寸屏,240X320分辨率,则它们的像素坐标分别是(20,20)、(20,300)、(220,20)和(220,300)。这样,使用待定系数法就可以算出坐标系之间的平移关系。比如: Vx = xFactor*Px + xOffset。 Vy = yFactor*Py + yOffset 。那么,在读取触摸屏坐标的特定函数中就可以按照这个变换关系把物理坐标转换为像素坐标赋给POS结构了。 因此,应用程序中首先弹出一个有若干点的界面,然后让用户去点,一般采用了触摸屏四个角的四个点。根据像素坐标和物理坐标计算参数,并保存到一个文件中。那么以后只要这个文件的内容有效则不必再经历屏幕校准的过程。
根据以上原理就可以写出触摸屏的驱动和校准程序了,本系统的触摸屏坐标校准采用4点校准,具体算法同上,在void touch_adjust(void)函数中实现。ADS7843的初始化在void touch_init(void)函数里面实现,该函数能自动检测是否需要校准,还包括了对实时时钟中断的配置。其他触摸屏控制的函数均在touch.c文件里面。具体请看附件。
3.2.3 SD卡模块驱动程序设计
SD卡有两个可选的通讯协议:SD模式和SPI模式。SD模式是SD卡标准的读写方式,
但是在选用SD模式时,往往需要选择带有SD卡控制器接口的MCU,或者必须加入额外的SD卡控制单元以支持SD卡的读写。然而,STM32F103RBT6没有集成SD卡控制器接口,但是却拥有很强大的SPI接口,故选用SPI模式读取SD卡。
SD卡在上电初期自动进入SD总线模式,在此模式下向SD卡发送复位命令CMD0。如果SD卡在接收复位命令过程中CS低电平有效,则进入SPI模式,否则工作在SD总线模式。
SD卡初始化过程如图3.7 所示,具体的实现是通过u8 SD_Init(void)函数实现的,该函数还包括对MCU的SPI2的初始化。详细说明见附件。
32
第三章 系统软件设计
上电延时等待上电完成发送>74个脉冲发送复位命令CMD0发送CMD8,获取SD版本对不同版本,分别初始化
结束
图3.7 SD卡初始化
完成SD卡的初始化之后即可进行它的读写操作。SD卡的读写操作都是通过发送SD卡命令完成的。SPI总线模式支持单块(CMD24)和多块(CMD25)写操作,多块操作是指从指定位置开始写下去,直到SD卡收到一个停止命令CMD12才停止。单块写操作的数据块长度只能是512字节。单块写入时,命令为CMD24,当应答为0时说明可以写入数据,大小为512字节。SD卡对每个发送给自己的数据块都通过一个应答命令确认,它为1个字节长,当低5位为00101时,表明数据块被正确写入SD卡。
在需要读取SD卡中数据的时候,读SD卡的命令字为CMD17,接收正确的第一个响应命令字节为0xFE,随后是512个字节的用户数据块,最后为2个字节的CRC验证码。这些操作的实现代码包括SD初始化的代码都在MMC_SD.c里面。
3.2.4 VS1003模块驱动程序设计
VS1003也是采用SPI模式,不过是挂在SPI1上面,这里主要介绍VS1003的初始化操
作。在对MCU相关IO口正确配置之后就可以对VS1003模块进行初始化了。VS1003通过7根线与MCU通信: XRST、XDCS、XCS、DREQ、SCK、SO、SI。 XRST:VS1003复位线,低电平有效。 XDCS:数据片选信号,低电平有效。 XCS:命令片选信号,低电平有效。 DREQ:数据请求,输入总线。
33
华南理工大学学士学位论文
SCK、SI、SO:SPI接口线。
VS1003与MCU的通讯都是通过SPI总线来完成的,在默认情况下,数据将在SCLK的上升沿有效(被读入VS1003),一次需要在SCLK的下降沿更新数据,并且字节发送以MSB在先。注意VS1003的最大写入和读出时钟分别是CLKI/4和CLKI/6(CLKI为VS1003内部时钟)。
VS1003模块初始化步骤:
? 硬复位,XRST =0;
? 延时,XDCS、XCS、XRST置1; ? 等待DREQ为高;
? 软件复位:SPI_MODE=0X0804; ? 等待DREQ为高(软件复位结束);
? 设置VS1003的时钟:SCI_CLOCKF=0X9800,3倍频;
? 设置VS1003的采样率:SPI_AUDATA=0XBB81,采样率48K,立体声; ? 设置重音:SPI_BASS=0X0055; ? 设置音量:SCI_VOL=0X2020;
? 向VS1003发送四个字节无效数据,启动SPI发送;
VS1003的初始化在VS1003x.c里面,通过void Vs1003_Init(void)函数实现,该文件里面还包括其他相关的VS1003操作函数,具体见附件。
3.2.5 PT2314模块驱动程序设计
PT2314采用IIC总线和MCU通信,IIC总线应用很多,这里就不在介绍。PT2314的
控制寄存器如图3.8所示,
图3.8 PT2314控制寄存器
MCU通过IIC总线写入相关的数据,就可以对音量等音效进行设置了。高2~4位用来表示此次操作是对具体哪个功能经行操作,PT2314的器件地址为:0X88,在执行PT2314的操作时,需要注意。PT2314的操作函数均在PT2314.c文件里面,具体请看附件。
34
第三章 系统软件设计
3.2.6 FM24C16模块驱动程序设计
FM24C16也是采用IIC总线和MCU通信,通过标准的IIC操作,很容易实现对FM24C16
的读写。FM24C16的器件地址与页地址是连在一起的,这里需要注意。FM24C16的高四位为固定的1010,而第四位用来表示页地址0~7,每页拥有256个字节,这样FM24C16的总大小为2048字节。
对FM24C16的读操作,先写入0XAx(x:0~7),再写入要写入的地址,紧跟着就可以写入数据了。而对于FM24C16的读操作,则稍微复杂一点在执行写操作的上述过程之后,再写入0XAx+1,代表执行读操作,紧接着就可以读数据了。FM24C16的相关操作函数均在fm24c16.c里面,见附件。
3.2.7 TEA5767模块驱动程序设计
TEA5767收音机模块支持IIC和三线模式,这里我们使用IIC来控制。TEA5767的器TEA5767写操作: ? 发送IIC起始信号 ? 发送器件地址0XC0 ? 等待应答
? 发送一个字节,等待应答,再发送一个字节,等待应答,循环5次 ? 发送IIC停止信号
TEA5767的读操作与写操作基本相同,只是IIC开始之后写入0XC1,将发送一个字节改为接收一个字节就可以了。关于TEA5767的其他操作函数均在TEA5767.c里面,见附件。
件地址是0XC0,在对TEA5767的读操作通过写入0XC1来执行。
3.2.8 温度传感器驱动程序设计
温度传感器采用一线数字温度传感器DS18B20,读取DS18B20的温度读取操作过程如? 复位DS18B20 ? 检查DS18B20
? 发送0XCC(跳过64bitROM地址) ? 发送0X44启动一次转换 ? 复位DS18B20 ? 检查DS18B20
? 发送0XCC(跳过64bitROM地址) ? 发送0XBE(读暂存寄存器)
35
下: