当前位置:首页 >> 兵器/核科学 >>

SD卡在智能车调试系统中的应用

SD 卡在智能车调试系统中的应用 【摘要】本文介绍了如何利用 SD 卡实时记录摄像头智能车高速运行下单片 机处理的图像与各个参数,以及如何在 PC 端建立 SD 卡上位机把所记录的参数 信息还原出来。 【关键词】SD 卡;智能车;上位机 1.引言 SD 卡(Secure Digital Memory Card)是一种基于半导体快闪记忆器的新一 代记忆设备。SD 卡由日本松下、东芝及美国 SanDisk 公司于 1999 年 8 月共同开 发研制,具有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全 性及兼容 MMC 卡等特点。它的出现提供了一个便宜的、结实的、卡片式的存储 媒介, 它的容量从 16MB 到 32GB 不等, 可为众多应用提供足够的外部存储空间。 如今“飞思卡尔”杯全国大学生智能汽车竞赛已经有七年的历史,更快、更稳 一直是竞赛的主题,而要智能车变得更快、更稳,一个好的调试系统是必不可缺 的, 现阶段普遍应用的调试手段有 BDM、 串口、 蓝牙与 NRF 系列无线收发模块, 然而这四种方式都有着很大的局限性,先不论 BDM 与串口传输需要有线连接的 问题, 这四种调试手段的传输速度皆不能在不影响智能车稳定运行情况下实时记 录 MCU 内部处理的数据。相对以上四种调试手段,SD 卡有明显的传输优势。 首先它体积小、容量大、便于安装与拆卸,只需要一个简单的硬件电路即可实现 SD 卡插槽与单片机的连接,理论最大传输速率为 25Mbit/s(单线) 。再借助上位 机把存储在 SD 卡扇区里的数据在 PC 端还原出来, 这就方便了数据的离线分析。 2.SD 卡数据的写入 2.1 SD 卡与单片机的连接 SD 卡有两种总线模式——SD 模式与 SPI 模式。SD 模式可以采用四根数据 线(DAT0-DAT3)进行数据传输,SPI 模式只能采用单数据线(DAT0)进行数 据传输,SD 卡在上电初期,通过检测引脚 1(DAT3)来识别使用 SD 模式还是 SPI 模式。当 1 脚接 50kΩ 上拉电阻时,卡进入 SD 模式;当 1 脚为低电平,卡 则工作于 SPI 模式。 SPI 模式相对于 SD 模式传输速度慢了一些, 不过理论上是可以达到 25M/S, 在智能车调试领域里是可以满足我们的传输要求的。由于主控芯片飞思卡尔 MC9S12XS128 自带有 SPI 模式,故 SD 卡与单片机之间只需要四线连接,分别 是数据输出端 DO、片选端 CS、数据输入端 DI 与时钟端 SCLK,其分别对应 MC9S12XS12 的 PM2、PM3、PM4 与 PM5。如图 1 所示。 2.2 SD 卡的初始化 在进行 SD 卡的读写之前需要对 SD 卡进行初始化,初始化的步骤为: (1)初始化 MC9S12XS128 单片机 SPI 模式为低速状态; (2)发送至少 74 个时钟; (3)循环连续发送 CMD0,直到 SD 卡返回 0x01,进入空闲状态; (4)发送 CM55,应返回 0x01,否则错误返回,得到 0x01 后发 ACMD41, 应得到返回值 0x00,否则重复这一步骤(上限 400 次)直到得到 0x01; (5)设置 SPI 为高速模式; (6)发送 CMD16 设置块大小为 512 字节,这样就实现了 SD 卡的初始化。 接下来就可以实现 SD 卡扇区的读写操作了。 2.3 SD 卡扇区的读写 以单扇区写数据为例: (1)先设置为高速模式; (2)发送 CMD24 命令应得到正确响应 0x00; (3)片选置低并发 3 个空数据,等待 SD 卡准备好; (4)发送起始令牌 0xFE; (5)放入要写入一个扇区中的数据; (6)发 2 个字节 CRC 校验等待操作完成; (7)片选置高。 需要注意的是,Kingston 1G 的 SD 卡第 0 扇区是启动扇区,从 0 扇区开始 写会出现错误, 所以一般要从比较大一点的扇区开始写数据, 笔者是从第 103730 个扇区开始读写的。 3.Visual C++读取 SD 卡扇区数据并写入文件 3.1 Windows 下 C++读取 SD 卡扇区数据 Windows 下可以把所有的硬件设备当成“文件”,并用文件 I/O 函数对其进行 数据存取访问。 以文件句柄方式指定一个包含全路径的文件名后,就可以要求操 作系统打开这个文件并返回一个文件句柄,以后就可以用这个句柄来读写文件, 直到关闭文件为止。 操作系统在内部为每个文件句柄分配一个读写指针,指示文 件读写的位置, 每次对文件的读写操作完成以后,指针会自动调整到本次操作的 最后一个字节后面的位置。 指针也可以被移动到文件的任意位置,以便满足不同 情况存取的要求。 Windows 系统处理文件的一般步骤为: (1)首先利用 CreateFile()函数打开文件,并返回文件句柄; (2)用 SetFilePointer()函数调整文件指针转移到要操作的磁盘扇区处; (3)用 ReadFile()函数从指定位置开始读取文件; (4)最后用 CloseHandle()关闭文件。 用这样的方式就可以读取出 SD 卡扇区内的数据了。 3.2 数据的保存 在 C++读取 SD 卡扇区内数据后需要将其保存在文件里, 其中把图像数组数 据进行二值化转换成字符 0 或 1 以普通文件格式保存, 而各参数数据则以二进制 文件格式保存,保存文件可以用 C++文件流的方式。保存文件的步骤为: (1)创建以 100—999 为文件名,分别以 txt 与 hex 为后缀名的文件,用来 存储每副图像及其对应参数发, 可以采用这样的方法循环创建:设置一字符串变 量 char p[]=“000.txt”,采用 for 循环,先分离出 100—999 的百位、十位、个位数 字分别加上 0x30(目的是转化为字符,例:字符‘1’的 ASCII 码是 49 即为 0x30+0x01)替换掉字符串“000.txt”中前三位字符即可,