arduino学习笔记18 - SD卡读写实验

合集下载

SD卡读写

SD卡读写

SD卡读写前言长期以来,以Flash Memory为存储体的SD卡因具备体积小、功耗低、可擦写以及非易失性等特点而被广泛应用于消费类电子产品中。

特别是近年来,随着价格不断下降且存储容量不断提高,它的应用范围日益增广。

当数据采集系统需要长时间地采集、记录海量数据时,选择SD卡作为存储媒质是开发者们一个很好的选择。

在电能监测以及无功补偿系统中,要连续记录大量的电压、电流、有功功率、无功功率以及时间等参数,当单片机采集到这些数据时可以利用SD 作为存储媒质。

本文主要介绍了SD卡在电能监测及无功补偿数据采集系统中的应用方案。

设计方案应用AT89C52读写SD卡有两点需要注意。

首先,需要寻找一个实现AT89C52单片机与SD卡通讯的解决方案;其次,SD卡所能接受的逻辑电平与AT89C52提供的逻辑电平不匹配,需要解决电平匹配问题。

通讯模式SD卡有两个可选的通讯协议:SD模式和SPI模式。

SD 模式是SD卡标准的读写方式,但是在选用SD模式时,往往需要选择带有SD 卡控制器接口的MCU,或者必须加入额外的SD卡控制单元以支持SD卡的读写。

然而,AT89C52单片机没有集成SD卡控制器接口,若选用SD模式通讯就无形中增加了产品的硬件成本。

在SD卡数据读写时间要求不是很严格的情况下,选用SPI模式可以说是一种最佳的解决方案。

因为在SPI模式下,通过四条线就可以完成所有的数据交换,并且目前市场上很多MCU都集成有现成的SPI接口电路,采用SPI模式对SD卡进行读写操作可大大简化硬件电路的设计。

虽然AT89C52不带SD卡硬件控制器,也没有现成的SPI 接口模块,但是可以用软件模拟出SPI总线时序。

本文用SPI 总线模式读写SD卡。

电平匹配SD卡的逻辑电平相当于3.3V TTL电平标准,而控制芯片AT89C52的逻辑电平为5V CMOS电平标准。

因此,它们之间不能直接相连,否则会有烧毁SD卡的可能。

出于对安全工作的考虑,有必要解决电平匹配问题。

sd卡数据读写流程

sd卡数据读写流程

SD卡数据读写流程引言SD卡(Secure Digital Card)是一种常用的存储设备,通常用于移动设备、相机等电子产品中。

在使用SD卡时,数据的读写是一个非常重要的过程。

本文将详细介绍SD卡的数据读写流程,包括初始化、文件操作和数据传输等环节。

初始化SD卡初始化SD卡是数据读写的第一步,确保SD卡可以被正确地识别和使用。

下面是SD卡数据读写的初始化流程:1.插入SD卡:将SD卡插入目标设备的SD卡插槽中。

2.电源供给:为SD卡提供稳定的电源,通常通过连接电源线或使用内置电池来实现。

3.延时等待:等待SD卡稳定,一般为几毫秒的时间。

4.发送命令:通过SPI或SDIO等接口向SD卡发送特定的命令,以初始化SD卡。

5.接收响应:SD卡将返回初始化成功与否的响应,如果初始化成功,则可以进行后续的数据读写操作。

SD卡文件系统在进行数据读写之前,需要先设置SD卡的文件系统。

常用的文件系统包括FAT16、FAT32和exFAT等。

下面是SD卡文件系统的设置流程:1.格式化SD卡:使用格式化工具对SD卡进行格式化,以清除原有的文件系统和数据。

2.创建分区:根据需求,可以将SD卡分为一个或多个分区,并设置每个分区的大小。

3.创建文件系统:选择合适的文件系统类型,在分区上创建文件系统,并分配文件系统的容量。

4.分配文件表:文件系统会维护一个文件表,记录文件的位置、大小等信息。

在创建文件系统时,会分配一块空间来存储文件表。

5.设置文件权限:根据需要,可以设置文件的读写、执行权限,以保证文件的安全性。

SD卡数据读写操作SD卡的数据读写操作包括文件的创建、打开、读取、写入和关闭等。

下面是SD卡数据读写操作的详细流程:1.创建文件:通过文件系统接口,调用相关函数创建一个新的文件,并指定文件的名称和路径。

2.打开文件:使用文件系统的函数打开已经存在的文件,以便后续的读取和写入操作。

3.读取文件:通过文件系统提供的函数,在已经打开的文件中进行读取操作。

存储器卡读写实验

存储器卡读写实验

西安邮电大学智能卡技术及应用课内实验报告实验名称:存储器卡读写实验专业名称:智能科学与技术班级:学生姓名:学号:指导教师:实验日期:2016年4月18日实验一存储器卡读写实验一.实验目的1.了解CI2串行总线的工作原理;2.通过实验了解存储器卡存、取数据的过程。

二.实验器材1.KEIL软件;2.PROTEUS仿真软件。

三.实验内容往24C04芯片中写入一个数据(如“129”),然后再从24C04芯片中读出刚才的数据并把它显示在数码管上。

四.实验步骤1.硬件电路仿真使用Proteus软件画出如图1所示的电路图,要求:使用两个按钮来分别模拟读卡和拔卡(清除数据)的过程,用一个发光二极管来模拟卡座上电的过程。

(注:电路图画好后,给存储器24C04导入24C04.bin文件,给51单片机导入hex文件)图 1 硬件电路图2.软件编写图2 程序流程图程序截图:图33.实验结果刚开始运行时,单片机没有读取任何数据,此时数码管显示数字为0;当“读卡”按钮按下时,此时发光二极管亮,数码管显示预先存入24C04芯片的数值;当“清除”按钮按下时,此时此时发光二极管灭,数码管数值清零。

图4图5图6五、实验总结通过本次实验我了解了存储器卡存、取数据的过程,同时了解CI2串行总线的工作原理。

实验在程序编写过程中遇到了问题,还是参考过老师以及网上的程序得到同学的帮助,才大体上完成。

每次实验都有新的收获,以后我会更加努力学习的。

