




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
.基于Atmega128单片机SD卡读写程序实物图对照接线图以下是一个简单的测试SD卡读写的程序,程序是基于Atmega128单片机编写的,对于Atmega的其他单片机仅需要做管脚改动就可以使用,其他单片机更改要更大。sd.h/*/SPI各线所占用的端口#define SD_SS PB6 #define SD_SCK PB1#define SD_MOSI PB2#define SD_MISO PB3/*#define SD_DDR DDRB#define SD_PORT PORTB#define SD_PIN PINB#define SD_SS_H SD_PORT |= (1#define SDSS_L SD_PORT &= (1#define SD_SCK_H SD_PORT |= (1#define SD_SCK_L SD_PORT &= (1#define SD_MOSI_H SD_PORT |= (1#define SD_MOSI_L SD_PORT &= (1#define SD_MISO_IN (SD_PIN&(1/-/ 错误号/-#define INIT_CMD0_ERROR 0xFF#define INIT_CMD1_ERROR 0xFE#define WRITE_BLOCK_ERROR 0xFD#define READ_BLOCK_ERROR 0xFC#define TRUE 0x01/- / MMC/SD 命令(命令号从40开始,只列出基本命令,并没有都使用)/-#define SD_RESET 0x40 + 0 #define SD_INIT 0x40 + 1#define SD_READ_CSD 0x40 + 9#define SD_READ_CID 0x40 + 10#define SD_STOP_TRANSMISSION 0x40 + 12#define SD_SEND_STATUS 0x40 + 13#define SD_SET_BLOCKLEN 0x40 + 16#define SD_READ_BLOCK 0x40 + 17#define SD_READ_MULTI_BLOCK 0x40 + 18#define SD_WRITE_BLOCK 0x40 + 24#define SD_WRITE_MULTI_BLOCK 0x40 + 25/片选关(MMC/SD-Card Invalid)#define SD_Disable() SD_SS_H/片选开 (MMC/SD-Card Active)#define SD_Enable() SD_SS_LSD_TEST.C/*/ICC-AVR application builder : 03-5-20 8:39:11/ Target : M128/ Crystal: 3.6864Mhz#include #include #include sd.hvoid uart0_init(void);void putchar(unsigned char content);void putstr(unsigned char *s);void SD_Port_Init(void);unsigned char SD_Init(void);unsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer);unsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer);unsigned char SPI_TransferByte(unsigned char byte);unsigned char Write_Command_SD(unsigned char cmd,unsigned long address);unsigned long SD_find(void);/*/串口调试程序/*void uart0_init(void)UCSR0B = 0x00; /disable while setting baud rateUCSR0A = 0x00;UCSR0C = 0x06; / 00000110 UART0设置为异步模式、无奇偶校验、1位停止位、8位数据位UBRR0L = 0x17; /set baud rate loUBRR0H = 0x00; /set baud rate hi 设置UART0口通信速率9600UCSR0B = 0x18; void putchar(unsigned char content) while(!(UCSR0A & (1 UDRE0); /* 判断上次发送有没有完成 */ UDR0 = content; /* 发送数据 */ void putstr(unsigned char *s) while(*s) putchar(*s); s+; /*/端口初始化void SD_Port_Init(void)/* SD_PORT |= (1 SD_DDR |= (1 SD_DDR &= (1/*/初始化 MMC/SD 卡为SPI模式unsigned char SD_Init(void)/* unsigned char retry,temp; unsigned char i; SPCR=0x53; /设定SPI为128分频,慢速进行初始化 SPSR=0x00; for (i=0;i24); SPI_TransferByte(address16); SPI_TransferByte(address8); SPI_TransferByte(address); SPI_TransferByte(0xFF); SPI_TransferByte(0xFF); do tmp = SPI_TransferByte(0xFF); /发送8个时钟接受最后一个字节 retry+; while(tmp=0xff)&(retry8); return(tmp); /*/写一个扇区(512Byte) to MMC/SD-Card/如果写完成返回TRUEunsigned char SD_write_sector(unsigned long addr,unsigned char *Buffer)/* unsigned char temp; unsigned int i; SPI_TransferByte(0xFF); /延迟8个时钟 SD_Enable(); /开片选 temp = Write_Command_MMC(MMC_WRITE_BLOCK,addr9); /发送写扇区命令 if(temp != 0x00) SD_Disable(); return(temp); SPI_TransferByte(0xFF); SPI_TransferByte(0xFF); SPI_TransferByte(0xFE); for (i=0;i512;i+) SPI_TransferByte(*Buffer+); /发送512字节数据 /CRC-Byte SPI_TransferByte(0xFF); /Dummy CRC SPI_TransferByte(0xFF); /CRC Code temp = SPI_TransferByte(0xFF); /读SD卡运行响应 if(temp & 0x1F)!=0x05) /如果最后4位为0101,为操作成功。否则为操作失败。 SD_Disable(); return(WRITE_BLOCK_ERROR); /返回错误 while (SPI_TransferByte(0xFF) != 0xFF); SD_Disable(); return(TRUE); /返回成功 /*/读512字节 from MMC/SD-Card/如果成功返回TRUEunsigned char SD_read_sector(unsigned long addr,unsigned char *Buffer)/* unsigned char temp; unsigned int i; unsigned char data; SPI_TransferByte(0xff); MMC_Enable(); temp = Write_Command_SD(SD_READ_BLOCK,addr9);/发送读扇区命令 if(temp != 0x00) SD_Disable(); return(READ_BLOCK_ERROR); /返回错误号 while(SPI_TransferByte(0xff) != 0xfe); for(i=0;i512;i+) data = SPI_TransferByte(0xff); /存数据 *Buffer+=data; SPI_TransferByte(0xff); /读CRC码 SPI_TransferByte(0xff); /读CRC码 SD_Disable(); return(TRUE); /返回成功/*/查找数据开始标志(预设DATASTART)根据实际需要删改/*unsigned long SD_find(void) unsigned long tmp=400; unsigned char data512; do SD_read_sector(tmp,data); /从0扇区开始查找 tmp+; /查找DATASTART while(!(data0=D)&(data1=A)&(data2=T)&(data3=A)&(data4=S)&(data5=T)&(data6=A)&(data7=R)&(data8=T); return tmp; /返回开始标志的下一个扇区 /*/发送一个字节/*unsigned char SPI_TransferByte(unsigned char byte)SPDR = byte;while (!(SPSR & 0x80); /检测线路是否空闲 return SPDR;/*/主程序例子/*void main(void) unsigned long temp;unsigned char data512;unsigned char data2512=sssssssssssssssssssssssss;unsigned char comm1=rnhello worldrn;unsigned char comm2=rnSD_INIT OKrn;uart0_init(); SD_Port_Init(); /端口初始化if(SD_Init()= 0x01) /SD卡初始化,并读取返回值putstr(comm2);temp=SD_find(); /查找DATASTART数据开始标志,返回下一扇区地址SD_read_sector(1001,data); /读取temp地址的512字节数据,512字节数据存入data数组putstr(data); SD_write_sector(temp,data2); /将data2数组512字节数据写入temp扇区测试程序很简单,仅仅是做了一下读写SD卡的测试。关于SD卡的几点注意事项:1、无论我们愿意不愿意,SD卡每次读写数据的最小单位是1个扇区,即512个字节。2、SD卡与单片机连接的SPI总线不能太长,要尽量短。这样的好处是速度可以更快,也不容易出错。3、虽然我们并不关心FAT文件表,但是我们仍然要关心SD卡的存储结构,如果我们不想使用PC机来读取保存在SD卡上的数据那我们就不用关心SD存储结构了。但,作为一个大容量的可移动存储设备,不能用PC机来读取是个很大的遗憾,我解决这个遗憾的方法如下:3-1、因为我不了解FAT复杂的结构,所以我做的程序没法去按照FAT表的各项功能来进行创建文件、删除文件、创建目录等等操作。3-2、虽然我们的单片机不能创建文件,但是PC机是可以创建文件的啊!所以我使用PC机将SD卡格式化,之后在SD卡上创建一个大文件,比如我的128M的SD卡上我建立了一个100M的文件。这里需要注意一下,一般使用windows创建文件的功能时是没有办法指定创建文件的大小的,空文件就是0个字节的长度,而我们是需要一个固定长度的文件的,所以我用VC编写了一个小软件,这个软件可以为我创建一个100M长度的空文件,记住,这点很重要:一个固定长度的空文件3-3、虽然我们建立了个文件在SD卡上,可是我们因为不去了解FAT表,所以我们一样不知道这个文件到底位于SD卡的什么地方,不要以为它会在0字节的地方开始,为了找到这个文件的开始位置,我们可以在建立的那个空文件的开头写上几个字符,比如我程序里面写的“DATASTART”,接下来我们要做的就是一个扇区一个扇区的去找这个几个特殊的字符,这是个笨方法,但却是最简单直观的方法。这个方法有两个缺点:a、如果文件建立在整个SD卡的后面,那找到这个文件需要漫长的等待。b、如果碰巧某个文件里面也有我们定义的那个特殊字符串的话,那就乱套了!不过好在我们使用的SD卡一般都是专用的,并不能拿去做其他应用,比如从公司copy点文件回家之类的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 营业厅装修项目施工方案范本
- 企业采购成本控制综合方案
- 申请居住证要租房合同6篇
- 建筑工程项目质量责任制管理方案
- 建筑施工监理合同条款解析及范本
- 网站搜索功能优化方案
- 民俗活动进校园教育方案制度
- IT系统安全审计方案
- 成功推广策略的总结报告
- 骨骼肌肉系统功能规章
- 易能EDS800变频器说明书
- 发育生物学实验教案
- 仁爱版九年级英语上册unit2topic1复习课市公开课一等奖省课获奖课件
- 北京市国内旅游合同书
- 公司品牌建设五年规划
- 第二单元 三国两晋南北朝的民族交融与隋唐统一多民族封建国家的发展 知识清单 高中历史统编版(2019)必修中外历史纲要上册
- 居室环境的清洁与消毒
- GB/T 39766-2021人类生物样本库管理规范
- GB/T 2900.50-2008电工术语发电、输电及配电通用术语
- GB/T 2518-2008连续热镀锌钢板及钢带
- GB/T 1689-2014硫化橡胶耐磨性能的测定(用阿克隆磨耗试验机)
评论
0/150
提交评论