单片机为什么要接eeprom,单片机一般在什么时候写入eeprom

首页 > 实用技巧 > 作者:YD1662024-02-23 23:58:44

STM32F10x 系列控制器只支持 SD 卡规范版本 2.0,即只支持标准容量SD和高容量 SDHC 标准卡

,不支持超大容量 SDXC 标准卡,所以可以支持的最高卡容量是 32GB。SD 卡一般都支持 SDIO 和 SPI 这两种接口。另外,STM32F42x 系列控制器的 SDIO 是不支持 SPI通信模式的,如果需要用到 SPI通信只能使用 SPI外设。因为SPI通信方式操作SD卡的数据线只有一根,而如果用SDIO的通信方式操作SD卡的数据线却又3根。为了节省资源一般在STM32F10x 系列控制器上用SPI的通信方式,而在引脚资源比较多的F4系列上就用SDIO的通信方式了。

单片机为什么要接eeprom,单片机一般在什么时候写入eeprom(9)

单片机为什么要接eeprom,单片机一般在什么时候写入eeprom(10)

3.1初始化

1、初始化与SD卡连接的硬件条件(MCU的SPI配置,IO口配置);

2、上电延时(>74 个 CLK);

3、复位卡(CMD0),进入IDLE状态;

4、发送CMD8,检查是否支持2.0协议;

5、根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58 和 CMD1 等);

6、取消片选,发多 8个CLK,结束初始化

