STM32F103测试SD卡串口写入测试

发布者:吾道明亮最新更新时间:2018-08-21 来源: eefocus关键字:STM32F103  SD卡  串口写入 手机看文章 扫描二维码
随时随地手机看文章

1.硬件引脚介绍:

本测试采用SPI模式读写SD卡,相关引脚配置如下:


片选:SD_CS->PB13,对应SD卡的1脚,低电平有效

时钟:SPI1_SCK->PA5,对应SD卡的5脚 

主入从出:MISO->PA6,对应SD卡的7脚 

主出从入:MOSI->PA7,对应SD卡的2脚


2.初始化步骤:

while(SD_Initialize())

{

//提示检查SD卡

}

//初始化SD卡

u8 SD_Initialize(void)

{

  u8 r1;      // 存放SD卡的返回值

  u16 retry;  // 用来进行超时计数

  u8 buf[4];  

u16 i;

SD_SPI_Init(); //初始化IO

  SD_SPI_SpeedLow(); //设置到低速模式 

  for(i=0;i<10;i++)SD_SPI_ReadWriteByte(0XFF);//发送最少74个脉冲

retry=20;

do

{

r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态

}while((r1!=0X01) && retry--);

  SD_Type=0;//默认无卡

if(r1==0X01)

{

if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0

{

for(i=0;i<4;i++)buf[i]=SD_SPI_ReadWriteByte(0XFF); //Get trailing return value of R7 resp

if(buf[2]==0X01&&buf[3]==0XAA)//卡是否支持2.7~3.6V

{

retry=0XFFFE;

do

{

SD_SendCmd(CMD55,0,0X01); //发送CMD55

r1=SD_SendCmd(CMD41,0x40000000,0X01);//发送CMD41

}while(r1&&retry--);

if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//鉴别SD2.0卡版本开始

{

for(i=0;i<4;i++)buf[i]=SD_SPI_ReadWriteByte(0XFF);//得到OCR值

if(buf[0]&0x40)SD_Type=SD_TYPE_V2HC;    //检查CCS

else SD_Type=SD_TYPE_V2;   

}

}

}else//SD V1.x/ MMC V3

{

SD_SendCmd(CMD55,0,0X01); //发送CMD55

r1=SD_SendCmd(CMD41,0,0X01); //发送CMD41

if(r1<=1)

{

SD_Type=SD_TYPE_V1;

retry=0XFFFE;

do //等待退出IDLE模式

{

SD_SendCmd(CMD55,0,0X01); //发送CMD55

r1=SD_SendCmd(CMD41,0,0X01);//发送CMD41

}while(r1&&retry--);

}else//MMC卡不支持CMD55+CMD41识别

{

SD_Type=SD_TYPE_MMC;//MMC V3

retry=0XFFFE;

do //等待退出IDLE模式

{    

r1=SD_SendCmd(CMD1,0,0X01);//发送CMD1

}while(r1&&retry--);  

}

if(retry==0||SD_SendCmd(CMD16,512,0X01)!=0)SD_Type=SD_TYPE_ERR;//错误的卡

}

}

SD_DisSelect();//取消片选

SD_SPI_SpeedHigh();//高速

if(SD_Type)return 0;

else if(r1)return r1;   

return 0xaa;//其他错误

}

如果返回值为正常类型,则跳出初始化循环,接下来介绍该函数中的SD_SPI_Init()函数及其内部调用的SPI_Init()函数

SD_SPI_Init()配置片选引脚PB13并拉低电平设置片选有效,然后调用SPI_Init()函数,代码略

SPI_Init()函数初始化单片机的SPI1外设,具体配置为PA5.6.7三个引脚的设置


//以下是SPI模块的初始化代码,配置成主机模式,访问SD Card  

 

SPI_InitTypeDef  SPI_InitStructure;

 

void SPI1_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

  

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA|RCC_APB2Periph_SPI1, ENABLE );

 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

 

  GPIO_SetBits(GPIOA,GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);

 

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工

SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //设置SPI工作模式:设置为主SPI

SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //设置SPI的数据大小:SPI发送接收8位帧结构

SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //选择了串行时钟的稳态:时钟悬空高

SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //数据捕获于第二个时钟沿

SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; //定义波特率预分频的值:波特率预分频值为256

SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始

SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值计算的多项式

SPI_Init(SPI1, &SPI_InitStructure);  //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

 

SPI_Cmd(SPI1, ENABLE); //使能SPI外设

SPI1_ReadWriteByte(0xff);//启动传输  

}   

3.主函数部分:


