版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、豆皮 - STM32开发板入门教程(十三) - SPI模式读写SD卡 (原创)豆皮 - STM32开发板入门教程(十三) - SPI模式读写SD卡 (原创) 版权所有 STMFANS 原创,转载请保留出处 功能介绍 :使用SPI模式 读写SD卡block数据 可通过串口发送到PC机查看 SD卡是Secure Digital Card卡的简称,直译成汉语就是“安全数字卡”,是由日本松下公司、东芝公司和美国SANDISK公司共同开发研制的全新的存储卡产品。SD存储卡是一个完全开放的标准(系统),多用于MP3、数码摄像机、数码相机、电子图书、AV器材等等,尤其是被广泛应用在超薄数码相机上。呵呵 现在
2、偶们做东西也喜欢用sd卡了 为啥? 容量大啊 价格便宜啊 读写次数100000次以上(也有资料说是300000次 呵呵) 这个次数够猛了啊 读写的速度也很快 现在高速的SD卡写速度可以达到20M/S 呵呵 如果你买的SD卡达不到这个速度 就应该考虑一下是不是买到假货了 呵呵 现在SD卡都是白菜价了啊 貌似4G的也就50块钱一个啦 嗯 不扯远了 继续正题 SD卡读写有2种方式 一种是SD模式 一种是SPI模式 SD模式操作时序复杂 使用的IO口也多 呵呵 常用的一般是SPI模式 我们今天介绍的也是SPI模式 接口简单 移植也方便 速度也不慢了啊 使用高速的SPI模式 1M/S应该是很容易达到的
3、刚刚把STM32下的SD卡读写移植好 也没测试读写速度 呵呵 下回有时间把读写速度测试了发上来 呵呵 SD卡初始化过程:1. 初始化STM32的SPI接口 使用低速模式2. 延时至少74clock3. 发送CMD0,需要返回0x01,进入Idle状态4. 循环发送CMD55+ACMD41,直到返回0x00,进入Ready状态5. 设置读写block大小为512byte 5. 把STM32的SPI设置为高速模式读一个block块的过程1. 发送CMD17(单块)或CMD18(多块)读命令,返回0x002. 接收数据开始令牌0xfe + 正式数据512Bytes + CRC 校验2Bytes写一个
4、block块的过程1. 发送CMD24(单块)或CMD25(多块)写命令,返回0x002. 发送数据开始令牌0xfe + 正式数据512Bytes + CRC校验2Bytes附上一个datasheet上的标准 spi mode initialization flow 初始化函数/* Function Name : SD_MMC_SPI_Init* Description : SD_MMC_SPI_Init* Input : None* Output : None* Return : zero init success, non-zero init error*/u8 SD_MMC_SPI_In
5、it(void) GPIO_InitTypeDef GPIO_InitStructure; /* Enable SPI1 and GPIO clocks */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | RCC_APB2Periph_GPIOA | RCC_APB2Periph_SD_MMC_SPI_CS, ENABLE); /* Configure SPI1 pins: SCK, MISO and MOSI */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
6、 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure SD_MMC_SPI_CS */ GPIO_InitStructure.GPIO_Pin = SD_MMC_SPI_CS_Pin_CS; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(SD_MMC_SPI_CS, &a
7、mp;GPIO_InitStructure); / /* initialize SPI with lowest frequency */ SD_MMC_Low_Speed(); /* card needs 74 cycles minimum to start up */ for(u8 i = 0; i < 10; +i) /* wait 8 clock cycles */ SD_MMC_ReadWrite_Byte(0x00); /* address card */ SD_MMC_SPI_SELECT(); /* reset card */ u8 response; for(u16 i
8、= 0; ; +i) response = SD_MMC_Send_Command(CMD_GO_IDLE_STATE , 0 ); if( response = 0x01 ) break; if(i = 0x1ff) SD_MMC_SPI_DESELECT(); return 1; /* wait for card to get ready */ for(u16 i = 0; ; +i) response = SD_MMC_Send_Command(CMD_SEND_OP_COND, 0); if(!(response & (1 << R1_IDLE_STATE) bre
9、ak; if(i = 0x7fff) SD_MMC_SPI_DESELECT(); return 1; /* set block size to 512 bytes */ if(SD_MMC_Send_Command(CMD_SET_BLOCKLEN, 512) SD_MMC_SPI_DESELECT(); return 1; /* deaddress card */ SD_MMC_SPI_DESELECT(); /* switch to highest SPI frequency possible */ SD_MMC_High_Speed(); return 0; 发送一个命令/* Func
10、tion Name : SD_MMC_Send_Command* Description : SD_MMC_Send_Command* Input : None* Output : None* Return : None*/u8 SD_MMC_Send_Command(u8 cmd, u32 arg) u8 Response; u8 Retry = 0; SD_MMC_ReadWrite_Byte(0xff); SD_MMC_SPI_SELECT(); /分别写入命令 SD_MMC_ReadWrite_Byte(cmd | 0x40); SD_MMC_ReadWrite_Byte(arg &g
11、t;> 24); SD_MMC_ReadWrite_Byte(arg >> 16); SD_MMC_ReadWrite_Byte(arg >> 8); SD_MMC_ReadWrite_Byte(arg); SD_MMC_ReadWrite_Byte(0x95); do / 等待响应,响应的开始位为0 Response = SD_MMC_ReadWrite_Byte(0xff); Retry+; while( (Response&0x80)!=0) && (Retry < 200) ); SD_MMC_SPI_DESELECT();
12、return Response; /返回状态值 读一个block块 读取成功返回0 非0 则读取失败/* Function Name : SD_MMC_Read_Single_Block* Description : SD_MMC_Read_Single_Block* Input : sector number and buffer data point* Output : None* Return : zero success, non-zero error*/u8 SD_MMC_Read_Single_Block(u32 sector, u8* buffer) u8 Response; u
13、16 i; u16 Retry = 0; /读命令 send read command Response = SD_MMC_Send_Command(CMD_READ_SINGLE_BLOCK, sector<<9); if(Response != 0x00) return Response; SD_MMC_SPI_SELECT(); / start byte 0xfe while(SD_MMC_ReadWrite_Byte(0xff) != 0xfe) if(+Retry > 0xfffe) SD_MMC_SPI_DESELECT(); return 1; /timeout
14、 for(i = 0; i < 512; +i) /读512个数据 *buffer+ = SD_MMC_ReadWrite_Byte(0xff); SD_MMC_ReadWrite_Byte(0xff); /伪crc SD_MMC_ReadWrite_Byte(0xff); /伪crc SD_MMC_SPI_DESELECT(); SD_MMC_ReadWrite_Byte(0xff); / extra 8 CLK return 0; 写一个block块 成功返回0 非0 则写入失败/* Function Name : SD_MMC_Write_Single_Block* Descrip
15、tion : SD_MMC_Write_Single_Block* Input : sector number and buffer data point* Output : None* Return : zero success, non-zero error.*/u8 SD_MMC_Write_Single_Block(u32 sector, u8* buffer)u8 Response;u16 i;u16 retry=0; /写命令 send write commandResponse = SD_MMC_Send_Command(CMD_WRITE_SINGLE_BLOCK, secto
16、r<<9);if(Response != 0x00) return Response;SD_MMC_SPI_SELECT();SD_MMC_ReadWrite_Byte(0xff);SD_MMC_ReadWrite_Byte(0xff);SD_MMC_ReadWrite_Byte(0xff); /发开始符 start byte 0xfeSD_MMC_ReadWrite_Byte(0xfe); /送512字节数据 send 512 bytes datafor(i=0; i<512; i+) SD_MMC_ReadWrite_Byte(*buffer+);SD_MMC_ReadW
17、rite_Byte(0xff); /dummy crcSD_MMC_ReadWrite_Byte(0xff); /dummy crcResponse = SD_MMC_ReadWrite_Byte(0xff);/等待是否成功 judge if it successfulif( (Response&0x1f) != 0x05) SD_MMC_SPI_DESELECT(); return Response;/等待操作完 wait no busywhile(SD_MMC_ReadWrite_Byte(0xff) != 0x00) if(retry+ > 0xfffe) SD_MMC_SPI_DESELECT(); return 1; SD_MMC_SPI_DESELECT();SD_MMC_ReadWrite_Byte(0xff);/ extra 8 CL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合伙养殖协议书标准范本
- 工程试车与施工合同条款的互动关系
- 版权许可协议范本
- 出租车驾驶员聘用合同2024年
- 信用担保协议书
- 2024汽车运输合同范本简单简单版汽车维修合同范本
- 2024标准委托借款合同范本
- 北京市车辆过户协议
- 昆明短期劳动合同
- 2024年饭庄转让协议书范本
- 车间注塑工艺表
- 公司电动三轮车使用管理规定
- 新部编人教版六年级下册道德与法治全册精品教案(教学设计)
- 《小小的船》课件
- 《太阳出来喜洋洋》 课件
- 《管理会计》课程标准
- 上、下水库工程库岸处理施工方案
- 阀门结构和工作原理(下)
- 安全现场文明施工措施费用清单
- father knows better说课教案教学(课堂PPT)
- 防护栏生命工程监理实施细则全解
评论
0/150
提交评论