六、实验代码#include <reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define NOP4(){_nop_();_nop_();_nop_();_nop_();} //延时4ussbit SCL = P1^0; //SCL引脚sbit SDA = P1^1; //SDA引脚sbit BUTTON = P1^5; //定义读卡按键sbit LED = P1^6;//定义模拟上电卡座sbit BUTTONQ = P1^7;//定义模拟取卡按键uint shu; //定义写入变量//数码管显示数组uchar code DUAN_XUAN[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x8 2,0xf8,0x80,0x90};//延迟函数void Delay(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}void DelayMS(uint x){uchar t;while(x--){for(t=120;t>0;t--);}}/*IIC启动*/void Start(){SDA=1;SCL=1;NOP4();SDA=0;NOP4();S CL=0;}/*IIC停止*/void Stop(){SDA=0;SCL=0;NOP4();SCL=1;NOP4();S DA=1;}/*读取应答*/void RACK(){SDA=1;NOP4();SCL=1;NOP4();SCL=0; }/*发送非应答信号*/void NO_ACK(){SDA=1;SCL=1;NOP4();SCL=0;SDA=0; }/*向24c04中写一字节*/void Write_A_Byte(uchar b){uchar i;for(i=0;i<8;i++){//循环移入8位b<<=1;SDA=CY;_nop_();SCL=1;NOP4() ;SCL=0;}RACK(); //读取应答}/*向24c04中读一字节*/uchar Receive_A_Byte(){uchar i,d;for(i=0;i<8;i++){SCL=1;d<<=1;d|=SDA;SCL=0;}return d;}/*任意地址写数据*/void Write_Random_Address_Byte(uchar add,uchar dat){Start();Write_A_Byte(0xa0);Write_A_Byte(add);Write_A_Byte(dat);Stop();DelayMS(10);}/*当前地址读数据*/uchar Read_Current_Address_Data(){ uchar d;Start();Write_A_Byte(0xa1);d=Receive_A_Byte();NO_ACK();Stop();return d;} /*任意地址读数据*/uchar Random_Read(uchar addr){ Start();Write_A_Byte(0xa0);Write_A_Byte(addr);Stop();returnRead_Current_Address_Data();}//显示函数void display(uint x){uchar bai,shi,ge;bai=x/100; //取百位shi=x%100/10; //取十位ge=x%10; //取个位P0=0xff; //消影Delay(1);P2=0x01;P0=DUAN_XUAN[ge]; //显示个位Delay(10);P0=0xff;P2=0x02;P0=DUAN_XUAN[shi]; //显示十位Delay(10);P0=0xff;P2=0x04;P0=DUAN_XUAN[bai]; //显示百位Delay(10);}//主函数void main(){uint x;x=0;shu=129; //把要写的值赋给变量BUTTON=1;LED=0;Write_Random_Address_Byte(0x00,sh u); //往00地址写入一个值shu = Random_Read(0x00) ; // 读00地址的值while(1){if(BUTTON==0) {//判断读卡按键Delay(40);if(BUTTON==0) { //消抖LED=1; //灯亮x=shu; //把读出的数赋给显示变量}}if(BUTTONQ==0) {//判断清除按键Delay(40);if(BUTTONQ==0){LED=0; //灯灭x=0;//对显示变量的值清零}}display(x); //显示 }}。

SD卡读写程序

SD卡读写程序

SD卡读写程序SD卡读写程序//实验目的:学习SD卡的操作//软件设计// 1、SD卡采用SPI通信// 2、先往SD里顺序写入0-255共256个数据,然后再读回送LCD1602显示//硬件要求:// 拨码开关S11置ON// 跳线J18全部接通#include //dsPIC30F6014标准头文件_FOSC(CSW_FSCM_OFF & XT_PLL4); //4倍频晶振,Failsafe 时钟关闭_FWDT(WDT_OFF); //关闭看门狗定时器_FBORPOR(PBOR_OFF & MCLR_EN); //掉电复位禁止,MCLR 复位使能。

_FGS(CODE_PROT_OFF); //代码保护禁止#define cs PORTGbits.RG9 //定义SD卡片选脚#define rs /doc/e62205906.html,TB4 //定义LCD控制位(注意这里只能用LATB寄存器,不能直接用PORTB 寄存器)#define rw /doc/e62205906.html,TB5 #define e /doc/e62205906.html,TB6unsigned char __attribute__((address(0x900))) lcd[3]={0,0,0};void spi_init(); //申明系统初始函数void spi_low(); //申明产生低波特率函数(SD卡初始化使用)void spi_high(); //申明产生高波特率函数(SD卡初始化后使用)unsigned char sd_reset(); //申明SD卡初始化函数unsigned char SD_SendCommand(unsigned char cmd,unsigned long arg); //申明写SD卡命令函数unsigned char SPI_WriteByte(unsigned char val); //申明写一字节函数unsigned char SPI_ReadByte(void); //申明接收一字节函数unsigned char SD_WriteSingleBlock(unsigned long sector); //申明写SD卡单BLOCK数据函数unsigned char SD_ReadSingleBlock(unsigned long sector); //申明读SD卡单BLOCK数据函数void lcd_display(); //申明结果显示函数void delay(); //申明延时函数(显示时用)//系统初始化函数void spi_init(){TRISG="0x00d0"; //设置SDI为输出,其他C口为输出TRISB="0X0000"; //设置B口为输出TRISD="0X0000"; //设置D口为输出SPI2CON=0x0278; //空闲时总线为高电平,fosc/64SPI2STAT=0x8000; // 输出数据的末尾采样输入数据,上升沿发送数据}//*************************写LCD程序****************************************//写一个字节数据函数//在电平发生改变后需要插入一段延时时间,否则LCD反应不过来。

SD卡读写

SD卡读写

SD卡读写(1)系统硬件文件系统只是数据的组织格式的统称,不涉及到硬件,所以系统的硬件与上篇日志中相同,不作修改。

(2)文件系统结构和读写原理带有文件系统的SD卡的内部结构一般如下表:256MSD卡的文件系统结构文件系统结构说明扇区起始号占用扇区数 Partiton Boot Sector 分区记录扇区 0 1 Reserved Sectors 保留扇区 0 4 FAT1 文件分配表1 4 242 FAT2 文件分配表2 246 242 DIR(FDT) 文件根目录区 488 32 User Data 数据区 520 493560 SD卡的保留扇区中一般不要写入数据,否则可能破坏其文件系统结构,导致操作系统不能识别。

在FAT文件系统中,BPB(Bios ParameterBlock)是一个很重要的参数表,该表通常位于0扇区(保留扇区中的第一个扇区)中的12-36字节,它记录了分区中的一些重要数据如总扇区数、每扇区的字节数、每簇的扇区数、保留扇区数、FAT表占用扇区数等,我这里的256M的SD卡中的BPB表如下:名称占用字节数内容说明BPB_BytesPerSec 2 0x0200 扇区大小为512字节 BPB_SecPerChus 1 0x08 每簇有8个扇区 BPB_RsvdSecCnt 2 0x0004 有4个保留扇区 BPB_NumFATs 1 0x02 有2个FAT表BPB_RootEntCnt 2 0x0200 根目录中可有512个登记项 BPB_TotSec16 20x0000 为0表示总扇区数大于65536BPB_MediaType 1 0xF8 磁盘介质为硬盘 BPB_FATSize16 2 0x00F2 每个FAT表占242个扇区 BPB_SecPerTrk 2 0x3F 每个磁道有63个扇区 BPB_NumHeads 2 0x00FF 磁头数为255BPB_HiddSec 4 0x00000000 有0个隐藏扇区 BPB_TotSec32 4 0x00078A00 共有494080个扇区保留扇区之后是文件分配表,FAT16文件系统有两份文件分配表(FAT),FAT的大小可以在BPB中查到。

SD卡读写操作

SD卡读写操作

SD卡操作一、概述1、简介SD卡是基于flash的存储卡。

SD卡和MMC卡的区别在于初始化过程不同。

SD卡的通信协议包括SD和SPI两类。

SD卡使用卡内智能控制模块进行FLASH操作控制,包括协议、安全算法、数据存取、ECC算法、缺陷处理和分析、电源管理、时钟管理。

2、功能介绍2.1 特点1)主机无关的FLASH内存擦除和编程读或写数据,主机只要发送一个带地址的命令,然后等待命令完成,主机无需关心具体操作的完成。

当采用新型的FLASH时,主机代码无需更新。

2)缺陷管理3)错误恢复4)电源管理Flash每个扇区有大约10万次的写寿命,读没有限制。

擦除操作可以加速写操作,因为在写之前会进行擦除。

3 SD总线模式3.1 Negotiating Operation Conditions当主机定义了SD卡不支持的电压范围时,SD卡将处于非活动状态,将忽略所有的总线传输。

要退出非活动状态唯一的方法就是重新上电。

3.2 SD卡获取和识别SD卡总线采用的是单主多从结构,总线上所有卡共用时钟和电源线。

主机依次分别访问每个卡,每个卡的CID寄存器中已预编程了一个唯一的卡标识号,用来区分不同的卡。

主机通过READ_CID命令读取CID寄存器。

CID寄存器在SD卡生产过程中的测试和格式化时被编程,主机只能读取该号。

DAT3线上内置的上拉电阻用来侦测卡。

在数据传输时电阻断开(使用ACMD42)。

3.3 卡状态卡状态分别存放在下面两个区域:卡状态(Card Status),存放在一个32位状态寄存器,在卡响应主机命令时作为数据传送给主机。

SD状态(SD_Status),当主机使用SD_STATUS(ACMD13)命令时,512位以一个数据块的方式发送给主机。

SD_STATUS还包括了和BUS_WIDTH、安全相关位和扩展位等的扩展状态位。

3.4 内存组织数据读写的基本单元是一个字节,可以按要求组织成不同的块。

Block:块大小可以固定,也可以改变,允许的块大小是实际大小等信息存储在CSD寄存器。

SD卡读写学习-----使用文档

SD卡读写学习-----使用文档

SD 卡读写学习使用文档一、 概述SD 卡是基于 flash 的存储卡,其和 MMC 卡的区别在于初始化过程不同。

SD 卡的通信协议包括 SD 和 SPI 两类。

SD 卡使用卡内智能控制模块进行 FLASH 操作控制,包括协议、安全算法、数据存取、 ECC 算法、缺陷处理和分析、电源管理、时钟管理。

二、SD 卡读写操作读操作的块长度受设备 sector 大小 (512 bytes)的限制,但是可以最小为一个字节。

51单片机读写SD 卡一般使用SD 卡的SPI 模式 0、CMD 命令格式:First Byte Byte 2-5 Last Byte 参数:4Byte---32bit ,指向要写入的字节地址,所以限制了SD 卡可以最大写入4g 数据bit7 bit6 bit5~0 Databit7~1 bit0 01命令参数(高位在前)CRC 校验1示例: CMD0号命令,CMD24(0x40+24=0x58)号命令时,参数为要写入的地址。

固定 CMD0命令 参数(2-5) CRC 校验 固定01 | 00 0000 | 0000 0000 ........ 0000 | 1001 010 | 1 0x40, 0x00,0x00,0x00,0x00, 0x95 adr<<=9;//取512的整数倍,因一个扇区为512字节。

CMD[1]=(addr>>24); CMD[2]=(addr>>16); CMD[3]=(addr>>8); CMD[4]=(addr>>0); $、SPI 模式:SD 卡启动时处在SD 总线模式下,要进入SPI 模式时,要遵守如下操作。

SD 卡复位及初始化时,时钟频率一定要慢下来,最高不超过400KHZ 。

1)SD 卡复位复位SD 卡:a 、所有引脚拉高,片选CS 为1时,首先往SD 卡写入至少74个时钟信号。

(SD 卡协议规定)b 、片选CS 拉低为0,写入CMD0命令(0x40,0x00,0x00,0x00,0x00,0x95)c 、读取SD 卡MISO 返回数据直到SD 卡返回0x01。

单片机读写SD卡教程

单片机读写SD卡教程

郑重声明:本实验并不是对所有SD卡都能成功运行第一步:打开win hex软件,用读卡器读SD卡,在win hex中查看SD卡FPrlrj 旧nmg *御日・曲日尺 立件(日轄:号iifllPI 讥吵:当Tfllll 春罰;〔I SW (£)旨口凹帶此|;也S X电a► O C3 * -0 畫・■€■*电bld! IbiljUA ] 初1 悶「1|馆口曲佃 AgraaSBJLXsta InAEiqptetEJ' 03839535 16BH(*J-): 0曲* ?;第詞 EKt £i2f UrEiib&d MT 1 SOB 66.5 K0 1.2 MB Famof 跆hl 色 TipHium 1 Offset 0 1 2 3 4 5 6 7 3 9 A B c n E F /1 ModSfA'v wC Cans Ae^defDOOOOOD Ec 00 00 OD 00 00 DO aa 00 00 00 00 DO ao DO oo fc 1j uFirmwlrf Atv.. 1.D0 OCIIDOOOI 00 00 00 00 oo 00 00 OiO 00 no 00 00 GO no no 00..DUS : USB D000002D 00 00 00 00 00 00 DO 00 :ir 00 00 00 DO 00 DO ao I! ■DerauitEdnDD00003D 00 00 00 00 00 ao DO aa 00 00 00 00 DO a)a DO aa ■i ■ j 4Sl5te: original oomoQQin 00 00 00 00 00 on on OQ 00 no 00 00 00 Qi Q 00 00. .Undo lewef: 0 00000050 oa 00 00 00 00 00 DO OQ 00 00 00 00 m 00 DO QO r i ■, f Undo rsverses: Ma D000006D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO o)a DO aa -・ --oonoau70 on 00 00 OQ 00 00 DO oa oa OQ 00 QO 00 ao DO 00. ■1.^7,1126.576 诩跆 DOOaOOBD oa 00 00 00 00 00 DO OQ 00 00 00 00 m 00 DO 00 r ・ ■■ 1D000009D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO a)a DO oaii i J 4 Siapkis seclorfi 创 entE51 3 DOOQOaM) 00 00 00 OQ 00 00 no a>a 00 00 00 00 do00 DO-”4 4OOOOOOB oa 00 00 00 00 00 DO OU 00 00 00 00 DO 00 DO 00 r i■1 f Psritllfln: -:1 DOOOOOC D 00 00 00 aa 00 ao DO aa 00 00 00 ao DO a)o DO oa h ij 4R C ISW B S-BCbO r Ho Na OOOOOOD 00 QO m 00 00 00 00 no 00 00 GO 00 DO 00 00 ao MDC J B : hiBoodewnalOOOOOOE D 00 00 00 00 00 00 DO ao 00 00 00 00 00 00 DO 00, ,Cuaiader 虻I ANSI ASCIIoooaaoFD 00 OD 0000 DO ao DO aa 00 00 00 00 DO a)a DO aoOR 曲: hexadecwnaloomoaioo 00 00 00OQ oo 00 no aa 00 OQ 00 00 lOO Qi O 00 DOoooaoiiD 00 00 00 00 00 00 DO □ Q 00 00 00 00 m00DO 00 r ilnllnuiiw *. 1No ofwIridcrBVK' ID000012D 00 OD 00 00 00 ao DO aa 00 00 00 ao DO a)a DO oa ii iJ 4D000013Q oo 00 oo00 oo 00 oo ao oo no do Qfl oo oo 00 so加 Aab 用 00000140 DU 00 00 00 00 00 DO QO 00 00 00 00 DO ao DO 00 ,, ,.TEMPltilifer 1.2GBffee D000015D 00 OD 00 OQ 00 ao DO aa 00 00 00 ao DO a)a DO aa B1J 4 ^D MINI -IIL OC AL S'1 打 amp QOOOQ1B O 00 QO 00 QO oo 00 DO aa 00 00 00 00 lOO Qi O 00 DO..tJ 00000170 00 00 0000 00 00 DO 00 00 00 00 00 uo 00DO 00 r i■1 1J4D00001BD 00 00 00OQ 00 aoDO aa0000 00ao DO a)o DO oa “.J-SedamoT 胡4■加轴 0tT9«l:a=D Blatk-^ParHion 1Siad BecWrsUnp3it(jon^b*5 阿苗点击查找(ctrl+F ) Find Text 3 3 J J J J J J J J 3 ] ] ] ] ]The folouing text string wil be searched: FAT| caseASCII/Code page vUse this as a wildcardI I Whole wo(d^ odjjSearch:□ Cond.: offset mod =I_ Search in plgk only]Search in dll open windows |—| List search hits, 14)to 1Cancel输入FAT (找到 DBR 处)发现DBR 起始于0x11200扇区地址,它必是512整数倍,因为一个扇区含 512BYTE ,所以 在程序中读一个扇区时一定要是 512整数倍,否则会出错。

存储器读写实验实验总结

存储器读写实验实验总结

存储器读写实验实验总结
存储器读写实验是一种常见的电子实验,通过这个实验,我们可以了解存储器的读写原理以及存储器的工作方式。

本次实验中,我们使用了Arduino UNO开发板和24C02 EEPROM存储器芯片,下面对实验进行总结。

实验目的:
本次实验的目的是了解存储器的读写原理、存储器芯片的类型、接口方式、存储器操作等基本概念,并通过实验掌握使用Arduino控制EEPROM存储器读写操作的方法。

实验步骤:
1. 准备材料,包括Arduino UNO开发板、24C02 EEPROM存储器芯片、杜邦线等。

2. 将EEPROM存储器芯片与Arduino开发板连接,具体连接方式可以参考实验指导书。

3. 编写程序,在程序中定义存储器读写操作所需的引脚和操作函数。

4. 将程序烧录到Arduino开发板中。

5. 运行程序,进行存储器读写操作。

实验结果:
我们通过实验成功地实现了对EEPROM存储器芯片的读写操作,确认了存储器
芯片的工作状态和数据存储情况。

通过查看串口输出信息,我们可以看到读取的数据和写入的数据以及相应的内存地址信息。

实验体会:
本次实验让我们更加深入地了解了存储器的读写原理和存储器芯片的类型、接口方式、存储器操作等基本概念。

同时,我们通过实验也掌握了使用Arduino控制EEPROM存储器读写操作的方法,对我们今后的学习和工作都将有很大帮助。

总之,存储器读写实验是一项非常有意义的实验,通过实验的学习,我们可以更好地理解存储器的工作原理,为今后的学习和工作打下坚实的基础。

Arduino读写SD卡

Arduino读写SD卡

Arduino读写SD卡的例子清单15-1 项目42的代码//项目42//sdfatlib的例子,Bill Greiman写的SD读写实例#include <SdFat.h>#include <SdFatUtil.h>Sd2Card card;SdVolume volume;SdFile root;SdFile file;//在Flash存储器中存储错误字符串,节省RAM空间#define error(s) error_P(PSTR(s))void error_P(const char* str) {PgmPrint("error: ");SerialPrintln_P(str);if (card.errorCode()) {PgmPrint("SD error: ");Serial.print(card.errorCode(), HEX);Serial.print(',');Serial.println(card.errorData(), HEX);}while(1);}//向文件写一个回车或换行符号void writeCRLF(SdFile& f) {f.write((uint8_t*)"\r\n", 2);}//写一个无符号数到文件void writeNumber(SdFile& f, uint32_t n) {uint8_t buf[10];uint8_t i = 0;do {i++;buf[sizeof(buf) - i] = n%10 + '0';n /= 10;} while (n);f.write(&buf[sizeof(buf) - i], i);}//写字符串到文件void writeString(SdFile& f, char *str) {uint8_t n;for (n = 0; str[n]; n++);f.write((uint8_t *)str, n);}void setup() {Serial.begin(9600);Serial.println();Serial.println("Type any character to start");while (!Serial.available());//初始化SD卡在一半的通信速度避免使用面包板造成总线错误//如果你的卡可以使用全速执行if (!card.init(SPI_HALF_SPEED)) error("card.init failed");//初始化FAT卷标if (!volume.init(&card)) error("volume.init failed");//打开根目录if (!root.openRoot(&volume)) error("openRoot failed");//生成一个新文件char name[] = "TESTFILE.TXT";file.open(&root, name, O_CREAT | O_EXCL | O_WRITE);//在这里放当天的日期时间file.timestamp(2, 2010, 12, 25, 12, 34, 56);//写10行数据到文件for (uint8_t i = 0; i < 10; i++) {writeString(file, "Line: ");writeNumber(file, i);writeString(file, " Write test.");writeCRLF(file);}//关闭文件并强制写所有数据到SD卡file.close();Serial.println("File Created");//打开文件if (file.open(&root, name, O_READ)) {Serial.println(name);}else{error("file.open failed");}Serial.println();int16_t character;while ((character = file.read()) > 0) Serial.print((char)character);Serial.println("\nDone");}void loop() { }米多(68173331) 19:16:34《Arduino从基础到实践》中的一个例子米多(68173331) 19:17:57Arduino接互联网的例子输入清单17-1中的代码。

