一、系统方案介绍
系统总体框图如图1所示。其中,单片机采用凌阳公司的SPCE061A.该单片机内部结构框图如图2所示,相关说明见表1。
图1 系统总体框图
图2 SPCE061A结构
表1 结构图说明
1.系统方案设计
应用SPCE061A读写SD卡,首先要寻找它们之间的通信方案。SD模式是SD卡的标准读写方式,选用此模式需要选择带SD卡控制接口的MCU或者额外的SD卡控制单元;SPI模式通过SPI总线完成SD卡与主控制器的通信。SPCE061A没有集成SD卡控制器,为了减少额外的SD卡控制单元硬件成本,本方案采用SPI模式进行二者之间的通讯。另外,SPCE061A没有集成化的SPI接口模块,因此要用软件进行SPI接口时序的模拟。
SD卡的逻辑电平相当于3.3V的TTL电平标准,而SPCE061A通过跳线的设置完全可以提供该工作电压,因此不需要增加额外的电平匹配电路。
2.湿度传感器选择
鉴于森林中温度和湿度的变化较大,系统中的湿敏电阻选用耐高温高压且特性稳定的MgCr2O4-TiO2陶瓷湿度传感器。
二、系统硬件连接
1.SPCE061A单片机和SD卡的连接
凌阳公司提供专门的SD卡配套模组,因此单片机和SD卡的连接较为方便。
(1) SD卡接口规范。
SD卡工作在2.7~3.6V电压下,其普通SD卡的结构示意图如图3所示,表2列出了各引脚在SPI模式下的定义和功能描述。主机与SD卡之间通过指令来实现交互。
图3 SD卡结构示意图
表2 SPI模式下SD卡引脚定义
(2) 接口电路设计示意图(见图4)。
图4 SD卡与单片机连接示意图。
2.SPCE061A与湿度传感器的连接
(1)湿敏传感器。
大多数湿度传感器A-A端为测量电极,B-B端为加热清洗电极,如图5所示。加热清洗电极通电后, 内部电加热丝产生热量可排除传感器感湿层中的水分子。
图5 湿敏传感器
(2)单片机与传感器连接示意图(见图6)。
图6 单片机和传感器的连接
三、软件设计
1. FAT文件系统
FAT16文件系统的存储结构如图7所示。
图7 FAT文件系统结构
主引导记录区(MBR,Main Boot Record)位于物理磁盘第零扇区。MBR中有硬盘分区记录表DPT(Disk Partition Table),DPT记录了各逻辑分区的相对偏移。SD卡不支持多分区,在一个SD卡中只有一个分区,因此在SD卡上的DPT只有一个分区表项被占用。系统引导记录区(DBR,DOS Boot Record)位于磁盘逻辑分区的第零扇区,是操作系统可以访问的第一个扇区。它其中包含一个称为BPB(Bios ParameterBlock)的本分区参数记录表。BPB记录着本分区的根目录大小、FAT个数、磁盘介质描述、分配单元大小等重要参数。
DBR之后是FAT(File Allocation Table)文件分配记录表,记录文件在磁盘上的存储位置。在Windows系统中,文件存储的单位是簇而不是字节,一个文件并不是连续地存放于磁盘的某一区域,而往往是分成若干段,像链子一样存放。FAT表记录了每个文件的起始簇号、后继簇号和终止簇号。FAT表中的每个表项对应数据存储区中的一个簇,由于FAT表对文件管理的重要性,FAT表有一个备份。
DIR是根目录区,紧接着第二个FAT表(FAT2)之后,记录着根目录下每个文件的起始簇号、大小等属性。操作系统根据DIR中文件的起始簇号和大小,结合FAT表来定位文件。
FAT16 文件系统中一个文件的存储示意图如图8所示。
图8 文件存储示意图
2.SD卡指令规范
单片机通过相应指令与SD卡进行交互,SD卡有特定的指令格式。所有的SD卡指令都是6字节长,最高有效位(MSB)传输优先。SD卡特定指令格式如图9所示。
图9 SD卡指令格式
SD卡指令的最高两位"01"是SD卡指令的开始标志,最后一位"1"是结束标志。6位的指令是SD卡的指令序号,例如CMD17的6位指令即17的二进制表示"010001".指令参数占4个字节,具体内容参照SD卡规范。7位CRC校检的生成多项式为G(x) = x^7 + x^3 + 1.事实上SD卡在进入SPI模式后,SD卡不再通过CRC码来确认指令的传输正确与否,指令中的7为CRC校检只在SD模式下起作用。因此仅是SD卡上电后的第一条切换SPI模式指令CMD0需要校检码,而此校检码是固定的0x95,其他指令的CRC均置"1"即可。
SD卡响应有四种格式,不同指令对应不同响应,具体内容可参看SD卡规范。
3.SD卡读写驱动
(1)SPI时序模拟。
用软件来模拟SPI总线的具体方法是:将SCK的初始状态置"0",允许接收后(即CS置"0")将SCK置"1",这样单片机由DI线输出一位数据到SD卡;接着再将SCK置"0",单片机由DO线从SD卡读到一位数据。至此,模拟1位数据输入输出便完成。此后再将SCK置"1",依次循环8次,完成SPI总线1个字节数据的输入输出。
以下是本系统软件模拟SPI时序的部分C语言代码:
(2)SD卡的初始化。
SD卡的初始化流程图,如图10所示。SD卡上电延时74个时钟周期后,单片机向SD卡发送复位命令CMD0使SD卡进入SPI模式,之后循环发送激活SD卡指令CMD1直到接收到SD卡响应的第0位为"0".
图10 SD卡初始化流程
(3)SD卡数据块的读写。
完成SD卡的初始化后,就可以对SD卡进行读写操作。读写操作都是通过指令来完成的:单块写命令CMD24,多块写命令CMD25;单块读命令CMD17,多块读命令CMD18.单块读写时,数据块的长度为512字节,多块读写时SD卡收到一个停止命令CMD12后停止读写。图11和图12分别是SD卡单块读、写的SPI时序图,图13和图14分别是单块读、写SD卡的软件流程图。
图11 单块读时序图
图12 单块写时序图
图13 读SD卡流程图
图14 FAT16文件读写流程图
4. FAT16 文件读写
按照FAT16 文件系统的文件组织规范,编写读文件函数和写文件函数。FAT16 文件读写的软件流程图如图15 所示。
图15 FAT16 文件读写流程图
5.湿度传感器的软件设计
湿度传感器的测量电极端与SPCE061A 的I/O 口相连,以传输数据,其部分初始化程序如下: