如何使用可用于PSoC 5LP (32位皮质M3)芯片的带DMA的SPI写入SD卡?
我目前有一个DMA和SPI /rx对工作,但是为了不同的目的,所以如果实际的传输不是问题,我只是不知道如何与SDcard交互。
PSoC 5LP的数据表在这里。
基本信息:
我在简单模式下使用DMA,DMA TD链设置为:8位宽,4字节脉冲自动完成完整的TD (只需要初始的HW请求)循环回到初始TD的开始,然后等待HW请求。
SPI是在gui中初始化的,我使用16 The时钟、8位tx/rx传输和4 Byte /rx缓冲区来设置它。中断是设置在rx FIFO满,连接到他们是一个rx DMA。
SDcard SPI /tx的指针分别为SPIM_RX_PTR和SPIM_TX_PTR。DMA与他们之间的传输。我要传输的数组是SDcardout和SDcardin。
发布于 2015-12-29 19:33:15
拥有SPI通信只会使您获得对卡的最低命令/块级别的访问;您将需要一个文件系统。SD卡预先格式化为FAT32格式,因此FAT文件系统将提供最大的可比性,并不是最大的可靠性(例如,如果写入被断电或重置,则可能导致损坏)。它还具有实现起来相对简单、所需资源很少的优点。
有几个商业和开源的FAT文件系统库可用。我建议您查看榆树法特福或榆树小胖子,它们都有许可的许可证,并且都有详细的文档。在每种情况下,您只需实现磁盘I/O存根来将它们映射到SPI驱动程序。网站上有大量的例子、文档和应用程序说明来帮助你。您可以从另一个目标的SPI实现示例开始,并将其调整为您的驱动程序(或者调整您的驱动程序)。其他FAT文件系统库与此大体相似,需要I/O层实现。
ELM的磁盘层不是特定于媒体的,因此您实际上需要在该层和SPI驱动程序之间增加一个MMC/SD层。您不太可能为您的特定目标找到一个示例,但是可以从其他目标的示例中找到工作,因为基于SPI的MMC/SD本身并不是目标特定的,硬件依赖只出现在SPI级别和卡检测和写保护(可选)信号的GPIO实现上。对于各种ARM目标这里,PSoC support 这里的一个项目有几个例子(在撰写本文时,这显然是一个正在进行的工作)。
发布于 2016-03-20 19:47:09
我正是在这个问题上做了工作。
我发现,与PSoC 5组件库一起提供的现有SPI模块不适合大容量地传输到SD卡。据我所知,在软件中清除每个字节传输的SPI模块标志是必要的,这使得DMA没有多大用处。我认为一种解决方案是使用两个TDs (传输描述符)--一个用于执行数据传输,另一个用于在第一个TD完成后清除RX标志--无论如何,这是一个非主题。
我还发现,组件库中提供的emFile组件的功能有限。我看不到任何方式连接DMA,即使我可以,它的时钟速度似乎是非常差的。最重要的是,emFile需要编译时选择FAT16或FAT32,将您的设计限制在一个或另一个文件系统上。
由于我不喜欢更复杂的DMA设置,所以我决定在UDB编辑器中设计自己的SPI组件硬件。包含组件的项目可以在:https://github.com/PolyVinalDistillate/NSDSPI中找到。
这结合了上面提到的优秀的FatFS库(感谢ChaN),它负责处理FAT12、FAT16和FAT32格式化的卡片。如前所述,没有文件系统层,您将只访问每个512字节的原始数据块。使用FatFS,您可以得到fopen()、fclose()等的类似类。
如果您查看我在PSoC Creator中的组件,您会发现它实际上由两个组件组成:一个是实现主SPI逻辑的专用UDB组件,另一个是将我的UDB组件连接到DMA和某些控制逻辑的原理图。第二个组件还有包含我的硬件特定代码的API文件,它是要放到TopDesign原理图中的组件。
FatFS作为预编译库包括在内,API文件夹中的LowLevelFilesys.h提供对所有文件函数的访问。
此组件的设计考虑到了大容量读取,API为read执行了以下操作:
写卡是以一种更典型的方式进行的,DMA只是在准备SD卡之后将数据发送到SPI模块。
如果您在PSoC系统上运行我的项目,它将在SD卡上执行读/写测试,保存一个报告规范的文件:
Testing Speed
Writing 16000 bytes to file, non-DMA
Took 94 ms
Rate 1361 kbps
Reading 16000 bytes to file, non-DMA
Took 50 ms
Verifying... All Good! :D
Rate 2560 kbps
Writing 16000 bytes to file, DMA
Took 17 ms
Rate 7529 kbps
Reading 16000 bytes to file, DMA
Took 12 ms
Verifying... All Good! :D
Rate 10666 kbps有些SD卡给出了更好的结果,而有些则更糟糕。我相信这是由于SD卡本身(如阶级,使用,年龄等)。
https://stackoverflow.com/questions/34514923
复制相似问题