Arduino技术及应用--第21章SD卡的类库使用

Arduino技术及应用--第21章SD卡的类库使用

21.2 SD卡类库成员函数
SDClass 类
(6) rmdir( ) 功能:移除文件夹。被移除的文件夹必须是空的。 语法:SD. rmdir(filename) 参数:filename,需要移除的文件夹名。其中可以包含路径,路径用 “/”分隔。 返回值:boolean型值,为true表示移除成功;为false表示移除失败。
21.2 SD卡类库成员函数
SDClass 类
(3) open( ) 参数: filename,需要打开的文件名。其中可以包含路径,路径用“/”分隔。 mode(可选),打开文件的方式,默认使用只读方式打开。也可以使用以 下两种方式打开文件:
FILE_READ,只读方式打开文件; FILE_WRITE,写入方式打开文件。 返回值:返回被打开文件对应的对象;如果文件不能打开,则返回false。
21.2 SD卡类库成员函数
SDClass 类
(1) begin( ) 功能:初始化SD卡库和SD卡。 语法: SD. begin( ) SD. begin (cspin) 当使用SD. begin( )时,默认将Arduino SPI的SS引脚连接到SD卡的CS使能 选择端;也可以使用begin(cspin)指定一个引脚连接到SD卡的CS使能选择端, 但仍需保证SPI的SS引脚为输出模式,否则SD卡库将无法运行。 参数:cspin,连接到SD卡CS端的Arduino引脚。 返回值:boolean型值,为true表示初始化成功;为false表示初始化失败。
21.2 SD卡类库成员函数
SDClass 类
(5) mkdir( ) 功能:创建文件夹。 语法:SD. mkdir(filename) 参数:filename,需要创建的文件夹名。其中可以包含路径,路径用 “/”分隔。 返回值:boolean型值,为true表示创建成功;为false表示创建失败。

SD卡读写操作详细说明

SD卡读写操作详细说明

51单片机实现对SD卡的读写SD卡SPI模式下与单片机的连接图:22.23.//获得16位的回应24. Read_Byte_SD(); //read the first byte,ignore it.25.do26. { //读取后8位27. tmp = Read_Byte_SD();28. retry++;29. }30.while((tmp==0xff)&&(retry<100));31.return(tmp);32.}2)初始化SD卡的初始化是非常重要的,只有进行了正确的初始化,才能进行后面的各项操作。

在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。

在初始化成功后,应尽量提高SPI的速率。

在刚开始要先发送至少74个时钟信号,这是必须的。

在很多读者的实验中,很多是因为疏忽了这一点,而使初始化不成功。

随后就是写入两个命令CMD0与CMD1,使SD卡进入SPI模式初始化时序图:初始化例程:1.//--------------------------------------------------------------------------2.初始化SD卡到SPI模式3.//--------------------------------------------------------------------------4.unsigned char SD_Init()5.{6.unsigned char retry,temp;7.unsigned char i;8.unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};9. SD_Port_Init(); //初始化驱动端口10.11. Init_Flag=1; //将初始化标志置112.13.for (i=0;i<0x0f;i++)14. {15. Write_Byte_SD(0xff); //发送至少74个时钟信号16. }17.18.//向SD卡发送CMD019. retry=0;20.do21. { //为了能够成功写入CMD0,在这里写200次22. temp=Write_Command_SD(CMD);23. retry++;24.if(retry==200)25. { //超过200次26.return(INIT_CMD0_ERROR);//CMD0 Error!27. }28. }29.while(temp!=1); //回应01h,停止写入30.31.//发送CMD1到SD卡32. CMD[0] = 0x41; //CMD133. CMD[5] = 0xFF;34. retry=0;35.do36. { //为了能成功写入CMD1,写100次37. temp=Write_Command_SD(CMD);38. retry++;39.if(retry==100)40. { //超过100次41.return(INIT_CMD1_ERROR);//CMD1 Error!4.unsigned char Read_CSD_SD(unsigned char *Buffer)5.{6.//读取CSD寄存器的命令7.unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};8.unsigned char temp;9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes10.return(temp);11.}4)读取SD卡信息综合上面对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。

arduino学习笔记

arduino学习笔记

Arduino学习笔记arduino学习笔记1 - 什么是arduino?要了解arduino就先要了解什么是单片机,arduino平台的基础就是AVR指令集的单片机。

1、什么是单片机?它与个人计算机有什么不同?一台能够工作的计算机要有这样几个部份构成:中央处理单元CPU (进行运算、控制)、随机存储器RAM(数据存储)、存储器ROM(程序存储)、输入/输出设备I/O(串行口、并行输出口等)。

在个人计算机(PC)上这些部份被分成若干块芯片,安装在一个被称之为主板的印刷线路板上。

而在单片机中,这些部份全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如模拟量/数字量转换(A/D)和数字量/模拟量转换(D/A)等。

2、单片机有什么用?实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用酷睿处理器吗?应用的关键是看是否够用,是否有很好的性能价格比。

如果一台冰箱都需要用酷睿处理起来进行温度控制,那价格就是天价了。

单片机通常用于工业生产的控制、生活中与程序和控制有关(如:电子琴、冰箱、智能空调等)的场合。

下图就是一个Atmega328P-PU单片机,基于AVR指令集的8位处理器,频率20MHz,存储器空间32KB。

什么是Arduino?Arduino是一个能够用来感应和控制现实物理世界的一套工具。

它由一个基于单片机并且开放源码的硬件平台,和一套为Arduino板编写程序的开发环境组成。

Arduino可以用来开发交互产品,比如它可以读取大量的开关和传感器信号,并且可以控制各式各样的电灯、电机和其他物理设备。

Arduino项目可以是单独的,也可以在运行时和你电脑中运行的程序(例如:Flash,Processing,MaxMSP)进行通讯。

Arduino板你可以选择自己去手动组装或是购买已经组装好的;Arduino开源的IDE 可以免费下载得到。

Arduino+ESP32之SD卡读写

Arduino+ESP32之SD卡读写

