sd卡位置无法sd卡 写入到固定位置数据吗?

如何往外置sd卡中写入数据
[问题点数:60分,结帖人klordy_123]
本版专家分:52
结帖率 90.91%
CSDN今日推荐
本版专家分:52
结帖率 90.91%
本版专家分:3262
本版专家分:16038
2014年8月 移动开发大版内专家分月排行榜第一
2015年8月 移动开发大版内专家分月排行榜第三2014年9月 移动开发大版内专家分月排行榜第三2014年7月 移动开发大版内专家分月排行榜第三
本版专家分:52
结帖率 90.91%
本版专家分:52
结帖率 90.91%
本版专家分:52
结帖率 90.91%
本版专家分:16038
2014年8月 移动开发大版内专家分月排行榜第一
2015年8月 移动开发大版内专家分月排行榜第三2014年9月 移动开发大版内专家分月排行榜第三2014年7月 移动开发大版内专家分月排行榜第三
本版专家分:52
结帖率 90.91%
本版专家分:23061
2014年11月论坛优秀版主
2014年6月 移动开发大版内专家分月排行榜第一2014年3月 移动开发大版内专家分月排行榜第一
2014年11月 移动开发大版内专家分月排行榜第二2014年4月 移动开发大版内专家分月排行榜第二2014年2月 移动开发大版内专家分月排行榜第二
2014年5月 移动开发大版内专家分月排行榜第三
本版专家分:52
结帖率 90.91%
本版专家分:426
本版专家分:426
本版专家分:426
本版专家分:52
结帖率 90.91%
本版专家分:0
本版专家分:0
匿名用户不能发表回复!|
CSDN今日推荐后使用快捷导航没有帐号?
请完成以下验证码
查看: 3004|回复: 25
通过stm32L152给SD卡创建文本,但是数据无法写入成功
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
本帖最后由 y 于
11:03 编辑
刚开始学习文件系统,给单片机移植了fat文件系统,出现了这样一个问题,我创建了一个文本文件(比如说是y.txt),然后给这个文本文件写入一段文本,通过电脑查看SD卡里的内容,显示这个文本文件(y.txt)显示还是0字节;
2.png (75.69 KB, 下载次数: 0)
10:59 上传
同时连接是会出现修复U盘的提示。也就是说往文本文件里写数据没有成功。
但是如果我通过电脑给这个文本文件写一句话,保存后是这样的
1.png (79.44 KB, 下载次数: 0)
10:59 上传
接下来我在通过单片机给这个文件进行写数据,那么我写的数据量不能超过这个文本文件的13字节,不超过的部分,可以通过电脑正常显示,也可以通过单片机读文件操作。超过的部分通过电脑查看,或者单片机读文件操作读是不成功看不到的
Hello astroturfers
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
问题已经变向的解决了,换成了官方例子下包含的FATFS版本可以用了,谢谢大家帮助
Hello astroturfers
在线时间1542 小时
威望6512分
芯币24156枚
E金币400枚
TA的帖子TA的资源
读一下扇区看看问题出在哪里了
&&&&&&&&&&
在线时间4356 小时
威望6973分
芯币11918枚
E金币405枚
TA的帖子TA的资源
贴一贴你C语言操作读写文件的代码
EEWORLD开发板置换群:,——电工们免费装β的天堂,虽然在群里买不到板子,但是可以学会开车;虽然学不到技术,但是可以学会开车;商家勿入!加群暗号:喵
在线时间459 小时
芯币8879枚
TA的帖子TA的资源
纯净的硅(初级), 积分 685, 距离下一级还需 115 积分
纯净的硅(初级), 积分 685, 距离下一级还需 115 积分
单独读写扇区&&正常嘛
在线时间1542 小时
威望6512分
芯币24156枚
E金币400枚
TA的帖子TA的资源
怀疑你没有修改文件长度
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
单独读写扇区&&正常嘛
Hello astroturfers
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
怀疑你没有修改文件长度
Hello astroturfers
在线时间721 小时
E金币131枚
TA的帖子TA的资源
一粒金砂(中级), 积分 194, 距离下一级还需 6 积分
一粒金砂(中级), 积分 194, 距离下一级还需 6 积分
贴出代码看看行不行,我原来出现过只能创建文件,不能读写文件,是因为读写函数有问题。
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
void Test_f_write(void)//写数据到文件,如果没有此文件则创建文件
{
& & FATFS& && && && &// Work area (file system object) for logical drive
& & FRESULT& && && &// FatFs function common result code
& & & & FIL Make_
& & char file_name[20]=&jj.txt&;
& & char Storage_buffer[] =&&;& & & &
& & & & UINT
& & & & //检测磁盘是否插好
& & & & if( disk_detect_OK()==FALSE )
& & & &&&logout(&\r\n inaert_ok:&&);
& & // Register a work area for logical drive 0
& & f_mount(0, &fs);
& & & & logout(&\r\n Make file Name:&&);
//& & & & USART_Scanf_Name(file_name);//通过串口输入源文件路径名/dir/file.txt或者0:dir/file.txt或者0:/dir/file.txt
& &res = f_open(&Make_file, file_name,&&FA_OPEN_ALWAYS | FA_WRITE); //可写方式打开 没有文件则创建
& & & &&&logout(&\r\n open_ok:&&);
& & & &&&die(res);
& &res = f_lseek(&Make_file, bsize); //指针移到文件最后&&
& &logout(&\r\n seek_ok:&&);
& & & &&&die(res);
& & & &&&res = f_write(&Make_file, Storage_buffer, (sizeof (Storage_buffer))-1 , &bw); //每次需要写入的数据字节数,去掉最后的\0所以-1&&
& &logout(&\r\n write_ok:&&);
& & & &&&die(res);
& & & &&&//logout(&文件大小=%d字节\r\n&,Make_file.fsize);
& & & & res = f_lseek(&Make_file, Make_file.fsize); //指针移到文件最后&&
& & & & //logout(&文件大小=%d字节\r\n&,Make_file.fsize);
& & & & f_close(&Make_file);//关闭文件
& & & & logout(&\r\n close_ok:&&);
&&//logout(&文件大小=%d字节\r\n&,Make_file.fsize);
& & & & logout(&\r\n写文件测试OK!\r\n&);
& & & & // Unregister a work area before discard it
& &f_mount(0, NULL);
}
//其中调用的f_wriite函数如下
FRESULT f_write (
& & FIL *fp,& && && && &/* Pointer to the file object */
& & const void *buff,& & /* Pointer to the data to be written */
& & UINT btw,& && && && &/* Number of bytes to write */
& & UINT *bw& && && && &/* Pointer to number of bytes written */
)
{
& & FRESULT
& & DWORD clst,
& & UINT wcnt,
& & const BYTE *wbuff =
& &
&&bsize+=
& & *bw = 0;& & /* Initialize byte counter */
& & logout(&1111111\r\n&);
& & res = validate(fp-&fs, fp-&id);& && && && &/* Check validity */
& & fp-&fsize =fp-&fsize +
& & logout(&wenjian=%d\r\n&,fp-&fsize);
& & //f_sync (fp);
& & if (res != FR_OK) LEAVE_FF(fp-&fs, res);
& & if (fp-&flag & FA__ERROR)& && && && && & /* Aborted file? */
& && &&&LEAVE_FF(fp-&fs, FR_INT_ERR);
& & logout(&22\r\n&);
& & if (!(fp-&flag & FA_WRITE))& && && && && & /* Check access mode */
& && &&&LEAVE_FF(fp-&fs, FR_DENIED);
& & if ((DWORD)(fp-&fsize + btw) & fp-&fsize) btw = 0;& & /* File size cannot reach 4GB */
& &logout(&\r\n&);
& & for ( ;&&& && && && && && && && && & /* Repeat until all data written */
& && &&&wbuff += wcnt, fp-&fptr += wcnt, *bw += wcnt, btw -= wcnt) {
& && && && &logout(&44444\r\n&);
& && &&&if ((fp-&fptr % SS(fp-&fs)) == 0)
& && &&&{& & /* On the sector boundary? */
& && && && &
& && && && &csect = (BYTE)(fp-&fptr / SS(fp-&fs) & (fp-&fs-&csize - 1));& & /* Sector offset in the cluster */
& && && && &if (!csect)
& && && && && & {
& && && && && && &&&/* On the cluster boundary? */
& && && && && & if (fp-&fptr == 0) {& && &&&/* On the top of the file? */
& && && && && && &&&clst = fp-&& && &&&/* Follow from the origin */
& && && && && && &&&if (clst == 0)& && && && &/* When no cluster is allocated, */
& && && && && && && && &fp-&sclust = clst = create_chain(fp-&fs, 0);& & /* Create a new cluster chain */
& && && && && & } else {& && && && && && &&&/* Middle or end of the file */
#if _USE_FASTSEEK
& && && && && && &&&if (fp-&cltbl)
& && && && && && && && &clst = clmt_clust(fp, fp-&fptr);& & /* Get cluster# from the CLMT */
& && && && && && &&&else
#endif
& && && && && && &&&
& && && && && && && && &clst = create_chain(fp-&fs, fp-&clust);& & /* Follow or stretch cluster chain on the FAT */
& && && && && & }
& && && && && & if (clst == 0)& && &&&/* Could not allocate a new cluster (disk full) */
& && && && && & if (clst == 1) ABORT(fp-&fs, FR_INT_ERR);& &
& && && && && && && && &
& && && && && & if (clst == 0xFFFFFFFF) ABORT(fp-&fs, FR_DISK_ERR);
& && && && && & fp-&clust =& && && && &/* Update current cluster */
& && && && && & //fp-&pad1 = 0;
& && && && &}
& && && && &
#if _FS_TINY
& && && && &if (fp-&fs-&winsect == fp-&dsect && move_window(fp-&fs, 0))& & /* Write-back sector cache */
& && && && && & ABORT(fp-&fs, FR_DISK_ERR);
#else
& && && && &if (fp-&flag & FA__DIRTY) {& && &&&/* Write-back sector cache */
& && && && && & if (disk_write(fp-&fs-&drv, fp-&buf, fp-&dsect, 1) != RES_OK)
& && && && && && &&&ABORT(fp-&fs, FR_DISK_ERR);
& && && && && & fp-&flag &= ~FA__DIRTY;
& && && && &}
#endif
& && && && &sect = clust2sect(fp-&fs, fp-&clust);& & /* Get current sector */
& && && && &if (!sect) ABORT(fp-&fs, FR_INT_ERR);
& && && && &sect +=
& && && && &cc = btw / SS(fp-&fs);& && && && &/* When remaining bytes &= sector size, */
& && && && &if (cc) {& && && && && && && && &/* Write maximum contiguous sectors directly */
& && && && && & if (csect + cc & fp-&fs-&csize)& & /* Clip at cluster boundary */
& && && && && && &&&cc = fp-&fs-&csize -
& && && && && & if (disk_write(fp-&fs-&drv, wbuff, sect, (BYTE)cc) != RES_OK)
& && && && && && &&&ABORT(fp-&fs, FR_DISK_ERR);
#if _FS_TINY
& && && && && & if (fp-&fs-&winsect - sect & cc) {& & /* Refill sector cache if it gets invalidated by the direct write */
& && && && && && &&&mem_cpy(fp-&fs-&win, wbuff + ((fp-&fs-&winsect - sect) * SS(fp-&fs)), SS(fp-&fs));
& && && && && && &&&//logout(&tiny&);
& && && && && && &&&fp-&fs-&wflag = 0;
& && && && && & }
#else
& && && && && & if (fp-&dsect - sect & cc) { /* Refill sector cache if it gets invalidated by the direct write */
& && && && && && &&&mem_cpy(fp-&buf, wbuff + ((fp-&dsect - sect) * SS(fp-&fs)), SS(fp-&fs));
& && && && && && &&&//logout(&no tiny&);
& && && && && && &&&fp-&flag &= ~FA__DIRTY;
& && && && && & }
#endif
& && && && && & wcnt = SS(fp-&fs) *& && &&&/* Number of bytes transferred */
& && && && && &
& && && && &}
#if _FS_TINY
& && && && &if (fp-&fptr &= fp-&fsize) {& & /* Avoid silly cache filling at growing edge */
& && && && && & if (move_window(fp-&fs, 0)) ABORT(fp-&fs, FR_DISK_ERR);
& && && && && & fp-&fs-&winsect =
& && && && &}
#else
& && && && &if (fp-&dsect != sect) {& && &&&/* Fill sector cache with file data */
& && && && && & if (fp-&fptr & fp-&fsize &&
& && && && && && &&&disk_read(fp-&fs-&drv, fp-&buf, sect, 1) != RES_OK)
& && && && && && && && &ABORT(fp-&fs, FR_DISK_ERR);
& && && && &}
#endif
& && && && &fp-&dsect =
& && &&&}
& && &&&logout(&555555\r\n&);
& && &&&wcnt = SS(fp-&fs) - (fp-&fptr % SS(fp-&fs));/* Put partial sector into file I/O buffer */
& && &&&if (wcnt & btw) wcnt =
#if _FS_TINY
& && &&&if (move_window(fp-&fs, fp-&dsect))& & /* Move sector window */
& && && && &ABORT(fp-&fs, FR_DISK_ERR);
& && &&&mem_cpy(&fp-&fs-&win[fp-&fptr % SS(fp-&fs)], wbuff, wcnt);& & /* Fit partial sector */
& && &&&fp-&fs-&wflag = 1;
#else
& && &&&mem_cpy(&fp-&buf[fp-&fptr % SS(fp-&fs)], wbuff, wcnt);& & /* Fit partial sector */
& && &&&fp-&flag |= FA__DIRTY;
#endif
& & }
& & if (fp-&fptr & fp-&fsize)
& & fp-&fsize = fp-&& & /* Update file size if needed */
& & fp-&flag |= FA__WRITTEN;& && && && && && && && &/* Set file change flag */
& & LEAVE_FF(fp-&fs, FR_OK);
}
//感觉涉及的函数有点多,不知道该贴些啥。。。
复制代码
Hello astroturfers
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
贴出代码看看行不行,我原来出现过只能创建文件,不能读写文件,是因为读写函数有问题。
贴了一段代码不知道能不能看出些什么问题
Hello astroturfers
在线时间721 小时
E金币131枚
TA的帖子TA的资源
一粒金砂(中级), 积分 194, 距离下一级还需 6 积分
一粒金砂(中级), 积分 194, 距离下一级还需 6 积分
使用的SPI吗?贴出来那部分代码看看!
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
使用的SPI吗?贴出来那部分代码看看!void SD_LowLevel_DeInit(void)
{
&&GPIO_InitTypeDef&&GPIO_InitS
&&
&&SPI_Cmd(SD_SPI, DISABLE); /*!& SD_SPI disable */
&&SPI_DeInit(SD_SPI);& &/*!& DeInitializes the SD_SPI */
&&
&&/*!& SD_SPI Periph clock disable */
&&RCC_APB1PeriphClockCmd(SD_SPI_CLK, DISABLE);
&&/*!& Configure SD_SPI pins: SCK */
&&GPIO_InitStructure.GPIO_Pin = SD_SPI_SCK_PIN;
&&GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
&&GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
&&GPIO_Init(SD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);
&&/*!& Configure SD_SPI pins: MISO */
&&GPIO_InitStructure.GPIO_Pin = SD_SPI_MISO_PIN;
&&GPIO_Init(SD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);
&&/*!& Configure SD_SPI pins: MOSI */
&&GPIO_InitStructure.GPIO_Pin = SD_SPI_MOSI_PIN;
&&GPIO_Init(SD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);
&&/*!& Configure SD_SPI_CS_PIN pin: SD Card CS pin */
&&GPIO_InitStructure.GPIO_Pin = SD_CS_PIN;
&&GPIO_Init(SD_CS_GPIO_PORT, &GPIO_InitStructure);
&&/*!& Configure SD_SPI_DETECT_PIN pin: SD Card detect pin */
//&&GPIO_InitStructure.GPIO_Pin = SD_DETECT_PIN;
//&&GPIO_Init(SD_DETECT_GPIO_PORT, &GPIO_InitStructure);
}复制代码SPI初始化,应该没有什么问题,sd卡 的读文件,创建文件,和删除文件功能都是正常的
SD_Error SD_Init(void)
{
& & & & uint32_t i = 0;
& & & & uint8_t r1 = 0;
& & & & uint16_t retry = 0;
& & & & uint8_t buf[4];
&&//SPI_InitTypeDef& &SPI_InitS&&
& & & & //logout(&sd init\r\n&);
&&/*!& Initialize SD_SPI */
& &for(i=0;i&0xf00;i++);
& & & & //logout(&SD_LowLevel_Init done\r\n&);
&&/*!& SD chip select high */
& &SPI2_SetSpeed(SPI_BaudRatePrescaler_256);
&&/*!& Send dummy byte 0xFF, 10 times with CS high */
&&/*!& Rise CS and MOSI for 80 clocks cycles */
&&for(i=0;i&10;i++)SD_ReadWriteByte(0XFF);//发送最少74个脉冲
& & & & retry=20;
& & & & do
& & & & {
& & & & & & & & r1 = SD_SendCmd1(SD_CMD_GO_IDLE_STATE,0,0x95);//进入IDLE状态
& & & & }while((r1!=0X01) && retry--);
& & & & //logout(&SD_idle_pass\r\n&);
& & & & //logout(&R1 = %d\r\n&,r1);
& & & & SD_Type=0;//默认无卡
& & & &
& & & & if(r1==0X01)
& & & & {
& & & & & & & & //logout(&1111&);
& & & & & & & & if(SD_SendCmd1(SD_CMD_SEND_IF_COND,0x1AA,0x87)==1)//SD V2.0
& & & & & & & & {
& & & & & & & & & & & & for(i=0;i&4;i++)buf[i]=SD_ReadWriteByte(0XFF);& & & & //Get trailing return value of R7 resp
& & & & & & & & & & & & if(buf[2]==0X01&&buf[3]==0XAA)//卡是否支持2.7~3.6V
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & retry=0XFFFE;
& & & & & & & & & & & & & & & & do
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & SD_SendCmd1(55,0,0X01);& & & & //发送CMD55
& & & & & & & & & & & & & & & & & & & & r1=SD_SendCmd1(41,0xX01);//发送CMD41
& & & & & & & & & & & & & & & & }while(r1&&retry--);
& & & & & & & & & & & & & & & & if(retry&&SD_SendCmd1(58,0,0X01)==0)//鉴别SD2.0卡版本开始
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & for(i=0;i&4;i++)buf[i]=SD_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
& & & & & & & & {
& & & & & & & & & & & & //logout(&222&);
& & & & & & & & & & & & SD_SendCmd1(55,0,0X01);& & & & & & & & //发送CMD55
& & & & & & & & & & & & r1=SD_SendCmd1(41,0,0X01);& & & & //发送CMD41
& & & & & & & & & & & & if(r1&=1)
& & & & & & & & & & & & {& & & & & & & &
& & & & & & & & & & & & & & & & SD_Type=SD_TYPE_V1;
& & & & & & & & & & & & & & & & retry=0XFFFE;
& & & & & & & & & & & & & & & & do //等待退出IDLE模式
& & & & & & & & & & & & & & & & {
& & & & & & & & & & & & & & & & & & & & SD_SendCmd1(55,0,0X01);& & & & //发送CMD55
& & & & & & & & & & & & & & & & & & & & r1=SD_SendCmd1(41,0,0X01);//发送CMD41
& & & & & & & & & & & & & & & & }while(r1&&retry--);
& & & & & & & & & & & & }else//MMC卡不支持CMD55+CMD41识别
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & SD_Type=SD_TYPE_MMC;//MMC V3
& & & & & & & & & & & & & & & & logout(&MMC&);
& & & & & & & & & & & & & & & & retry=0XFFFE;
& & & & & & & & & & & & & & & & do //等待退出IDLE模式
& & & & & & & & & & & & & & & & {& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &&&
& & & & & & & & & & & & & & & & & & & & r1=SD_SendCmd1(1,0,0X01);//发送CMD1
& & & & & & & & & & & & & & & & }while(r1&&retry--);&&
& & & & & & & & & & & & }
& & & & & & & & & & & & if(retry==0||SD_SendCmd1(16,512,0X01)!=0)SD_Type=SD_TYPE_ERR,logout(&fau&);//错误的卡
& & & & & & & & }
& & & & }
& & & & SD_DisSelect();//取消片选
& & & & SPI2_SetSpeed(SPI_BaudRatePrescaler_2);
& & & & if(SD_Type)
& & & & {
& & & & & & & & //logout(&0&);& & & &
& & & & & & & & return 0;
& & & & }
& & & & else if(r1)
& & & & {
& & & & & & & & logout(&R1 = %d\r\n&,r1);&&
& & & & & & & & return r1;
& & & & }& & & &
SD卡 的初始化仿照f103的写的
uint8_t SD_SendCmd1(uint8_t&&cmd, uint32_t&&arg, uint8_t&&crc)
{
&&uint8_t r1;& & & &
& & & & uint8_t Retry=0;
& & & & SD_DisSelect();//取消上次片选
& & & & if(SD_Select())return 0XFF;//片选失效
& & & & //发送
& & SD_ReadWriteByte(cmd | 0x40);//分别写入命令
& & SD_ReadWriteByte(arg && 24);
& & SD_ReadWriteByte(arg && 16);
& & SD_ReadWriteByte(arg && 8);
& & SD_ReadWriteByte(arg);& & & && &
& & SD_ReadWriteByte(crc);
& & & & if(cmd==SD_CMD_STOP_TRANSMISSION)SD_ReadWriteByte(0xff);//Skip a stuff byte when stop reading
& & //等待响应,或超时退出
& & & & Retry=0X1F;
& & & & do
& & & & {
& & & & & & & & r1=SD_ReadWriteByte(0xff);
& & & & }while((r1&0X80) && Retry--);& & & &&&
& & & & //返回状态值
& & return r1;
}
///////////////////////////////////////////////////////////////////////////////////
//取消选择,释放SPI总线
void SD_DisSelect(void)
{
& & & & SD_CS_HIGH();
& & & & SD_ReadWriteByte(0xff);//提供额外的8个时钟
}
//选择sd卡,并且等待卡准备OK
//返回值:0,成功;1,失败;
uint8_t SD_Select(void)
{
& & & & SD_CS_LOW();
& & & & if(SD_WaitReady()==0)return 0;//等待成功
& & & & SD_DisSelect();
& & & & return 1;//等待失败
}
//等待卡准备好
//返回值:0,准备好了;其他,错误代码
uint8_t SD_WaitReady(void)
{
& & & & uint32_t t=0;
& & & & do
& & & & {
& & & & & & & & if(SD_ReadWriteByte(0XFF)==0XFF)return 0;//OK
& & & & & & & & t++;& & & & & & & && && & & &
& & & & }while(t&0XFFFFFF);//等待
& & & & return 1;
}
uint32_t&&SD_GetSectorCount(void)
{
& & uint8_t csd[16];
& & uint32_t&&C&&
& & uint8_t&&n;
& & & && &uint16_t&&&&& & & & & & & & & & & & & & & & & & & && &&&
& & & & //取CSD信息,如果期间出错,返回0
& & if(SD_GetCSD(csd)!=0)
& & & & & & & & {
& & & & & & & & & & & & logout(&csd fail\r\n&);
& & & & & & & & & & & & return 0;
& & & & & & & & }& & & && &&&
& & //如果为SDHC卡,按照下面方式计算
& & if((csd[0]&0xC0)==0x40)& & & &&&//V2.00的卡
& & {& & & &
& & & & & & & & csize = csd[9] + ((uint16_t)csd[8] && 8) + 1;
& & & & & & & & Capacity = (uint32_t)csize && 10;//得到扇区数& & & &&&& & & & & & & && &
& & }else//V1.XX的卡
& & {& & & &
& & & & & & & & n = (csd[5] & 15) + ((csd[10] & 128) && 7) + ((csd[9] & 3) && 1) + 2;
& & & & & & & & csize = (csd[8] && 6) + ((uint16_t)csd[7] && 2) + ((uint16_t)(csd[6] & 3) && 10) + 1;
& & & & & & & & Capacity= (uint32_t)csize && (n - 9);//得到扇区数& &
& & }
& & return C
}
//获取SD卡的CSD信息,包括容量和速度信息
//输入:uint8_t *cid_data(存放CID的内存,至少16Byte)& & & && &&&
//返回值:0:NO_ERR
//& & & & & & & &&&1:错误& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && &
uint8_t SD_GetCSD(uint8_t *csd_data)
{
& & uint8_t r1;& & & &&&
& & & && &logout(&gCSD1\r\n&);
& & r1 = SD_SendCmd1(SD_CMD_SEND_CSD,0,0x01);//发CMD9命令,读CSD
& & & && &logout(&gCSD2\r\n&);
& & if(r1==0)
& & & & {
& & & & & & r1= SD_RecvData(csd_data, 16);//接收16个字节的数据
& & }
& & & & SD_DisSelect();//取消片选
& & & & if(r1)return 1;
& & & & else return 0;
}
//从sd卡读取一个数据包的内容
//buf:数据缓存区
//len:要读取的数据长度.
//返回值:0,成功;其他,失败;& & & &
uint8_t SD_RecvData(uint8_t *buf,uint16_t len)
{& & & & & & & & & & & && && & & && &
& & & & if(SD_GetResponse(0xFE))return 1;//等待SD卡发回数据起始令牌0xFE
& & while(len--)//开始接收数据
& & {
& && &&&*buf=SD_ReadWriteByte(0xFF);
& && &&&buf++;
& & }
& & //下面是2个伪CRC(dummy CRC)
& & SD_ReadWriteByte(0xFF);
& & SD_ReadWriteByte(0xFF);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && && & & & & & & & & & & & & & & & & & & && &&&
& & return 0;//读取成功
}
void SPI2_SetSpeed(uint8_t SpeedSet)
{
& & & & SPI_InitStructure.SPI_BaudRatePrescaler = SpeedS
&&SPI_Init(SPI2, &SPI_InitStructure);
& & & & SPI_Cmd(SPI2,ENABLE);
}
//读SD卡
//buf:数据缓存区
//sector:扇区
//cnt:扇区数
//返回值:0,其他,失败.
uint8_t SD_ReadDisk(uint8_t*buf,uint32_t sector,uint8_t cnt)
{
& & & & uint8_t r1;
& & & & if(SD_Type!=SD_TYPE_V2HC)sector &&= 9;//转换为字节地址
& & & & if(cnt==1)
& & & & {
& & & & & & & & r1=SD_SendCmd1(SD_CMD_READ_SINGLE_BLOCK,sector,0X01);//读命令
& & & & & & & & if(r1==0)//指令发送成功
& & & & & & & & {
& & & & & & & & & & & & r1=SD_RecvData(buf,512);//接收512个字节& & & && &
& & & & & & & & }
& & & & }else
& & & & {
& & & & & & & & r1=SD_SendCmd1(SD_CMD_READ_MULT_BLOCK,sector,0X01);//连续读命令
& & & & & & & & do
& & & & & & & & {
& & & & & & & & & & & & r1=SD_RecvData(buf,512);//接收512个字节& & & &&&
& & & & & & & & & & & & buf+=512;&&
& & & & & & & & }while(--cnt && r1==0); & & & &
& & & & & & & & SD_SendCmd(SD_CMD_STOP_TRANSMISSION,0,0X01);& & & & //发送停止命令
& & & & }& &
& & & & SD_DisSelect();//取消片选
& & & & return r1;//
}
//写SD卡
//buf:数据缓存区
//sector:起始扇区
//cnt:扇区数
//返回值:0,其他,失败.
uint8_t SD_WriteDisk(const uint8_t*buf,uint32_t sector,uint8_t cnt)
{
& & & & uint8_t r1;
& & & & if(SD_Type!=SD_TYPE_V2HC)sector *= 512;//转换为字节地址
& & & & if(cnt==1)
& & & & {
& & & & & & & & r1=SD_SendCmd1(SD_CMD_WRITE_SINGLE_BLOCK,sector,0X01);//读命令
& & & & & & & & if(r1==0)//指令发送成功
& & & & & & & & {
& & & & & & & & & & & & r1=SD_SendBlock(buf,0xFE);//写512个字节& & & && &
& & & & & & & & }
& & & & }else
& & & & {
& & & & & & & & if(SD_Type!=SD_TYPE_MMC)
& & & & & & & & {
& & & & & & & & & & & & SD_SendCmd1(55,0,0X01);& & & &
& & & & & & & & & & & & SD_SendCmd1(SD_CMD_SET_BLOCK_COUNT,cnt,0X01);//发送指令& & & &
& & & & & & & & }
& & & & & & & & r1=SD_SendCmd1(SD_CMD_WRITE_MULT_BLOCK,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();//取消片选
& & & & return r1;//
}& & & &
uint8_t SD_SendBlock(const uint8_t *buf,uint8_t cmd)
{& & & &
& & & & uint16_t&&t;& & & & & & & && && & & && &
& & & & if(SD_WaitReady())return 1;//等待准备失效
& & & & SD_ReadWriteByte(cmd);
& & & & if(cmd!=0XFD)//不是结束指令
& & & & {
& & & & & & & & for(t=0;t&512;t++)SD_ReadWriteByte(buf[t]);//提高速度,减少函数传参时间
& & & && &&&SD_ReadWriteByte(0xFF);//忽略crc
& & & && &&&SD_ReadWriteByte(0xFF);
& & & & & & & & t=SD_ReadWriteByte(0xFF);//接收响应
& & & & & & & & if((t&0x1F)!=0x05)return 2;//响应错误& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && && & & & & & & & & & & & & & & & & & & && &&&
& & & & }& & & & & & & & & & & & & & & & & & & & & & & &&&& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & && && & & & & & & & & & & & & & & & & & & && &&&
& & return 0;//写入成功
}复制代码
后面的这些也是照着写的
Hello astroturfers
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
使用的SPI吗?贴出来那部分代码看看!
就是感觉好像,我进行写操作时,文件没有空间给我往下写的,不知道是不是那里是不是缺了什么操作
Hello astroturfers
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
使用的SPI吗?贴出来那部分代码看看!
FR_DISK_ERR,& & & & & & & & & & & & /* (1) A hard error occured in the low level disk I/O layer */进入f_write函数会有这个报错的返回值
Hello astroturfers
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
FR_DISK_ERR,& & & & & & & & & & & & /* (1) A hard error occured in the low level disk I/O layer */进入f_write函数会有这个报错的返回值
Hello astroturfers
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
FR_DISK_ERR,& & & & & & & & & & & & /* (1) A hard error occured in the low level disk I/O layer */进入f_write函数会有这个报错的返回值
Hello astroturfers
在线时间721 小时
E金币131枚
TA的帖子TA的资源
一粒金砂(中级), 积分 194, 距离下一级还需 6 积分
一粒金砂(中级), 积分 194, 距离下一级还需 6 积分
单步运行,看看哪里有错误!
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
单步运行,看看哪里有错误!
9楼贴的代码100那一行会报disk_err
Hello astroturfers
在线时间2186 小时
芯币3338枚
TA的帖子TA的资源
在第一次使用SD卡之前,格式化一下,用f_mkfs函数格式化,在用f_mount挂在SD卡,以后就不用在格式化
在线时间435 小时
芯币1246枚
E金币419枚
TA的帖子TA的资源
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
一粒金砂(高级), 积分 240, 距离下一级还需 260 积分
在第一次使用SD卡之前,格式化一下,用f_mkfs函数格式化,在用f_mount挂在SD卡,以后就不用在格式化
刚刚特地试了一些,写完之后,tf卡在插到电脑上直接就让格式化。。。
Hello astroturfers
EEWORLD 官方微信
Powered by

我要回帖

更多关于 sd卡的数据无法删除 的文章

 

随机推荐