2017-06-13 75 views
-1

我有一个Arduino或Teensy的项目,我需要从一个SD卡的二进制文件“字节”buf=file.read()不断读取字节,并通过端口操作进行输出(PORTD = buf,...或PORTD = file.read()循环)在一些稳定的频率。微控制器SD卡

我读过,因为SD卡的延迟,file.read()命令不会每次同时执行,所以输出频率不稳定。当我以一个循环读取文件直到结束并打开文件时,是否发生这种延迟?

如果是这样,另一种解决方案是从SD卡读取每个512字节,并借助struct 将它们存储到buf阵列中。现在的问题是,每当我读取512个字节时,我必须等待那些来自SD卡读取延迟。是否有可能创建两个512字节的缓冲区阵列 - >填充第一个 - >开始端口操作,使用频率为10或20 Khz或更高的定时器中断内的第一个阵列,所以输出始终具有稳定的频率而在另一个循环中,我尝试填充另一个数组?我的意思是有可能中断没有问题的“file.read(buf, size of(512))”命令吗?

如果是这样,我该如何处理平滑的数据速率和稳定的频率?

我相信单片机音频播放器也会出现同样的问题。他们从SD卡播放wav文件。请帮帮我。提前致谢!

+1

您没有提及您使用的是哪个确切的部分,因此没有人知道可用于执行您的任务的功能(例如SRAM,中断,I/O)。单独的Arduino系列涵盖了很多功能。拿出数据表并且具体,请,或者没有人能帮助。 – TomServo

回答

0

我还没有编写代码,所以要说清楚,假设我有一个13位的SD卡模块,带有可用的204800字节的SRAM缓冲区,这意味着我可以使用400个缓冲区从SD卡读取每个块的512字节。

然后我做一个定时器中断,它正在运行(例如在50KHz)并且逐字节地同时推出到8个引脚(任何一个端口可以用于PORT操作)。同时,是否可以在中断外的可用时间内从SD卡中读取新的数据块,以便总是有可用的字节而不是等待SD卡?

简而言之,当一个读命令在某个时候开始时,它将被一个定时器中断函数所中断,以推出该字节,然后返回到原来的位置。这可能吗?我认为麦克风音频播放器在两个缓冲区中使用该逻辑,一个被推出(DAC值),而另一个在第一个充满之前被填满。这就是为什么44.4KHz是最大8位wav播放的原因,所以没有任何缓冲器下溢,导致输出频率受到干扰。谢谢!