Arduino+ESP32之SD卡读写背景知识:有两种使⽤SD卡的⽅法,⼀种是使⽤SPI接⼝访问SD卡,另⼀种是使⽤SDMMC接⼝访问SD卡。

Arduino core for the ESP32中SPI⽅式占⽤4个IO⼝,SDMMC⽅式占⽤6个IO⼝,⼀般来说SDMMC⽅式速度要⽐SPI⽅式快。

1. SDMMC⽅式ESP32虽然有两组SDMMC接⼝,但Arduino core for the ESP32中只⽤到了其中⼀组,IO⼝连接为:DAT2 - IO12、DAT3 - IO13、CMD -IO15、CLK - IO14、DAT0 - IO2、DAT1 - IO4;bool begin(const char * mountpoint="/sdcard", bool mode1bit=false)挂载存储卡,输⼊参数分别为挂载点、是否使⽤⼀线模式;void end()取消挂载;sdcard_type_t cardType() 返回存储卡类型,0、1、2、3、4,分别如下:CARD_NONE 未连接存储卡;CARD_MMC mmc卡;CARD_SD sd卡,最⼤2G;CARD_SDHC sdhc卡,最⼤32G;CARD_UNKNOWN 未知存储卡;uint64_t cardSize() 返回存储卡⼤⼩字节数;uint64_t totalBytes() 返回⽂件系统总字节数;uint64_t usedBytes() 返回⽂件系统已⽤字节数;2. SPI⽅式bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint="/sd", uint8_t max_files=5)挂载存储卡,输⼊参数分别为SS引脚号、SPI对象、时钟频率、挂载点、⽂件最⼤同时打开数;默认IO⼝连接为:CS - IO5、DI - IO23、SCLK - IO18、DO - IO19;void end()取消挂载;sdcard_type_t cardType() 返回存储卡类型,0、1、2、3、4,分别如下:CARD_NONE 未连接存储卡;CARD_MMC mmc卡;CARD_SD sd卡,最⼤2G;CARD_SDHC sdhc卡,最⼤32G;CARD_UNKNOWN 未知存储卡;uint64_t cardSize() 返回存储卡⼤⼩字节数;uint64_t totalBytes() 返回⽂件系统总字节数;uint64_t usedBytes(); 返回⽂件系统已⽤字节数3. 我的实验我⼿头的ESP32_CAM板⼦的原理图右图可知,我的SD卡接到了ESP32的GPIO12 13 14 15 2 4 这6个脚上,根据前述,这符合SDMMC⽅式的IO连接。

SD卡读写操作详细说明

SD卡读写操作详细说明

SD卡读写操作详细说明51单⽚机实现对SD卡的读写SD卡SPI模式下与单⽚机的连接图:22.23.//获得16位的回应24. Read_Byte_SD(); //read the first byte,ignore it.25.do26. { //读取后8位27. tmp = Read_Byte_SD();28. retry++;29. }30.while((tmp==0xff)&&(retry<100));31.return(tmp);32.}2)初始化SD卡的初始化是⾮常重要的,只有进⾏了正确的初始化,才能进⾏后⾯的各项操作。

在初始化过程中,SPI的时钟不能太快,否则会造初始化失败。

在初始化成功后,应尽量提⾼SPI的速率。

在刚开始要先发送⾄少74个时钟信号,这是必须的。

在很多读者的实验中,很多是因为疏忽了这⼀点,⽽使初始化不成功。

随后就是写⼊两个命令CMD0与CMD1,使SD卡进⼊SPI 模式初始化时序图:初始化例程:1.//--------------------------------------------------------------------------2.初始化SD卡到SPI模式3.//--------------------------------------------------------------------------4.unsigned char SD_Init()5.{6.unsigned char retry,temp;7.unsigned char i;8.unsigned char CMD[] = {0x40,0x00,0x00,0x00,0x00,0x95};9. SD_Port_Init(); //初始化驱动端⼝10.11. Init_Flag=1; //将初始化标志置112.13.for (i=0;i<0x0f;i++)14. {15. Write_Byte_SD(0xff); //发送⾄少74个时钟信号16. }17.18.//向SD卡发送CMD019. retry=0;20.do21. { //为了能够成功写⼊CMD0,在这⾥写200次22. temp=Write_Command_SD(CMD);23. retry++;24.if(retry==200)25. { //超过200次26.return(INIT_CMD0_ERROR);//CMD0 Error!27. }28. }29.while(temp!=1); //回应01h,停⽌写⼊30.31.//发送CMD1到SD卡32. CMD[0] = 0x41; //CMD133. CMD[5] = 0xFF;34. retry=0;35.do36. { //为了能成功写⼊CMD1,写100次37. temp=Write_Command_SD(CMD);38. retry++;39.if(retry==100)40. { //超过100次41.return(INIT_CMD1_ERROR);//CMD1 Error!4.unsigned char Read_CSD_SD(unsigned char *Buffer)5.{6.//读取CSD寄存器的命令7.unsigned char CMD[] = {0x49,0x00,0x00,0x00,0x00,0xFF};8.unsigned char temp;9. temp=SD_Read_Block(CMD,Buffer,16); //read 16 bytes10.return(temp);11.}4)读取SD卡信息综合上⾯对CID与CSD寄存器的读取,可以知道很多关于SD卡的信息,以下程序可以获取这些信息。

ARDUINO入门及其简单实验7例

ARDUINO入门及其简单实验7例

ARDUINO入门及其简单实验(7例) (1)1. Arduino硬件开发平台简介 (1)1.1 Arduino的主要特色 (2)1.2 Arduino的硬件接口功能描述 (3)1.3 Arduino的技术性能参数 (3)1.4 电路原理图 (4)2. Arduino软件开发平台简介 (5)2.1 菜单栏 (5)2.2 工具栏 (6)2.3 Arduino 语言简介 (6)3. Arduino开发实例中所用部分器件 (8)1. LED简介 (8)2. 光敏电阻简介 (9)3. 直流电机简介 (9)4. 电位器简介 (10)4. Arduino平台应用开发实例 (10)4.1【实作项目一】利用LED作光敏电阻采样实验 (10)4.2【实作项目二】利用PWM信号控制LED亮度 (12)4.3【实作项目三】单键控制一只LED的亮灭 (15)4.4【实作项目四】利用PWM控制直流电机转速 (17)4.5【实作项目五】利用电位器手控LED亮度 (19)4.6【实作项目六】控制LED明暗交替 (21)4.7【实作项目七】利用光敏电阻控制LED的亮灭 (23)ARDUINO入门及其简单实验(7例)1. Arduino硬件开发平台简介Arduino硬件是一块带有USB的I/O接口板(其中包括13条数字I/O引脚,6通道模拟输出,6通道模拟输入),并且具有类似于Java、C语言的集成开发环境。