/******************************************************************************* * Function Name : SD_Init * Description : 初始化SD卡 * Input : None * Output : None * Return : u8 * 0:NO_ERR * 1:TIME_OUT * 99:NO_CARD *******************************************************************************/ u8 SD_Init(void) { u8 r1; // 存放SD卡的返回值 u16 retry; // 用来进行超时计数 u8 buf[4]; u16 i; SD_SPI_Init(); //初始化IO SD_SPI_SpeedLow(); //设置到低速模式 //先产生至少74个脉冲,让SD卡自己初始化完成 for(i=0;i<10;i ) { SD_SPI_WriteByte(0XFF);////80clks } //-----------------SD卡复位到idle开始----------------- //循环连续发送CMD0,直到SD卡返回0x01,进入IDLE状态 //超时则直接退出 retry=0; do { r1=SD_SendCmd(CMD0,0,0x95);//进入IDLE状态,作用是让SD卡进入SPI模式。这里的CRC校验位0x95是固定的,不能修改 retry ; }while((r1!=0X01) && (retry<20));//如果 SD 卡有正确的回应,代码就继续执行,如果没有回应程序就终止执行。 //跳出循环后,检查原因:初始化成功?or 重试超时? if(retry==20) return 1; //超时返回1 SD_Type=0;//默认无卡 //下面是V2.0卡的初始化 //其中需要读取OCR数据,判断是SD2.0还是SD2.0HC卡 if(r1==0X01) { if(SD_SendCmd(CMD8,0x1AA,0x87)==1)//SD V2.0 { //V2.0的卡,CMD8命令后会传回4字节的数据,要跳过再结束本命令 buf[0]=SD_SPI_ReadByte(); //should be 0x00 buf[1]=SD_SPI_ReadByte(); //should be 0x00 buf[2]=SD_SPI_ReadByte(); //should be 0x01 buf[3]=SD_SPI_ReadByte(); //should be 0xAA if(buf[2]==0X01&&buf[3]==0XAA)//判断卡是否支持2.7~3.6V的电压范围 { retry=0XFFFE; //发卡初始化指令CMD55 CMD41 do { SD_SendCmd(CMD55,0,0X01); //发送CMD55 r1=SD_SendCmd(CMD41,0x40000000,0X01);//发送CMD41 }while(r1&&retry--); //初始化指令发送完成,接下来获取OCR信息 //-----------鉴别SD2.0卡版本开始----------- if(retry&&SD_SendCmd(CMD58,0,0X01)==0)//鉴别SD2.0卡版本开始 { //读OCR指令发出后,紧接着是4字节的OCR信息 buf[0]=SD_SPI_ReadByte(); buf[1]=SD_SPI_ReadByte(); buf[2]=SD_SPI_ReadByte(); buf[3]=SD_SPI_ReadByte(); //检查接收到的OCR中的bit30位(CCS),确定其为SD2.0还是SDHC //如果CCS=1:为SDV2.0HC的2.0高容量卡 CCS=0:为SDV2.0的2.0版本的标准卡 if(buf[0]&0x40) SD_Type=SD_TYPE_V2HC; //检查CCS else SD_Type=SD_TYPE_V2; LCD_ShowNum(164,250,SD_Type,5,16);//显示SD卡容量 //-----------鉴别SD2.0卡版本结束----------- } } } //如果卡片版本信息是v1.0版本的,即r1=0x05,则进行以下初始化 else//SD V1.0/ MMC V3 { //先发CMD55,应返回0x01;否则出错 r1 = SD_SendCmd(CMD55,0,0X01); //发送CMD55 if(r1 != 0x01) return r1; //得到正确响应后,发ACMD41,应得到返回值0x00 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,发送MMC卡初始化命令 }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;//其他错误 } 3.2写数据通过 CMD24实现

1、发送CMD24;

2、接收卡响应R1;

3、发送写数据起始令牌 0XFE;

4、发送数据;

5、发送2字节的伪CRC;

6、禁止片选之后,发多8个CLK;

/******************************************************************************* * Function Name : SD_WriteDisk * Description : 向SD卡写数据 * Input : buf:数据缓存区 * sector:扇区 * cnt:扇区数 * Output : None * Return : u8 * 0:ok * 其他,失败. *******************************************************************************/ u8 SD_WriteDisk(u8*buf,u32 sector,u8 cnt) { u8 r1; if(SD_Type!=SD_TYPE_V2HC)sector *= 512;//转换为字节地址 if(cnt==1) { r1=SD_SendCmd(CMD24,sector,0X01);//读命令 if(r1==0)//指令发送成功 { r1=SD_SendBlock(buf,0xFE);//写512个字节 } }else { if(SD_Type!=SD_TYPE_MMC) { SD_SendCmd(CMD55,0,0X01); SD_SendCmd(CMD23,cnt,0X01);//发送指令 } r1=SD_SendCmd(CMD25,sector,0X01);//连续读命令 if(r1==0) { do { r1=SD_SendBlock(buf,0xFC);//接收512个字节 buf =512; }while(--cnt && r1==0); r1=SD_SendBlock(0,0xFD);//接收512个字节 } } SD_DisSelect();//取消片选,释放SPI总线 return r1; } 3.3读取数据通过 CMD17实现

1、发送CMD17;

2、接收卡响应R1;

3、接收数据起始令牌 0XFE;

4、接收数据;

5、接收2个字节的 CRC,如果不使用CRC,这两个字节在读取后可以丢掉。

6、禁止片选之后,发多8个CLK;

/*******************************************************************************
* Function Name : SD_ReadDisk
* Description : 读SD卡数据
* Input : buf:数据缓存区
* sector:扇区
* cnt:扇区数
* Output : None
* Return : u8
* 0:ok
* 其他,失败.
*******************************************************************************/

u8 SD_ReadDisk(u8*buf,u32 sector,u8 cnt)
{
u8 r1;
if(SD_Type!=SD_TYPE_V2HC)sector <<= 9;//转换为字节地址
if(cnt==1)
{
r1=SD_SendCmd(CMD17,sector,0X01);//读命令
if(r1==0)//指令发送成功
{
r1=SD_RecvData(buf,512);//接收512个字节
}
}else
{
r1=SD_SendCmd(CMD18,sector,0X01);//连续读命令
do
{
r1=SD_RecvData(buf,512);//接收512个字节
buf =512;
}while(--cnt && r1==0);
SD_SendCmd(CMD12,0,0X01); //发送停止命令
}
SD_DisSelect();//取消片选
return r1;
}

原文作者:果果小师弟

原文标题;你必须知道的单片机存储器的那些事!

原文链接:https://mp.weixin.qq.com/s/2OwwH9xf2L3cBafbu4FVxQ

上一页123末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.