我有一个Arduino或Teensy项目,我需要不断读取二进制文件中的字节" byte"来自SD卡的buf=file.read()
并以一定的稳定频率在端口操作(PORTD = buf
,...或PORTD = file.read()
循环内)输出。
我已经读过,由于SD卡延迟,file.read()
命令不会每次都在同一时间执行,因此输出频率将不稳定。当我一旦打开文件直到结束循环然后关闭文件,这种延迟是否会发生?
如果是这样,另一个解决方案是从SD卡读取每个512字节,并在结构according to that的帮助下将它们存储到buf数组中。现在的问题是每次读取512字节时我都要等待那些加上SD卡读取延迟。是否可以制作两个512字节的缓冲区数组 - >填写第一个 - >使用频率为10或20 Khz或更高的定时器中断内的第一个数组启动端口操作,因此输出始终具有稳定的频率,而在另一个循环中我尝试填充另一个数组?我的意思是可以打断" file.read(buf, size of(512))
"命令没有问题?
如果是这样,我如何处理平滑的数据速率并具有稳定的频率?
我相信微控制器音频播放器会出现同样的问题。他们从SD卡播放wav文件。请帮我。提前谢谢!
答案 0 :(得分:0)
我还没有编写代码,所以要说清楚,假设我有一个带有板载SD卡模块的小型3.6,可用于缓冲区的204800字节SRAM,这意味着我可以使用400个缓冲区从SD卡读取的每个块的512字节。
然后我做一个正在运行的定时器中断(例如50KHz)并同时向外推出8个引脚(任何一个PORTS可以与PORT操作一起使用)逐字节。同时,是否可以在执行端口操作的中断之外的剩余可用时间内从SD卡读取新块,以便始终有可用字节而不等待SD卡?
简而言之,当读取命令在某个时间开始时,它将被定时器中断函数中断以推出该字节然后返回它所在的位置。这可能吗?我认为麦克风音频播放器使用两个缓冲区的逻辑,一个被推出(DAC值),而另一个在第一个到达之前再次被填充。这就是44.4 Khz是最大8位wav播放的原因,因此没有任何缓冲器下溢而导致输出频率受到干扰。谢谢!