已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
SD 卡 Secure Digital Memory Card 中文翻译为安全数码卡 是一种基于半导体快闪记 忆器的新一代记忆设备 它被广泛地于便携式装置上使用 例如数码相机 个人数码助理 PDA 和多媒体播放器等 SD 卡由日本松下 东芝及美国 SanDisk 公司于 1999 年 8 月共 同开发研制 大小犹如一张邮票的 SD 记忆卡 重量只有 2 克 但却拥有高记忆容量 快 速数据传输率 极大的移动灵活性以及很好的安全性 贴程序 1 本程序主要为了实现以下功能 1 通过对 SPI 方式对 SD 卡进行读与写 2 简单的 FAT 操作 3 对写入的数据进行打印 2 编写日期 09 10 13 3 版本号 V1 0 4 作者 andyluo include 添加头文件 define uchar unsigned char 宏定义数据类型 define uint unsigned int 与指示灯有关的 IO sbit power P0 4 与 SD 卡通信有关的 IO sbit SCL P1 5 时钟信号 sbit CS P1 6 片选信号 sbit SI P1 7 数据输入 sbit SO P3 3 数据输出 错误码定义 define INIT CMD0 ERROR 0X01 define INIT CMD1 ERROR 0X02 define WRITE BLOCK ERROR 0X03 define READ BLOCK ERROR 0X04 与通信和定时器相关的变量 uchar cn 0 变量定义 uchar is init 用于控制 SPI 的速度 通过为 1 与 0 进行选择 uchar xdata pbuf 512 定义 512 个数据缓冲区 函数名称 delay 函数作用 用于某些程序中的延时 函数特点 无返回值 带入口参数 void delay uint k uint m n for m 0 m 5 m for n 0 n k n SPI 写一个字节 void spi write uchar x SPI 写一个字节 其中 is init 为 1 uchar i for i 0 i 8 i SI x i SCL 0 if is init delay 8 SCL 1 if is init delay 8 SPI 读一个字节 uchar spi read uchar temp 0 i SO 1 for i 0 i i temp temp 1 uchar SO SCL 1 if is init 放慢速度 delay 8 return temp 向 SD 卡写命令 uchar write cmd uchar pcmd pcmd 为命令字 uchar temp i time 0 CS 1 spi write 0XFF CS 0 for i 0 i 6 i 发送 6 个字节的命令字节序列 spi write pcmd spi read do temp spi read 一直读 直到读到的不是 0XFF 或者超时 time while temp 0 xff return temp SD 卡复位 进入 SPI 模式 使用 CMD0 命令 uchar SD Reset SD 卡复位 uchar time temp i uchar pcmd 0 x40 0 x00 0 x00 0 x00 0 x00 0 x95 0 号命令对应的 6 个字节 is init 1 set is init flag CS 1 for i 0 i 0 x0f i 初始化时 首先要发送至少 74 个时钟信号 这是必须的 spi write 0 xff 实质发了 120 个时钟 15 8 CS 0 time 0 do temp write cmd pcmd time if time 200 return INIT CMD0 ERROR cmd0 写入失败 while temp 0 x01 CS 1 spi write 0 xff 按照 SD 的操作时序在这里需要补 8 个时钟 return 0 返回 0 说明 SD 卡复位操作成功 SD 卡初始化 使用 CMD1 号命令 uchar SD Init SD 卡初始化 使用 CMD1 号命令 uchar time temp uchar pcmd 0 x41 0 x00 0 x00 0 x00 0 x00 0 xff CS 0 time 0 do temp write cmd pcmd time if time 100 return INIT CMD1 ERROR while temp 0 x00 is init 0 初始化完成 将 is init 设置为 0 以提高后面数据的传输速度 CS 1 spi write 0 xff return 0 说明初始化成功 向 SD 卡扇区中写数据 每一个扇区中有 512 个字节 uchar SD write sector unsigned long addr uchar Buffer uchar temp time uint i uchar pcmd 0 x58 0 x00 0 x00 0 x00 0 x00 0 xff 向 SD 卡中写入 24 号命令 addr addr 24 将字节地址写入到 24 号命令的时序中 pcmd 2 addr pcmd 3 addr SD 卡最大容量 4G pcmd 4 addr 此行为增加项 CS 0 time 0 do temp write cmd pcmd time if time 100 return temp 命令写入失败 while temp 0 for i 0 i 100 i 这里要插入若干个时钟信号 spi read spi write 0 xfe 写入开始字节 0XFE 后面就要写入 512 个字节 for i 0 i 512 i 将缓冲区中要写入的 512 个字节写入到 SD 卡中 spi write Buffer spi write 0 xff spi write 0 xff 两个字节 CRC 校验码 temp spi read 读取返回值 if temp return WRITE BLOCK ERROR 写块数据失败 while spi read 0 xff 等待 SD 卡不忙 数据被接收以后 SD 卡要将这些数据写 入自身的 FLASH 中 需要一定时间 忙时为 0 x00 不忙是为 0 xff CS 1 spi write 0 xff 补 8 个时钟 return 0 读 SD 卡的一个扇区 uchar SD read sector unsigned long addr uchar Buffer uint i uchar time temp uchar pcmd 0 x51 0 x00 0 x00 0 x00 0 x00 0 xff CMD17 号命令 addr addr 24 pcmd 2 addr pcmd 3 addr CS 0 time 0 do temp write cmd pcmd time if time 100 return READ BLOCK ERROR 读块失败 while temp 0 while spi read 0 xfe 一直读 当读到 0 xfe 时 说明后面是 512 个数据字节 for i 0 i 512 i Buffer i spi read spi read spi read CS 1 spi write 0 xff 补 8 个时钟 return 0 串口初始化 void serial init void TMOD 0 x21 使用定时器 1 工作在方式 2 做波率发生器 定时器 0 方式 1 TH0 0X3c 设置定时初值 定时 20ms 1s 采用 20 50 算法 TL0 0Xb0 ET0 1 开定时器 0 中断标志 TR0 1 启动定时器 0 TH1 0 xfd 32M 9600 TL1 0 xfd TR1 1 启动定时器 1 SCON 0X40 串口工作在方式 1 不允许接收 REN 1 允许串口接收 ES 1 允许串口中断 EA 1 开总中断 函数名称 main 函数作用 主函数 void main int i 0 SD Reset SD Init serial init for i 0 i 512 i pbuf i i 向缓冲区中写入数据 SD write sector 80 pbuf 将缓冲区中 512 个字节的数据写入 80 扇区 for i 0 i 512 i pbuf i 0 清空数据缓冲区 SD read sector 80 pbuf 从 SD 卡的第 80 个扇区中读取 512 个字节的数据 for i 0 i 512 i P2 pbuf i 将缓冲区中的数据输出在 P2 口 delay 1000 P2 0X00 while 1 void timer0 int void interrupt 1 中断程序 注意中断类型号 TH0 0X3c 重新赋初值 并且必须要这样做 不然的话定时时间会不准确的 TL0 0Xb0 cn 每当进入中断程序 count 当有关参数设置正确后 程序会自动进入中断 程序 if cn 20 cn 0 power power 本机运行指示灯闪烁 2009 10 17 09 26 21 资料 邮 件 回复 引用回复 编 辑 删除 程序还不够完善 等会改好后上完整版 1 楼 andyluo 324 积分 123 派别 等级 来自 2009 10 17 09 38 15 资料 邮件 回复 引用回复 编辑 删除 2 楼 andyluo 324 积分 123 派别 等级 来自 每进入一个函数都有相关的打印信息 这样可以有利于查程序那里有问题 1 本程序主要为了实现以下功能 1 通过对 SPI 方式对 SD 卡进行读与写 2 简单的 FAT 操作 3 对写入的数据进行打印 2 编写日期 09 10 13 3 版本号 V1 0 4 作者 andyluo include 添加头文件 include include include include define uchar unsigned char 宏定义数据类型 define uint unsigned int 与指示灯有关的 IO sbit power P0 4 与 SD 卡通信有关的 IO sbit SCL P1 5 时钟信号 sbit CS P1 6 片选信号 sbit SI P1 7 数据输入 sbit SO P3 3 数据输出 错误码定义 define INIT CMD0 ERROR 0X01 define INIT CMD1 ERROR 0X02 define WRITE BLOCK ERROR 0X03 define READ BLOCK ERROR 0X04 与通信和定时器相关的变量 uchar cn 0 变量定义 uchar is init 用于控制 SPI 的速度 通过为 1 与 0 进行选择 uchar xdata pbuf 512 定义 512 个数据缓冲区 函数名称 delay 函数作用 用于某些程序中的延时 函数特点 无返回值 带入口参数 void delay uint k uint m n for m 0 m 5 m for n 0 n k n 函数名称 IO init 函数作用 对相关 IO 进行初始化 函数特点 无返回值 无入口参数 void IO init SCL 1 CS 1 SO 1 power 1 函数名称 send byte uchar i 函数作用 对相关数据进行打印 函数特点 无返回值 带入口参数 void send byte uchar i TI 0 SBUF i while TI TI 0 函数名 send s 功能 用户函数 发送一个字符 void send s char s int len strlen s int i for i 0 i len i send byte s i send byte 0 x0d send byte 0 x0a SPI 写一个字节 void spi write uchar x SPI 写一个字节 其中 is init 为 1 uchar i for i 0 i 8 i SI x i SCL 0 if is init delay 8 SCL 1 if is init delay 8 SPI 读一个字节 uchar spi read uchar temp 0 i SO 1 for i 0 i i temp temp 1 uchar SO SCL 1 if is init 放慢速度 delay 8 return temp 向 SD 卡写命令 uchar write cmd uchar pcmd pcmd 为命令字 uchar temp i time 0 CS 1 spi write 0XFF CS 0 for i 0 i 6 i 发送 6 个字节的命令字节序列 spi write pcmd spi read do temp spi read 一直读 直到读到的不是 0XFF 或者超时 time while temp 0 xff return temp SD 卡复位 进入 SPI 模式 使用 CMD0 命令 uchar SD Reset SD 卡复位 uchar time temp i uchar pcmd 0 x40 0 x00 0 x00 0 x00 0 x00 0 x95 0 号命令对应的 6 个字节 send s SD Reset start n is init 1 set is init flag CS 1 for i 0 i 0 x0f i 初始化时 首先要发送至少 74 个时钟信号 这是必须的 spi write 0 xff 实质发了 120 个时钟 15 8 send s send 120 clk succeed n CS 0 time 0 do temp write cmd pcmd time if time 200 return INIT CMD0 ERROR cmd0 写入失败 send s send CMD0 ERROR n while temp 0 x01 CS 1 spi write 0 xff 按照 SD 的操作时序在这里需要补 8 个时钟 send s send CMD0 succeed n return 0 返回 0 说明 SD 卡复位操作成功 SD 卡初始化 使用 CMD1 号命令 uchar SD Init SD 卡初始化 使用 CMD1 号命令 uchar time temp uchar pcmd 0 x41 0 x00 0 x00 0 x00 0 x00 0 xff send s SD Init start n CS 0 time 0 do temp write cmd pcmd time if time 100 return INIT CMD1 ERROR send s CMD1 ERROR n while temp 0 x00 is init 0 初始化完成 将 is init 设置为 0 以提高后面数据的传输速度 send s send CMD1 succeed n CS 1 spi write 0 xff send s SD Init succeed n return 0 说明初始化成功 向 SD 卡扇区中写数据 每一个扇区中有 512 个字节 uchar SD write sector unsigned long addr uchar Buffer uchar temp time uint i uchar pcmd 0 x58 0 x00 0 x00 0 x00 0 x00 0 xff 向 SD 卡中写入 24 号命令 addr addr 24 将字节地址写入到 24 号命令的时序中 pcmd 2 addr pcmd 3 addr SD 卡最大容量 4G pcmd 4 addr 此行为增加项 send s SD write sector start n CS 0 time 0 do temp write cmd pcmd time if time 100 return temp 命令写入失败 while temp 0 for i 0 i 100 i 这里要插入若干个时钟信号 spi read spi write 0 xfe 写入开始字节 0XFE 后面就要写入 512 个字节 for i 0 i 512 i 将缓冲区中要写入的 512 个字节写入到 SD 卡中 spi write Buffer spi write 0 xff spi write 0 xff 两个字节 CRC 校验码 temp spi read 读取返回值 if temp return WRITE BLOCK ERROR 写块数据失败 while spi read 0 xff 等待 SD 卡不忙 数据被接收以后 SD 卡要将这些数据写 入自身的 FLASH 中 需要一定时间 忙时为 0 x00 不忙是为 0 xff send s SD write sector succeed n CS 1 spi write 0 xff 补 8 个时钟 return 0 读 SD 卡的一个扇区 uchar SD read sector unsigned long addr uchar Buffer uint i uchar time temp uchar pcmd 0 x51 0 x00 0 x00 0 x00 0 x00 0 xff CMD17 号命令 addr addr 24 pcmd 2 addr pcmd 3 addr send s SD read sector start n CS 0 time 0 do temp write cmd pcmd time if time 100 return READ BLOCK ERROR 读块失败 while temp 0 while spi read 0 xfe 一直读 当读到 0 xfe 时 说明后面是 512 个数据字节 for i 0 i 512 i Buffer i spi read spi read spi read CS 1 send s SD read se
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工艺生产装配题目与答案
- 人才培养练习题及参考答案
- 2025-2026学年昭通市永善县四下数学期中统考模拟试题含答案
- 2025-2026学年成都市龙泉驿区数学四下期末模拟试题(含答案)
- 商学法练习题与答案整合
- 商场保洁员笔试题目及答案
- 小学生绪论测试题及答案
- 个人述职报告和个人总结2026(3篇)
- 银行员工反诈测评试题及答案详情
- 课后托管招聘面试题目及参考答案
- 城市轨道交通站务员岗前能力评估考核试卷含答案
- 2026年辅警结构化面试经典题及答案
- 昆明市2025-2026学年数学三年级下学期期末综合测试试题(含答案解析)
- 工程监理工作重难点分析及其应对措施
- 医疗器械使用知情同意书范本
- 建设工程施工现场扬尘治理技术规范与实践指南
- 2026年房地产经纪人《房地产交易制度政策》考试真题(后附答案解析)
- 220kV线路挖孔桩施工方案
- 施工现场设备、设施管理制度
- 警用无人机反制设备研发师岗位招聘考试试卷及答案
- 家纺销售培训课件
评论
0/150
提交评论