int main(void)

 { 

  u32 total,free;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2 

delay_init();     //延时函数初始

LED_Init();

uart_init(19200); //串口初始化为19200

  exfuns_init(); //为fatfs相关变量申请内存

  mem_init(); //初始化内存池

printf ("程序初始化结束:->\r\n");

if(SD_Initialize()) //检测SD卡

{

printf ("未检测到SD卡:->\r\n");

while(SD_Initialize())

{

printf("别看着了,滚去找原因,根本没插卡:\r\n");

LED1=!LED1;

delay_ms(500);

}

LED1=1;

}  

printf("SD卡正常加载:\r\n");

printf("申请内存结果:%d\r\n",(unsigned int)exfuns_init());//为fatfs相关变量申请内存,返回0成功  

  f_mount(fs[0],"0:",1); //挂载SD卡 

exf_getfree((u8*)"0",&total,&free);//得到SD卡的总容量和剩余容量

printf("SD卡的容量是:%d\r\n",free);

printf("开始扫描串口数据**************************\r\n");

while(1) //测试使用串口输入函数名是成功的

{

if(USART_RX_STA&0x8000)//不断检测串口接收完成?这里可以去串口中断服务函数中做一些if判断来限制串口的数据格式,数据大小

{

WriteData(); //串口接收完成开始写入SD卡,该函数是自己封装的,详细请看下面介绍的SD卡写入步骤

USART_RX_STA=0; //清零标志位

}

LED0=!LED0;//程序运行指示灯

delay_ms(500);

}

}


4.向SD卡中写入的步骤:(采用库函数)

由于里面的函数都是SD驱动函数封装起来的,所以要了解底层写入过程,还要参考SD卡的通讯时序等等,不在此赘述,以后会另做记录


void WriteData(void) //一旦在串口中断标志置位,则调用该函数,开始启动创建文件的步骤:

{

//*********写入SD卡****************************

mf_mount(0,1); //注册工作区域

mf_open(fileName,4); //创建文件

mf_close();

mf_open(fileName,2); //以可写方式打开文件

mf_lseek(mf_size()); //将指针移动到文件末尾,以便追加数据

mf_write(USART_RX_BUF,142); //追加写入串口发来的数据到SD卡

mf_close(); //关闭文件

printf("WriteData()执行完毕,数据写入成功\r\n");

}


关键字:STM32F103  SD卡  串口写入 引用地址:STM32F103测试SD卡串口写入测试

上一篇:stm32f4中用SD卡存储DCMI的图像
下一篇:STM32 IAP程序升级

推荐阅读最新更新时间:2024-03-16 16:11

深圳爱意推出全球最小高清录像机只有拇指大小
   如果你平时用摄像机拍DV觉得很沉,高交会上首次亮相的“全球最小”的高清数字录像机,定会叫你眼睛发亮——只有大拇指大小,重不到50克,可以夹在衣领上或者绑在头盔上,就能随时随地跟随你拍摄美好新生活。     这个貌似迷你版小手机的录像机功能很强大,高速动态录像,明暗环境瞬间响应,而且有200万高清的摄像头,最大可支持16G的SD卡,最长录像时间为十几个小时,具备声控触发功能,方便随时录像。一位“驴友”兴奋地说:“这款运动版的录像机真适用,可以安装在头盔或山地车上,拍摄更加真实的高清画面。”     据了解,该产品由深圳爱意无线科技有限公司研制生产。负责营销的罗道平介绍,公司在今年2月推出此新品,每月销售超过1000万元,参展
