专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
利用STM32Cube移植FatFs文件系统,f_Open返回FR_NOT_READY
2019-07-14 13:59
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
10355
7
1240
新手移植FatFs文件系统,利用
STM32
Cube,初始化SPI2,选择PB9作为片选信号,没用使用cube自带的fatfs文件系统;问题如标题所示,f_Open返回FR_NOT_READY,通过断点调试,发现在调用SD_Init()函数中,发送CMD0,让SD进入IDLE状态时,返回值不是0x01;调试了一周,也没找到问题所在。【系统时钟160MHz,SPI2所在的APBH1时钟为40MHz,SD卡为16G的SDHC卡】,跪求指导;
代码见楼下:
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
60user125
2019-07-15 15:51
由于字数限制,3部分没传完,只能补一部分啦,Part4:
/*******************************************************************************
* Function Name : SD_ReadMultiBlock
* Description : ¶ÁSD¿¨µÄ¶à¸öblock
* Input : u32 sector È¡µØÖ·£¨sectorÖµ£¬·ÇÎïÀíµØÖ·£©
* u8 *buffer Êý¾Ý´æ´¢µØÖ·£¨´óСÖÁÉÙ512byte£©
* u8 count Á¬Ðø¶Ácount¸öblock
* Output : None
* Return : u8 r1
* 0£º ³É¹¦
* other£ºÊ§°Ü
*******************************************************************************/
u8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count)
{
u8 r1;
//ÉèÖÃΪ¸ßËÙģʽ
SPI_SetSpeed(SPI_SPEED_LOW);
//Èç¹û²»ÊÇSDHC£¬½«sectorµØַת³ÉbyteµØÖ·
if(SD_Type!=SD_TYPE_V2HC)
{
sector = sector<<9;
}
//SD_WaitReady();
//·¢¶Á¶à¿éÃüÁî
r1 = SD_SendCommand(CMD18, sector, 0);//¶ÁÃüÁî
if(r1 != 0x00)
{
return r1;
}
//¿ªÊ¼½ÓÊÕÊý¾Ý
do
{
if(SD_ReceiveData(buffer, 512, NO_RELEASE) != 0x00)
{
break;
}
buffer += 512;
} while(--count);
//È«²¿´«ÊäÍê±Ï£¬·¢ËÍÍ£Ö¹ÃüÁî
SD_SendCommand(CMD12, 0, 0);
//ÊÍ·Å×ÜÏß
SD_CS_DISABLE();
SPI_ReadWriteByte(0xFF);
if(count != 0)
{
return count; //Èç¹ûûÓд«Í꣬·µ»ØÊ£Óà¸öÊý
}
else
{
return 0;
}
}
/*******************************************************************************
* Function Name : SD_WriteMultiBlock
* Description : дÈëSD¿¨µÄN¸öblock
* Input : u32 sector ÉÈÇøµØÖ·£¨sectorÖµ£¬·ÇÎïÀíµØÖ·£©
* u8 *buffer Êý¾Ý´æ´¢µØÖ·£¨´óСÖÁÉÙ512byte£©
* u8 count дÈëµÄblockÊýÄ¿
* Output : None
* Return : u8 r1
* 0£º ³É¹¦
* other£ºÊ§°Ü
*******************************************************************************/
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count)
{
u8 r1;
u16 i=0;
//ÉèÖÃΪ¸ßËÙģʽ
SPI_SetSpeed(SPI_SPEED_LOW);
//Èç¹û²»ÊÇSDHC£¬¸ø¶¨µÄÊÇsectorµØÖ·£¬½«Æäת»»³ÉbyteµØÖ·
if(SD_Type != SD_TYPE_V2HC)
{
sector = sector<<9;
}
//Èç¹ûÄ¿±ê¿¨²»ÊÇMMC¿¨£¬ÆôÓÃACMD23Ö¸ÁîʹÄÜÔ¤²Á³ý
if(SD_Type != SD_TYPE_MMC)
{
r1 = SD_SendCommand(ACMD23, count, 0x00);
}
//·¢¶à¿éдÈëÖ¸Áî
r1 = SD_SendCommand(CMD25, sector, 0x00);
if(r1 != 0x00)
{
return r1; //Ó¦´ð²»ÕýÈ·£¬Ö±½Ó·µ»Ø
}
//¿ªÊ¼×¼±¸Êý¾Ý´«Êä
SD_CS_ENABLE();
//ÏÈ·Å3¸ö¿ÕÊý¾Ý£¬µÈ´ýSD¿¨×¼±¸ºÃ
SPI_ReadWriteByte(0xff);
SPI_ReadWriteByte(0xff);
//--------ÏÂÃæÊÇN¸ösectorдÈëµÄÑ»·²¿·Ö
do
{
//·ÅÆðʼÁîÅÆ0xFC ±íÃ÷ÊǶà¿éдÈë
SPI_ReadWriteByte(0xFC);
//·ÅÒ»¸ösectorµÄÊý¾Ý
for(i=0;i<512;i++)
{
SPI_ReadWriteByte(*data++);
}
//·¢2¸öByteµÄdummy CRC
SPI_ReadWriteByte(0xff);
SPI_ReadWriteByte(0xff);
//µÈ´ýSD¿¨Ó¦´ð
r1 = SPI_ReadWriteByte(0xff);
if((r1&0x1F)!=0x05)
{
SD_CS_DISABLE(); //Èç¹ûÓ¦´ðΪ±¨´í£¬Ôò´ø´íÎó´úÂëÖ±½ÓÍ˳ö
return r1;
}
//µÈ´ýSD¿¨Ð´ÈëÍê³É
if(SD_WaitReady()==1)
{
SD_CS_DISABLE(); //µÈ´ýSD¿¨Ð´ÈëÍê³É³¬Ê±£¬Ö±½ÓÍ˳ö±¨´í
return 1;
}
//±¾sectorÊý¾Ý´«ÊäÍê³É
}while(--count);
//·¢½áÊø´«ÊäÁîÅÆ0xFD
r1 = SPI_ReadWriteByte(0xFD);
if(r1==0x00)
{
count = 0xfe;
}
if(SD_WaitReady())
{
while(1)
{
}
}
//дÈëÍê³É£¬Æ¬Ñ¡ÖÃ1
SD_CS_DISABLE();
SPI_ReadWriteByte(0xff);
return count; //·µ»ØcountÖµ£¬Èç¹ûдÍêÔòcount=0£¬·ñÔòcount=1
}
加载中...
查看其它7个回答
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
/*******************************************************************************
* Function Name : SD_ReadMultiBlock
* Description : ¶ÁSD¿¨µÄ¶à¸öblock
* Input : u32 sector È¡µØÖ·£¨sectorÖµ£¬·ÇÎïÀíµØÖ·£©
* u8 *buffer Êý¾Ý´æ´¢µØÖ·£¨´óСÖÁÉÙ512byte£©
* u8 count Á¬Ðø¶Ácount¸öblock
* Output : None
* Return : u8 r1
* 0£º ³É¹¦
* other£ºÊ§°Ü
*******************************************************************************/
u8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count)
{
u8 r1;
//ÉèÖÃΪ¸ßËÙģʽ
SPI_SetSpeed(SPI_SPEED_LOW);
//Èç¹û²»ÊÇSDHC£¬½«sectorµØַת³ÉbyteµØÖ·
if(SD_Type!=SD_TYPE_V2HC)
{
sector = sector<<9;
}
//SD_WaitReady();
//·¢¶Á¶à¿éÃüÁî
r1 = SD_SendCommand(CMD18, sector, 0);//¶ÁÃüÁî
if(r1 != 0x00)
{
return r1;
}
//¿ªÊ¼½ÓÊÕÊý¾Ý
do
{
if(SD_ReceiveData(buffer, 512, NO_RELEASE) != 0x00)
{
break;
}
buffer += 512;
} while(--count);
//È«²¿´«ÊäÍê±Ï£¬·¢ËÍÍ£Ö¹ÃüÁî
SD_SendCommand(CMD12, 0, 0);
//ÊÍ·Å×ÜÏß
SD_CS_DISABLE();
SPI_ReadWriteByte(0xFF);
if(count != 0)
{
return count; //Èç¹ûûÓд«Í꣬·µ»ØÊ£Óà¸öÊý
}
else
{
return 0;
}
}
/*******************************************************************************
* Function Name : SD_WriteMultiBlock
* Description : дÈëSD¿¨µÄN¸öblock
* Input : u32 sector ÉÈÇøµØÖ·£¨sectorÖµ£¬·ÇÎïÀíµØÖ·£©
* u8 *buffer Êý¾Ý´æ´¢µØÖ·£¨´óСÖÁÉÙ512byte£©
* u8 count дÈëµÄblockÊýÄ¿
* Output : None
* Return : u8 r1
* 0£º ³É¹¦
* other£ºÊ§°Ü
*******************************************************************************/
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count)
{
u8 r1;
u16 i=0;
//ÉèÖÃΪ¸ßËÙģʽ
SPI_SetSpeed(SPI_SPEED_LOW);
//Èç¹û²»ÊÇSDHC£¬¸ø¶¨µÄÊÇsectorµØÖ·£¬½«Æäת»»³ÉbyteµØÖ·
if(SD_Type != SD_TYPE_V2HC)
{
sector = sector<<9;
}
//Èç¹ûÄ¿±ê¿¨²»ÊÇMMC¿¨£¬ÆôÓÃACMD23Ö¸ÁîʹÄÜÔ¤²Á³ý
if(SD_Type != SD_TYPE_MMC)
{
r1 = SD_SendCommand(ACMD23, count, 0x00);
}
//·¢¶à¿éдÈëÖ¸Áî
r1 = SD_SendCommand(CMD25, sector, 0x00);
if(r1 != 0x00)
{
return r1; //Ó¦´ð²»ÕýÈ·£¬Ö±½Ó·µ»Ø
}
//¿ªÊ¼×¼±¸Êý¾Ý´«Êä
SD_CS_ENABLE();
//ÏÈ·Å3¸ö¿ÕÊý¾Ý£¬µÈ´ýSD¿¨×¼±¸ºÃ
SPI_ReadWriteByte(0xff);
SPI_ReadWriteByte(0xff);
//--------ÏÂÃæÊÇN¸ösectorдÈëµÄÑ»·²¿·Ö
do
{
//·ÅÆðʼÁîÅÆ0xFC ±íÃ÷ÊǶà¿éдÈë
SPI_ReadWriteByte(0xFC);
//·ÅÒ»¸ösectorµÄÊý¾Ý
for(i=0;i<512;i++)
{
SPI_ReadWriteByte(*data++);
}
//·¢2¸öByteµÄdummy CRC
SPI_ReadWriteByte(0xff);
SPI_ReadWriteByte(0xff);
//µÈ´ýSD¿¨Ó¦´ð
r1 = SPI_ReadWriteByte(0xff);
if((r1&0x1F)!=0x05)
{
SD_CS_DISABLE(); //Èç¹ûÓ¦´ðΪ±¨´í£¬Ôò´ø´íÎó´úÂëÖ±½ÓÍ˳ö
return r1;
}
//µÈ´ýSD¿¨Ð´ÈëÍê³É
if(SD_WaitReady()==1)
{
SD_CS_DISABLE(); //µÈ´ýSD¿¨Ð´ÈëÍê³É³¬Ê±£¬Ö±½ÓÍ˳ö±¨´í
return 1;
}
//±¾sectorÊý¾Ý´«ÊäÍê³É
}while(--count);
//·¢½áÊø´«ÊäÁîÅÆ0xFD
r1 = SPI_ReadWriteByte(0xFD);
if(r1==0x00)
{
count = 0xfe;
}
if(SD_WaitReady())
{
while(1)
{
}
}
//дÈëÍê³É£¬Æ¬Ñ¡ÖÃ1
SD_CS_DISABLE();
SPI_ReadWriteByte(0xff);
return count; //·µ»ØcountÖµ£¬Èç¹ûдÍêÔòcount=0£¬·ñÔòcount=1
}
一周热门 更多>