当前位置:首页 > ARM课程设计
淮南师范学院电子工程学院2013级电子信息科学与技术专业《ARM嵌入式系统》课程设计 参考文献
[1]张洋,刘军,严汉宇.原子教你玩STM32(库函数版) [M].北京航空航天大学出版社,2013. [2]邓奕.电子线路CAD实用教程(第2版)[M]. 华中科技大学出版社.2012 [3]刘明福. 基于STM32的SD卡设计[D].江西科技学院.2012
[4]刘同法,肖志刚,彭继卫. ARM Cortex-M3内核微控制器快速入门与应用.[M]北京航空航天大学出版社.2009
[5] Cortex-M3 技术参考手册.pdf [6]STM32不完全手册_库函数版本_V3.1.pdf [7]STM32固件库使用手册的中文翻译版.pdf [8]protel99se不完全使用手册.pdf
[9]喻金钱、喻斌.STM32F系列ARM Cortex-M3核微控制器开发与应用[M].清华大学出版社. [10] 百度百科SD卡
http://baike.http://m.njliaohua.com//link?url=DgRftLuAiKBwz2Lmng4lZQB5AcOXDAlk_kP1A3oXGBBxXeT3CGhtCez1GEkyR45NosBOeacPnIbVwKhzAqeECa
附录:
#include \
#include \sd.h\#include \#include \
u8 SD_Type=0;//SD卡的类型
////////////////////////////////////移植修改区/////////////////////////////////// //移植时候的接口 //data:要写入的数据 //返回值:读到的数据
u8 SD_SPI_ReadWriteByte(u8 data) { return SPI1_ReadWriteByte(data); }
//SD卡初始化的时候,需要低速 void SD_SPI_SpeedLow(void) {
SPI1_SetSpeed(SPI_BaudRatePrescaler_256);//设置到低速模式 }
//SD卡正常工作的时候,可以高速了 void SD_SPI_SpeedHigh(void) {
SPI1_SetSpeed(SPI_BaudRatePrescaler_2);//设置到高速模式
- 8 -
淮南师范学院电子工程学院2013级电子信息科学与技术专业《ARM嵌入式系统》课程设计 }
//SPI硬件层初始化 void SD_SPI_Init(void) {
//设置硬件上与SD卡相关联的控制引脚输出 //禁止其他外设(NRF/W25Q64)对SD卡产生影响 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); //PORTA时钟使能
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;//PA2.3.4 n_3|GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA,GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);//PA2.3.4上拉
SPI1_Init(); SD_CS=1; }
//取消选择,释放SPI总线 void SD_DisSelect(void) { SD_CS=1;
SD_SPI_ReadWriteByte(0xff);//提供额外的8个时钟 }
//选择sd卡,并且等待卡准备OK //返回值:0,成功;1,失败; u8 SD_Select(void) { SD_CS=0; if(SD_WaitReady()==0)return 0;//等待成功 SD_DisSelect(); return 1;//等待失败 }
//等待卡准备好
//返回值:0,准备好了;其他,错误代码 u8 SD_WaitReady(void) { u32 t=0; do { if(SD_SPI_ReadWriteByte(0XFF)==0XFF)return 0;//OK t++;
- 9 -
推挽
淮南师范学院电子工程学院2013级电子信息科学与技术专业《ARM嵌入式系统》课程设计 }while(t<0XFFFFFF);//等待 return 1; }
//等待SD卡回应
//Response:要得到的回应值 //返回值:0,成功得到了该回应值 // 其他,得到回应值失败
u8 SD_GetResponse(u8 Response) { u16 Count=0xFFFF;//等待次数 while ((SD_SPI_ReadWriteByte(0XFF)!=Response)&&Count)Count--;//等待得到准确的回应 if (Count==0)return MSD_RESPONSE_FAILURE;//得到回应失败 else return MSD_RESPONSE_NO_ERROR;//正确回应 }
//从sd卡读取一个数据包的内容 //buf:数据缓存区
//len:要读取的数据长度. //返回值:0,成功;其他,失败; u8 SD_RecvData(u8*buf,u16 len) { if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE while(len--)//开始接收数据 {
*buf=SPI1_ReadWriteByte(0xFF); buf++; }
//下面是2个伪CRC(dummy CRC) SD_SPI_ReadWriteByte(0xFF); SD_SPI_ReadWriteByte(0xFF);
return 0;//读取成功 }
//向sd卡写入一个数据包的内容 512字节 //buf:数据缓存区 //cmd:指令
//返回值:0,成功;其他,失败;
u8 SD_SendBlock(u8*buf,u8 cmd) { u16 t; if(SD_WaitReady())return 1;//等待准备失效 SD_SPI_ReadWriteByte(cmd); if(cmd!=0XFD)//不是结束指令 {
- 10 -
淮南师范学院电子工程学院2013级电子信息科学与技术专业《ARM嵌入式系统》课程设计 for(t=0;t<512;t++)SPI1_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间 SD_SPI_ReadWriteByte(0xFF);//忽略crc SD_SPI_ReadWriteByte(0xFF); t=SD_SPI_ReadWriteByte(0xFF);//接收响应 if((t&0x1F)!=0x05)return 2;//响应错误 }
return 0;//写入成功 }
//向SD卡发送一个命令 //输入: u8 cmd 命令 // u32 arg 命令参数 // u8 crc crc校验值 //返回值:SD卡返回的响应 u8 SD_SendCmd(u8 cmd, u32 arg, u8 crc) {
u8 r1; u8 Retry=0; SD_DisSelect();//取消上次片选 if(SD_Select())return 0XFF;//片选失效 //发送
SD_SPI_ReadWriteByte(cmd | 0x40);//分别写入命令 SD_SPI_ReadWriteByte(arg >> 24); SD_SPI_ReadWriteByte(arg >> 16); SD_SPI_ReadWriteByte(arg >> 8); SD_SPI_ReadWriteByte(arg); SD_SPI_ReadWriteByte(crc); if(cmd==CMD12)SD_SPI_ReadWriteByte(0xff);//Skip a stuff byte when stop reading //等待响应,或超时退出 Retry=0X1F; do { r1=SD_SPI_ReadWriteByte(0xFF); }while((r1&0X80) && Retry--); //返回状态值 return r1; } //获取SD卡的CID信息,包括制造商信息
//输入: u8 *cid_data(存放CID的内存,至少16Byte) //返回值:0:NO_ERR // 1:错误 u8 SD_GetCID(u8 *cid_data)
- 11 -
共分享92篇相关文档