[嵌入式]
ARM芯片开发(S5PV210芯片)——SD卡启动
1、SD卡启动 顾名思义就是启动代码存放在SD卡中,设备从SD卡中启动。用SD卡启动有一些好处:譬如可以在不借用专用烧录工具(类似Jlink)的情况下对SD卡进行刷机,然后刷机后的SD卡插入卡槽,SoC既可启动;譬如可以用SD卡启动进行量产刷机(量产卡)。 2、支持SD卡启动的条件 SD卡启动不是每款芯片都支持的,因为SD卡有个难点,就是SD卡不能上电直接使用也不能通过总线与CPU相连,要通过Soc的SD卡控制器发命令才能与SD卡通信。这个有个矛盾点,SD卡需要初始化才能使用,但是能初始化SD卡的启动代码又在SD卡上,这就陷入了死锁。所以之前的设备都是用Norflash做启动介质,因为NorFlash上电即可使用,还可以片内执
[单片机]
ARM芯片开发(S5PV210芯片)——<font color='red'>SD卡</font>启动
STM32F103VET6——ADC库函数结构体
结构体 typedef struct { uint32_t ADC_Mode; /*! Configures the ADC to operate in independent or dual mode. This parameter can be a value of @ref ADC_mode */ FunctionalState ADC_ScanConvMode; /*! Specifies whether the conversion is performed in
[单片机]
一种 keil5 锁一种 keil5 锁死 STM32F103C8T6的
先前 画的一款 电机驱动板, 今天总算有时间调试了,,, 效果如上, 实验室里面的洗板水用没了。。。。 没有办法收拾的干净了, LED 没了。。。 接线端子 开关也没了。。。 条件很艰苦 进入 正题 , 上图主控是 STM32F103C8T6 就是网上卖的最便宜的那种。出现的问题时 keil 下载不进去程序。提示是这样玩的 我先用j-link 自带的工具j-flash 进行了测试 确定了 芯片是可以通讯 并且可以进行 hex文件的烧录的。 这样定位问题应该是keil 的配置出了问题。 keil 也不是一直出问题。 某一次 也是可以下载的。 经过多次尝试,我发现 当我用 j-flash 擦除芯片 并且解锁 unsec
[单片机]
一种 keil5 锁一种 keil5 锁死 <font color='red'>STM32F103</font>C8T6的
Proteus8.8版本+ STM32F103驱动LCD1602显示程序+按键+ADC+串口
STM32F103仿真驱动点亮LCD1602 一、开发环境介绍 proteus 8.8 版本+ STM32CubeMX 4.18.0 程序基于keil集成开发环境编写,基于ST官方的HAL库。 STM32CubeMX pack版本 STM32CubeMX的版本 二、项目功能介绍 该项目程序中实现了 1、程序实现了LCD1602的点亮显示 2、程序中实现了STM32的AD采样 3、程序中实现了串口通信 4、程序中实现了按键控制操作 通过滑动变阻器加放大器改变输入值。后边加上lcd1602,初始化显示“光节点检测系统” 然后加个按键按下开始 显示“光功率值:(多少)dbm 这里的范围就0-100 通过调节前边电位器每次只变化一
[单片机]
Proteus8.8版本+ <font color='red'>STM32F103</font>驱动LCD1602显示程序+按键+ADC+<font color='red'>串口</font>
利用STM32F103ZET6和AD9852DDS实现信号源的设计
针对π网络石英晶体参数测试系统,采用以STM32F103ZET6型ARM为MCU控制DDS产生激励信号。该测试系统相对于传统的PC机测试系统具有设备简单、操作方便,较之普通单片机测试系统又具有资源丰富、运算速度更快等优点。AD9852型DDS在ARM控制下能产生0~100 MHz扫频信号,经试验数据分析得到信号精度达到0.5×10-6,基本满足设计要求。该系统将以其小巧、快速、操作方便、等优点被广泛采用。 产生正弦激励信号一般可以通过振荡电路或直接数字频率合成器(Direct Digital Frequency Synthesis,DDS),DDS较振荡电路具有相位噪声小、杂散抑制好、可产生连续波信号、扫频信号和频率捷变信号等
[单片机]
利用<font color='red'>STM32F103</font>ZET6和AD9852DDS实现信号源的设计
低耗EMI滤波方案大范围降低手机SD卡传输与通讯干扰
在各品牌间激烈竞争的推波助澜下,便携式电子产品在使用功能上呈多元化发展,且日渐复杂。由于其体积小、产品工作频率愈来愈高,以及操作电压愈来愈小,导致各功能模组产生的电磁信号在极小的体积内相互干扰的情况越来越严重。另一方面,随着各类电子产品(包括商用以及工业用) 的日趋普及,对于便携式电子产品的使用者而言,其所在环境的周围处于操作使用中的电子产品数量密度越来越高,这些电子产品所累积产生的电磁辐射干扰也就更加严重,从而使得 电磁干扰 (EMI) 问题日趋复杂严重。 晶焱科技(Amazing Microelectronic)的技术团队在静电放电(ESD)保护技术上,累积了丰富的技术与经验。该公司的电磁干扰滤波器产品,主要就是针对便携式电子
[电源管理]
低耗EMI滤波方案大范围降低手机<font color='red'>SD卡</font>传输与通讯干扰
基于STM32F103的wifi数据透传
ESP8266串口型WIFI,主要用于传开关量、温度等 连线: VCC ----3.3V RST ----PE6 低电平复位 CH_PD ----PG7 使能脚,高电平正常工作 UTXD ----USART2 RX URXD ----USART2 TX GND ----GND 此次试验选STA模式的TCP Client透传,让WIFI模块连接路由器,然后在网络调试助手上设置好连接的IP地址和端口 STA模式,8266为客户端,PC是服务端 USART2发送的数据经过8266传输到网络调试助手上显示 8266默认波特率115200,8N1 所以USART2配置一样 修改WiFi名称、密码和IP 在下载程序前,
[单片机]
基于<font color='red'>STM32F103</font>的wifi数据透传
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved