问题标签 [fatfs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
stm32 - STM32 + FatFS + SDIO + CubeMX
我试图通过 FatFS+SDIO 接口将 1bit 模式的 SD 卡连接到 Stm32l4。CubeMX 5.0 自动生成的代码。在 Cube 中启用和配置 DMA。当我调用像 f_mount() 或 f_open() 这样的 FatFS 函数时,我得到FR_DISK_ERR返回语句。低电平读取由DMA_Timeout返回。请帮我。
c - 使用C中的strtok将文本文件中的数据逐行读取到数组中
当前尝试使用 strtok 和空格作为分隔符逐行从文本文件中读取数据,并将信息保存到不同的数组中。我使用 FatFs 库从 sd 卡读取文件。Atm 我只尝试从该行中读取前 2 个元素。
我的文本文件如下所示:
我当前的代码是这样的:
输出atm是这样的:
ETC..
ETC..
读取一次后,它会将下一个位置的值 0 放入两个数组中,这不是我们想要的。它可能是一些基本的东西,但看不出有什么问题。
任何帮助都是有价值的!
c - 在 FATFS 之上运行的 MSP430 SD 卡应用程序显得过于严格。我的理解正确吗?
我正在研究 TI 为其 MSP530 LaunchPad 微控制器开发套件提供的 SD 卡应用代码示例。似乎该示例将目录数和文件数限制为每个 10 个(总共 100 个文件),这对于 32GB SD 卡来说似乎过于严格。当前代码编译为使用不到一半的程序空间和不到一半的可用 RAM。我想知道我是否误解了代码,或者代码是否受到其他原因的限制,例如内存中可用的堆栈大小。以下是代码和我的评论。
有几个层:SDCardLogMode、sdcard(SDCardLib)和ff(HAL层)。我已经减少了下面的代码来说明结构但不能运行 - 如果我理解正确并且我的增加允许文件和目录数量的解决方案有缺陷,我会更感兴趣。
SDCardLogMode.c 这里有两个有趣的地方。首先是 char dirs[10][MAX_DIR_LEN] 和 files[10][MAX_FILE_LEN] 的声明。MAX LEN 分别为 8 和 12,是名称的最大允许长度。
稍后在同一个 SDCardLogMode.c 文件中是以下函数(为了便于阅读也减少了)。这里有趣的是,代码调用了 SDCardLib_getDirectory(&sdCardLib, "data_log", dirs, &dirNum, files, &fileNum),它使用 "data_log" 路径并生成 dir,并更新 &dirNum、files 和 &fileNum。我不相信 &sdCardLib(它拥有 FATFS 的句柄和一个接口指针)在这个函数中使用。至少我不能说。
令人费解的是调用 SDCardLib_getDirectory() 然后不使用它产生的任何东西有什么意义?我没有发现 dirs 和 files char 数组的任何下游使用。我也没有发现 dirNum 和 fileNum 的任何用途。
在代码片段中,我展示了 SDCardLib_getDirectory() 的代码。我找不到 SDCardLib 参数的使用位置。如前所述,我发现没有使用 files 和 dirs 数组。我可以看到文件和目录计数可用于生成新名称的位置,但已经有静态变量来保存文件计数。谁能看到调用 SDCard_getDirectory() 的原因?
现在跳转到 sdcard.c(SDCardLib 层)查看 SDCardLib_getDirectory() 很有趣。它将数组指针分配给一维数组(例如 char (*fileList)[MAX_FILE_LEN] 并在每次写入文件名时对其进行索引)。这段代码看起来很脆弱,因为 SDCardLib_createDirectory() 只返回 f_mkdir(directoryName),它不检查已经存在多少文件。也许 TI 假设应该在 SDCardLogMode 之上的应用层进行这种检查......
下面是 SDCardLib_createDirectory(SDCardLib *lib, char *directoryName)。它只是创建一个目录,它不检查现有的文件数量。
所以回到我的问题:
我是否正确理解了这段代码,它真的将目录和文件的数量限制为 10 个吗?
如果是这样,为什么文件和目录的数量会如此有限?此示例代码附带的特定 MSP430 具有 256KB 的程序空间和 8KB 的 RAM。编译后的代码消耗不到一半的可用资源(68KB 的程序空间和大约 2.5KB 的 RAM)。是因为任何更大的都会溢出堆栈段吗?
我想增加可以存储的文件数量。如果我查看底层 FATFS 代码,它不会对文件或目录的数量施加限制(至少直到 sd 卡已满)。如果我从不打算在 MSP430 上显示或搜索目录的内容,我的想法是删除 SDCard_getDirectory() 和两个字符数组(文件和目录)。这会是一个坏主意吗?
stm32 - STM32+SD卡(FATFS和SPI)+物理连接+FR_NOT_READY
我是 stm 和 STM32CubeMX 世界的新手。到目前为止,我能够在温度传感器上成功实现 SPI 和 I2C。现在我尝试将数据写入 SD 卡,不幸的是到目前为止还没有成功。作为微控制器,我使用 STM32L073RZT6 和 Waveshare 的 SD 卡模块,它具有 SDIO 和 SPI 接口。我的问题是我还没有看到任何合理的文档告诉我如何正确地将 SD 卡连接到微控制器。在我之前的尝试中,我将微控制器连接到 SD 卡模块,如下所示:
- 3v3 <---> 3v3 (Pin1)
- 接地 <---> 接地(引脚 2)
- PB3 (SCK) <---> SCLK (pin 5)
- PB4 (MISO) <---> MISO (DO) (Pin 3)
- PB5 (MOSI) <---> MOSI (DI) (针脚 4)
- PA9 (GPIO 输出) <---> CS (Pin6)
Pin_configuration sd_card_back
我是否将 SD 卡正确连接到微控制器?什么是 CMD 和 CD?D0 到 D3 服务什么?SDIO 看起来如何从微控制器到 SD 卡的配置和物理连接?起初我使用 HAL_SPI_Transmit () 进行了尝试,最后使用了https://blog.domski.pl/using-fatfs-with-hal/中描述的以下代码。函数 f_open () 返回值 FR_NOT_READY。
我知道有 stm32 系列的项目示例,这对我没有帮助。
eclipse - 将使用 f_mount 创建的工作空间传递给另一个源文件
我正在尝试在 RTOS 中使用 FATFS 读取 SD 卡上的文件。该卡成功安装在 RTOS 中的单独源文件中,但是当我尝试在自己的源文件中使用 FatFs 操作时,我得到结果 FR_NOT_ENABLED。
这是一个有点奇怪的场景,需要一些背景知识:我是一名电子技术学生,承担了重新利用 MCU 及其专有 RTOS 的相当艰巨的任务。在 RTOS 中,已经有一个安装 SD 卡的源文件(我们称之为 sd.cpp)和另一个将传感器数据文件写入其中的文件(我们称之为 Sensors.cpp)。我已确保在我的源文件中包含所有相关的头文件(为了清楚起见,我们将其称为 myfile.cpp)。
我已经尝试了一些事情:第一个是直接在 myfile.cpp 中实现 f_mount 操作。这导致了 FR_DISK_ERR 结果,据我了解,这是因为它已经安装在另一个文件中,所以这显然不合适。从那里我尝试在 Sensors.cpp 中注释掉 SD 卡的所有实例,但这会打开一个真正的“蠕虫罐”,我宁愿保存它,直到用尽其他选项...
我相信归根结底是弄清楚如何将 SD 工作区从 sd.cpp 传递到 myfile.cpp。我试图研究 Sensors.cpp 以了解它是如何在那里完成的,但不幸的是,它的内容远远超出了我作为电子技术学生的理解范围。
这是一个使用 GNU-ARM 工具链和 OpenOCD 构建工具的 STM32L476RG。
代码都是非常标准的 FATFS 东西。SD.cpp中的SD挂载函数:
这将返回 FR_OK 并向 CLI 打印“SD Card Mounted”。
然后在myfile.cpp中有我自己的FatFs操作:
这在我在 sd.cpp 模块中运行 f_stat 操作时有效,确认这是在 myfile.cpp 中找不到文件系统对象的问题。
我还尝试在 sd.cpp 挂载函数中使用指针:
当我尝试这个时,我还添加了“extern FATFS* fs;”行 到 sd.h 文件。不幸的是,这也没有成功。
值得补充的是,我已经阅读了信息丰富的Fatfs 支持页面上的所有文档。
简而言之:我希望从 myfile.cpp 中的 f_stat(检查文件)中获得 FR_OK,以便继续前进。我希望这足够详细,因为我最后一次在这里提出这个问题的尝试很快(并且可以理解)被否决了!
c - STM32F429,FatFs,f_write。在几个条目 FR_DISK_ERR 之后,使用 f_write 在循环中创建大量文件
我正在尝试使用 f_write 函数形式的 FatFs libery 在循环中将大量文件保存在 SD 卡中,不幸的是,在最多 50 个循环条目后 f_write 返回 FR_DISK_ERR。
做一个测试花了 30 多分钟,所以我做了 Enity Test,在 SD 卡上保存了 10,000 个文件,程序仍然保存 < 50 个文件。
stm32 - 未定义对 f_opendir 的引用
我正在使用 elm chan 的 FATFS 文件系统从 STM32 上的 sd 卡中读取数据。
我得到一个未定义的对f_opendir
,f_readdir
和f_closedir
;的引用 但是,我可以使用其他的东西,比如,f_mount
和就好了。f_open
f_read
f_write
所有这些函数都在同一个.h
文件中,如果我打开其中任何一个的声明,它会将我直接带到定义它们的位置。那么,为什么它给了我未定义的参考?
osdev - 读取 FAT32 中的目录内容
我正在尝试在 RPI 3B 上编写裸机 FAT32 文件系统驱动程序。我能够使用 emmc 驱动程序读取 FAT 扇区和根目录扇区。
当下一个条目指针(下一个簇号)不适合当前的 FAT 扇区时,我对如何遵循 FAT 条目链表有疑问?每次获得新的簇号时是否应该读取 FAT 扇区?
我目前的理解如下: 获取目录/文件的第一个簇号(cluster_number) 读取包含 first_cluster_number 条目的 FAT 扇区。假设我将 FAT 扇区读为
当已经读取的 fat_sector 缓冲区(512 字节)中不存在下一个簇号时会发生什么?如果簇号 = fat_sector 中下一个条目的索引,鉴于 fat 32 条目跨越 4 个字节,我是否需要将其乘以 4。如果有人能给出一些明确的说明,那将很有帮助。提前致谢。
c++ - FatFS - 我可以创建多个查找位置吗?
我在基于 Cortex M4 的平台上运行的 C++ 应用程序中集成了 FatFS。
我的应用程序包括将数据记录到称为MDF的数据格式。
在实现方面,我将数据(到给定文件)成批地记录在缓冲区中;缓冲区的数量取决于我获取数据的速度: log batch of one buffer 。. . 做其他事情。. . 日志批处理五个缓冲区。. . 做其他事情。. . 等等
还有一个 24 字节的标头,包含数据的字节数。在 PC 上,我只会在测量结束时保存标头,但这是一种嵌入式产品,可以随时断电。如果我不定期保存标题,文件就会“损坏”。
因此,为了保持一致性,我需要在保存每批数据后重新保存标题,这就是我的问题所在。
这意味着我必须f_lseek
在写标题之前调用,然后再写这批数据。
我正在使用f_cache_fptr
所以f_lseek
速度并不慢,但我想避免需要f_lseek
如此频繁地打电话。
问题
是否有可能以某种方式拥有 2 个搜索位置,这样我就不需要f_seek
在标题位置和数据位置之间调用乒乓球?
我愿意修改 FatFS。
在底层,问题更简单,因为标头只与数据共享一个512 字节的扇区:24 字节的标头,然后是 488 字节的数据。
c - 为什么通过 SPI 将 CMD58 发送到我的 Class 10 SD 返回 0x01 而不是 0x00?
我正在尝试使用 SPI 总线和 STM32F4 探索板初始化 SD 卡。我主要依靠 Elm Chan 对示例代码中的 disk_initialize 函数的实现来建立自己的实现。不幸的是,我遇到了一个问题,在初始化过程中向 SD 卡发送 CMD58 返回结果为 0x01,这意味着 SD 卡处于空闲状态。但是,我仍然看到 SD 卡中接下来的四个字节为 0x00、0xFF、0x80、0x00,这是 R3 响应的正确格式。但是,我不确定是否可以信任这四个字节作为我的 OCR。
到目前为止,我已经尝试忽略 SD 卡处于空闲状态,而只是尝试使用接下来的四个字节作为 OCR,但在安装过程中,对于假设的卡类型,代码似乎在其他点失败OCR。
上面的代码段是我第一次看到空闲响应的地方。SD_SendCmd 是我将 CMD58 发送到 SD 卡的位置,并且我在其中接收 0x01 作为五字节响应的最左侧字节。因为我没有收到 0x00,这表明 SD 卡传递给它的命令没有问题,所以代码会中断初始化过程并返回错误。我将非常感谢您对此事的任何帮助,因为我已经被这个 0x01 返回值困扰了很长一段时间了。谢谢!