硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5574|回复: 10
收起左侧

[有问必答] SPIDMA接收18Kb数据,通过FatFS写入TF卡出现写入失败

[复制链接]

8

主题

34

回帖

58

积分

初级会员

积分
58
发表于 2020-9-27 19:34:56 | 显示全部楼层 |阅读模式
如题所示,项目需要设计一个模块,通过SPIDMA接收数据并以txt文件储存到TF卡里面,数据量每次18Kb,每秒接收最多30次。通过V5开发板例程102和107a实现了相关功能,自己配置了SPIDMA接收,能够实现相关功能,通过串口打印发现会出现文件写入失败,通过示波器看波形,发现文件写入超时,后续数据已经到了,但还在写文件,造成数据丢失。不知道写入失败和写入超时这种情况如何是怎样造成的,大家能给予一些意见吗,如何解决相关问题,谢谢。

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 8楼经验分享!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
发表于 2020-9-28 08:18:54 | 显示全部楼层
关于文件系统实时写入问题,咨询过的人很多,后面有必要做个专题研究了
http://www.armbbs.cn/forum.php?m ... 8160&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

8

主题

34

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2020-9-29 16:02:32 | 显示全部楼层
现在解决了写入失败的问题,是由文件名命名使用了一些特殊字符造成的,另外没有按照8.3格式命名文件名也会造成写失败。每次18Kb,每秒写入10个文件,写了两千多文件全部成功但写到后面超时严重,写一个,丢失两个。每秒写一次的话比较稳定,现在的想法是新建文件后写入十次,再关闭文件,看看是否可以避免文件过多写超时的问题。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
发表于 2020-9-30 09:34:11 | 显示全部楼层
junlianzi 发表于 2020-9-29 16:02
现在解决了写入失败的问题,是由文件名命名使用了一些特殊字符造成的,另外没有按照8.3格式命名文件名也会 ...

实时写入是要花点心思的。
回复

使用道具 举报

6

主题

636

回帖

654

积分

金牌会员

积分
654
QQ
发表于 2020-9-30 11:50:39 | 显示全部楼层
18kbytes * 30 = 540 kbytes * 8 = 4320 kbits,这速度要求很高啊,关键还是SPI,试试SDIO接口吧
回复

使用道具 举报

8

主题

34

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2020-10-24 15:05:35 | 显示全部楼层
应该是KB,打错了
回复

使用道具 举报

8

主题

34

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2020-10-24 15:07:15 | 显示全部楼层
已经采用硬汉例程里的SDIO DMA了
回复

使用道具 举报

8

主题

34

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2020-10-24 15:59:38 | 显示全部楼层
采用F405RGT6,SPI DMA接收数据,SDIO DMA写入TF卡,程序中定义5*18*1024的三维数组作为缓冲队列,采用读写分离的方式。
现在60ms接收一次,每秒接收平均16.67次,每次18KB,每1000次数据存在一个文件内。多次测试,能达到接收三万次数据无误不丢失,基本满足了需求。后续还会再进一步测试。
简单分享一下实时写入的一些注意事项:
(1) TF卡品质要好,不同厂家的性能差异很大,建议买闪迪等厂家的高速TF卡。
(2) 根据写入数据需求对TF卡分配单元大小进行格式化,TF卡在FAT32格式化分配单元大小最大为64KB,实时写入建议格式化为64KB,实测不同大小对实时性有很大影响。
(3) 文件系统中创建文件和关闭文件的时间不确定,开关次数过多可能造成某次耗时过长,影响后续数据写入,所以采用每1000次数据写入一个文件的方式,减少
     对文件的开关次数。
(4) 随着写入数据的增多,和文件数目的增多,TF卡的写入速度会越来越慢,同样大小的数据,写入的时间也不确定,所以采用队列进行FIFO缓冲。

基本就是这些,TF卡在数据量较大,写入频率较高时实时写入还是比较有难度的,如果数据量较小频率较低的话还是比较稳定的,做过很多测试。
简单几句话,却是花费了大量时间精力调试测试得到的,记录一下,希望对大家有所帮助。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106708
QQ
发表于 2020-10-25 01:01:06 | 显示全部楼层
junlianzi 发表于 2020-10-24 15:59
采用F405RGT6,SPI DMA接收数据,SDIO DMA写入TF卡,程序中定义5*18*1024的三维数组作为缓冲队列,采用读写 ...

谢谢分享经验,很详细。
回复

使用道具 举报

8

主题

34

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2020-12-22 14:57:24 | 显示全部楼层
使用两个月,说一下使用的一些事项,
1. 1000次保存一次数据改为100次保存一次数据,不会降低稳定性。
2. 使用中多次保存超过50000次数据,数据不丢失不错位。
3. 注意SPI连接线的长度以及电源的稳定性,在一台较老的机器进行测试时,经常出现数据丢失和错位的情况,
    怀疑是由于SPI连接线过长且没有屏蔽层,换用了较短的连接线,情况得到了一定改善,但数据依然会出问
    题,对比其他机器发现可能是由于机器电源不稳定造成的问题。建议SPI连接线使用屏蔽线,电源问题暂时
    未解决,
回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2022-11-7 17:15:16 | 显示全部楼层
junlianzi 发表于 2020-10-24 15:59
采用F405RGT6,SPI DMA接收数据,SDIO DMA写入TF卡,程序中定义5*18*1024的三维数组作为缓冲队列,采用读写 ...

您好,非常感谢你的经验。
我目前也在做跟您很相似的事情,不同的是我的写入频率更高,每次写入的数据量更大(40次每秒,每次写入20Kbyte),我在长时间写入时会随机遇到FR_DISK_ERR问题,关闭当前文件创建新文件再写入后ERROR消失。经过调试发现是在f_write函数里(或者之前)有某些操作使得文件对象fp->err置为了1,导致报错。
请问您有遇到过这种情况吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-30 11:13 , Processed in 0.532349 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表