完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
不知原子哥SD卡写多个块的函数(SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count))通过了没,最近用原子例程里的SD卡驱动移植了FATFS,一次写超过512字节就写不成功
|
|
相关推荐
3个回答
|
|
|
|
|
|
稍微修改了下,终于可以多块写了,附上修改后的代码:
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count) { u8 r1; u16 i; u16 retry; //SPIx_SetSpeed(SPI_SPEED_HIGH);//设置为高速模式 if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//如果不是SDHC,给定的是sector地址,将其转换成byte地址 if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//如果目标卡不是MMC卡,启用ACMD23指令使能预擦除 r1 = SD_SendCommand(CMD25, sector, 0x00);//发多块写入指令 if(r1 != 0x00)return r1; //应答不正确,直接返回 SD_CS=0;//开始准备数据传输 SPIx_ReadWriteByte(0xff);//先放3个空数据,等待SD卡准备好 SPIx_ReadWriteByte(0xff); //--------下面是N个sector写入的循环部分 do { //放起始令牌0xFC 表明是多块写入 SPIx_ReadWriteByte(0xFC); //放一个sector的数据 for(i=0;i<512;i++) { SPIx_ReadWriteByte(*data++); } //发2个Byte的dummy CRC SPIx_ReadWriteByte(0xff); SPIx_ReadWriteByte(0xff); //等待SD卡应答 while( SPIx_ReadWriteByte(0xff)!=0xff) { retry++; if(retry==0xfffe) break; } // if((r1&0x1F)!=0x05) // { // SD_CS=1; //如果应答为报错,则带错误代码直接退出 // return r1; // } //等待SD卡写入完成 // if(SD_WaitDataReady()==1) // { // SD_CS=1; //等待SD卡写入完成超时,直接退出报错 // return 1; // } }while(--count);//本sector数据传输完成 //发结束传输令牌0xFD r1 = SPIx_ReadWriteByte(0xFD); if(r1==0x00) { count = 0xfe; } if(SD_WaitDataReady()) //等待准备好 { SD_CS=1; return 1; } //写入完成,片选置1 SD_CS=1; SPIx_ReadWriteByte(0xff); return count; //返回count值,如果写完则count=0,否则count=1 } |
|
|
|
引用自 2楼 584471964 的回复: 稍微修改了下,终于可以多块写了,附上修改后的代码:
u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count) { u8 r1; u16 i; u16 retry; //SPIx_SetSpeed(SPI_SPEED_HIGH);//设置为高速模式 if(SD_Type != SD_TYPE_V2HC)sector = sector<<9;//如果不是SDHC,给定的是sector地址,将其转换成byte地址 if(SD_Type != SD_TYPE_MMC) r1 = SD_SendCommand(ACMD23, count, 0x00);//如果目标卡不是MMC卡,启用ACMD23指令使能预擦除 r1 = SD_SendCommand(CMD25, sector, 0x00);//发多块写入指令 if(r1 != 0x00)return r1; //应答不正确,直接返回 SD_CS=0;//开始准备数据传输 SPIx_ReadWriteByte(0xff);//先放3个空数据,等待SD卡准备好 SPIx_ReadWriteByte(0xff); //--------下面是N个sector写入的循环部分 do { //放起始令牌0xFC 表明是多块写入 SPIx_ReadWriteByte(0xFC); //放一个sector的数据 for(i=0;i<512;i++) { SPIx_ReadWriteByte(*data++); } //发2个Byte的dummy CRC SPIx_ReadWriteByte(0xff); SPIx_ReadWriteByte(0xff); //等待SD卡应答 while( SPIx_ReadWriteByte(0xff)!=0xff) { retry++; if(retry==0xfffe) break; } // if((r1&0x1F)!=0x05) // { // SD_CS=1; //如果应答为报错,则带错误代码直接退出 // return r1; // } //等待SD卡写入完成 // if(SD_WaitDataReady()==1) // { // SD_CS=1; //等待SD卡写入完成超时,直接退出报错 // return 1; // } }while(--count);//本sector数据传输完成 //发结束传输令牌0xFD r1 = SPIx_ReadWriteByte(0xFD); if(r1==0x00) { count = 0xfe; } if(SD_WaitDataReady()) //等待准备好 { SD_CS=1; return 1; } //写入完成,片选置1 SD_CS=1; SPIx_ReadWriteByte(0xff); return count; //返回count值,如果写完则count=0,否则count=1 } |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1683 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1582 浏览 1 评论
1013 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
703 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1627 浏览 2 评论
1892浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
675浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
538浏览 3评论
558浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
526浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 04:30 , Processed in 0.821370 second(s), Total 52, Slave 45 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号