-1

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

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

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

如果是这样,我怎样才能处理平滑的数据速率并拥有稳定的频率?

我相信微控制器音频播放器也会出现同样的问题。他们在哪里播放 SD 卡中的 wav 文件。请帮我。提前致谢!

4

1 回答 1

0

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

然后我做了一个定时器中断,它正在运行(例如以 50KHz)并逐字节同时推出到 8 个引脚(任何一个端口都可以与端口操作一起使用)。同时,是否可以在进行端口操作的中断之外的剩余可用时间内从 SD 卡读取新块,以便始终有可用字节而不等待 SD 卡?

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

于 2017-06-14T00:55:57.100 回答