Arduino 既可以扩展一些外接的电子元器件,例如开关、传感器、LED、直流马达、步进马达或其他输入、输出装置;Arduino也可以独立运行,成为一个可以跟交互软件沟通的接口装置,例如:Flash、Processing、Max/MSP、VVVV或其他互动软件。

Arduino 开发环境IDE全部开放源代码,可以供大家免费下载、利用,还可以开发出更多激发人们制作欲望的互动作品。

如图1和图2所示,分别为Arduino硬件平台的实物图和电路布局图。

sd卡学习笔记之欧阳德创编

sd卡学习笔记之欧阳德创编

1、简介:SD卡(Secure Digital Memory Card)是一种为满足安全性、容量、性能和使用环境等各方面的需求而设计的一种新型存储器件,SD卡允许在两种模式下工作,即SD 模式和SPI模式,本系统采用SPI模式。

本小节仅简要介绍在SPI模式下,STM32处理器如何读写SD卡,如果读者如希望详细了解SD卡,可以参考相关资料。

SD 卡内部结构及引脚如下图所示:SD卡内部图.JPG2、SD卡管脚图:SD卡图.JPG3、SPI模式下SD各管脚名称为:sd 卡:SPI模式下SD各管脚名称为.JPG注:一般SD有两种模式:SD模式和SPI模式,管脚定义如下:(A)、SD MODE 1、CD/DATA3 2、CMD 3、VSS1 4、VDD 5、CLK 6、VSS2 7、DATA0 8、DATA1 9、DATA2(B)、SPI MODE 1、CS 2、DI 3、VSS 4、VDD 5、SCLK 6、VSS2 7、DO 8、RSV 9、RSVSD 卡主要引脚和功能为:CLK:时钟信号,每个时钟周期传输一个命令或数据位,频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz 的频率;CMD:双向命令和回复线,命令是一次主机到从卡操作的开始,命令可以是从主机到单卡寻址,也可以是到所有卡;回复是对之前命令的回答,回复可以来自单卡或所有卡;DAT0~3:数据线,数据可以从卡传向主机也可以从主机传向卡。

SD卡以命令形式来控制SD卡的读写等操作。

可根据命令对多块或单块进行读写操作。

在SPI模式下其命令由6个字节构成,其中高位在前。

SD卡命令的格式如表1所示,其中相关参数可以查阅SD卡规范。

4、MicroSD卡管脚图:MicroSD卡管脚图.JPG5、MicroSD卡管脚名称:MicroSD卡管脚名称.JPGSD 卡与MicroSD卡仅仅是封装上的不同,MicroSD 卡更小,大小上和一个SIM卡差不多,但是协议与SD 卡相同。

arduino学习笔记学习记录

arduino学习笔记学习记录

Arduino 学习笔录arduino 学习笔录 1 -什么是arduino?要认识 arduino 就先要认识什么是单片机,arduino 平台的基础就是AVR指令集的单片机。

1、什么是单片机?它与个人计算机有什么不一样?一台能够工作的计算机要有这样几个部份构成:中央办理单元CPU(进行运算、控制)、随机储存器RAM(数据储存)、储存器ROM(程序储存)、输入 / 输出设施 I/O (串行口、并行输出口等)。

在个人计算机(PC)上这些部份被分红若干块芯片,安装在一个被称之为主板的印刷线路板上。

而在单片机中,这些部份所有被做到一块集成电路芯片中了,因此就称为单片(单芯片)机,并且有一些单片机中除了上述部份外,还集成了其余部份如模拟量 / 数字量变换( A/D)和数字量 /模拟量变换( D/A)等。

2、单片机有什么用?实质工作中其实不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机莫非要用酷睿办理器吗?应用的关键是看能否够用,能否有很好的性能价钱比。

假如一台冰箱都需要用酷睿办理起来进行温度控制,那价钱就是天价了。

单片机往常用于工业生产的控制、生活中与程序和控制相关(如:电子琴、冰箱、智能空调等)的场合。

下列图就是一个 Atmega328P-PU单片机,鉴于 AVR指令集的 8 位办理器,频次 20MHz,储存器空间 32KB。

什么是 Arduino ?Arduino是一个能够用来感觉和控制现实物理世界的一套工具。

它由一个鉴于单片机并且开放源码的硬件平台,和一套为 Arduino 板编写程序的开发环境构成。

Arduino 能够用来开发交互产品,比方它能够读取大批的开关和传感器信号,并且能够控制各式各种的电灯、电机和其余物理设施。

Arduino 项目能够是独自的,也能够在运转时和你电脑中运转的程序(比如: Flash ,Processing , MaxMSP)进行通信。

Arduino 板你能够选择自己去手动组装或是购置已经组装好的;Arduino 开源的IDE 能够免费下载获取。

NodeMCU读写SD卡.上

NodeMCU读写SD卡.上

NodeMCU读写SD卡.上先选择你的型号选择demo该示例显示了如何记录来自三个模拟传感器的数据使用SD库将其复制到SD卡。

电路:模拟输入0、1和2上的模拟传感器SD卡连接到SPI总线的方法如下:** MOSI-引脚11** MISO-针脚12** CLK-针脚13** CS-针脚4这个是UNO的连接图得出一个结论,ESP的demo在瞎鸡儿写。

头打烂给你,在8266上面你找到这些引脚,屁股给你踢歪。

骂归骂,事还得办完。

我们可以知道,一次可以连接上三组spi,如果就看片选的引脚GPIO0是烧写的引脚,需要慎重。

也就是说,两个SPI的传感器,最少5根线~两个片选如果就一个SPI的话,可以少一根线。

因为就它一个设备,就不远选了这个图可以说是十分形象了问了半天,表述很重要。

有人教更重要,当然别的小伙伴了。

不一一道谢了SPI的通信原理很简单,它是全双工主从通信方式,这种模式下通常有一个主设备和一个或者多个从设备(注意,同一时刻,只有一个主设备和一个从设备进行通信),需要至少4根线,特殊情况下(单向传输时)3根线也可以。

SPI的器件工作在SPI规定下的两种基本模式,即SPI主模式和SPI从模式。

在一个SPI设备中,通常有如下表的几个引脚:主设备负责启动通信,负责输出时钟信号以及选择通信的从设备。

当有多个从设备的时候,因为每个从设备上都有一个CS引脚接入到主设备中,当我们主设备和某个从设备通信时将需要将从设备的CS引脚电平设置为低电平或者高电平(根据实际情况而定)。

数据的收发通过MISO和MOSI进行。

NodeMCU的SPI(注意与HSPI区分)引脚(SD0-SD3、CLK、CMD)专门用于与ESP-12E的外接flash芯片进行Quad-SPI通信,因此不能用于SPI应用。

基于ESP8266的NodeMcu具有HSPI,具有4个可用于SPI通信的引脚(GPIO12-GPIO15)。

通过这个SPI接口,我们可以将任何支持SPI的设备与NodeMcu连接起来,并与其进行通信里面的一组SPI已经挂存储芯片了,我们用的硬件只有一个了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本次实验使用arduino驱动SD卡,在SD卡中进行文件读写。

需要说明的是arduino的SD库文件,目前对2G以上的卡支持不是很好,所以推荐大家使用2G包含2G以下的,文件格式使用FAT格式。

这次我是用的是kingmax2G的MicroSD卡。

先看一下硬件连接图把下面代码下载进arduino 控制板 /*此例子展示如果记录三个模拟引脚数值到SD 卡,使用SD 库。

电路部分* 模拟引脚使用模拟口0,1,2大家可以根据情况接入模拟传感器,如果没有,也可以完成此实验,只不过数值是不停跳动的干扰源。

* SD卡与arduino控制板使用SPI总线连接** MOSI - pin 11** MISO - pin 12** CLK - pin 13** CS - pin 4*/#include <SD.h>// CS引脚为pin4,这里也沿用官方默认设置const int chipSelect = 4; //设定CS接口void setup(){Serial.begin(9600); //设置串口通信波特率为9600Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...pinMode(10, OUTPUT);if (!SD.begin(chipSelect)) { //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not presentSerial.println("Card failed, or not present");return;}Serial.println("card initialized."); //与SD卡通信成功,串口输出信息card initialized.}void loop(){// 定义数组String dataString = "";// 读取三个传感器值,写入数组for (int analogPin = 0; analogPin < 3; analogPin++) {int sensor = analogRead(analogPin);dataString += String(sensor);if (analogPin < 2) {dataString += ",";}}// 打开文件,注意在同一时间只能有一个文件被打开// 如果你要打开另一个文件,就需要先关闭前一个File dataFile = SD.open("datalog.txt", FILE_WRITE);// 打开datalog.txt文件,读写状态,位置在文件末尾。

if (dataFile) {dataFile.println(dataString);dataFile.close();// 数组dataString输出到串口Serial.println(dataString);}// 如果无法打开文件,串口输出错误信息error opening datalog.txtelse {Serial.println("error opening datalog.txt");}}复制代码下载完成后,打开串口监视器。

控制板开始工作后会看到如下画面,图中每一行上就是每次记录的三个传感器数值,本次实验并没有接传感器,所以数值是周围干扰源的杂乱信号。

关闭arduino电源后把SD卡取出,接入电脑后,可以看到SD卡中有一个DATALOG.TXT文件,打开后有可以看到,此文件中的信息就是记录下的各个传感器的数值。

第一个代码实验完以后,SD卡中的DATALOG.TXT不要删除,把下面代码下载进arduino中,打开串口监视器,看看效果。

/*这个例子展示如何通过SD库从SD卡中读取一个文件,并且把数据通过串口发送。

* SD卡与arduino控制板使用SPI总线连接** MOSI - pin 11** MISO - pin 12** CLK - pin 13** CS - pin 4*/#include <SD.h>// CS引脚为pin4,这里也沿用官方默认设置const int chipSelect = 4; //设定CS接口void setup(){Serial.begin(9600); //设置串口通信波特率为9600Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...pinMode(10, OUTPUT);if (!SD.begin(chipSelect)) { //如果从CS口与SD卡通信失败,串口输出信息Card failed, or not presentSerial.println("Card failed, or not present");// don't do anything more:return;}Serial.println("card initialized."); //与SD卡通信成功,串口输出信息card initialized.File dataFile = SD.open("datalog.txt"); //打开datalog.txt文件if (dataFile) {while (dataFile.available()) { //检查是否dataFile是否有数据Serial.write(dataFile.read()); //如果有数据则把数据发送到串口}dataFile.close(); //关闭dataFile}else {Serial.println("error opening datalog.txt"); //如果文件无法打开串口发送信息error opening datalog.txt}}void loop(){}复制代码可以看到,DATALOG.TXT文件中的数据都通过串口发送回了电脑。

效果如下图:再把下面的代码下载进arduino控制板中,打开串口监控器看看效果。

/*此例子展示如何在SD卡中创建于删除文件* SD卡与arduino控制板使用SPI总线连接** MOSI - pin 11** MISO - pin 12** CLK - pin 13** CS - pin 4*/#include <SD.h>File myFile;void setup(){Serial.begin(9600); //设置串口通信波特率为9600Serial.print("Initializing SD card..."); //串口输出数据Initializing SD card...pinMode(10, OUTPUT);if (!SD.begin(4)) { //如果从CS口与SD卡通信失败,串口输出信息initialization failed!Serial.println("initialization failed!");return;}Serial.println("initialization done."); //CS口与SD卡通信成功,串口输出信息initialization done.if (SD.exists("example.txt")) { //检查example.txt文件是否存在Serial.println("example.txt exists."); //如果存在输出信息example.txt exists.至串口}else {Serial.println("example.txt doesn't exist."); //不存在输出信息example.txt doesn't exist.至串口}Serial.println("Creating example.txt...");myFile = SD.open("example.txt", FILE_WRITE); //打开example.txt,如果没有自动创建,写入状态myFile.close(); //关闭文件if (SD.exists("example.txt")) {Serial.println("example.txt exists.");}else {Serial.println("example.txt doesn't exist.");}Serial.println("Removing example.txt...");SD.remove("example.txt"); //删除文件example.txtif (SD.exists("example.txt")){Serial.println("example.txt exists.");}else {Serial.println("example.txt doesn't exist.");}}void loop(){}复制代码下面图就是串口监视器显示的结果,显示文件创建于删除的过程。

再把下面的代码传入arduino控制板,看看效果#include <SD.h>File myFile;void setup(){Serial.begin(9600);Serial.print("Initializing SD card...");pinMode(10, OUTPUT);if (!SD.begin(4)) {Serial.println("initialization failed!");}Serial.println("initialization done.");myFile = SD.open("test.txt", FILE_WRITE);if (myFile) {Serial.print("Writing to test.txt..."); myFile.println("testing 1, 2, 3.");myFile.close();Serial.println("done.");} else {Serial.println("error opening test.txt"); }myFile = SD.open("test.txt");if (myFile) {Serial.println("test.txt:");while (myFile.available()) {Serial.write(myFile.read());}myFile.close();} else {Serial.println("error opening test.txt"); }}{}复制代码串口监视器中可以看到如下画面把SD卡接入电脑,可以在里面找到TEST.TXT文件,里面的内容如下。

相关文档
最新文档