据我了解,FIFO(在硬件上下文中)是一个缓冲区,将根据先进先出原则进行管理。您依次将一些位放入其中,然后可以在达到所需阈值时逐块读取它们。但是我对STM32串行音频接口的FIFO管理感到困惑:
根据数据表,串行音频接口(SAI)支持最多8个字的FIFO。 (8x32位)SAI的数据寄存器(SAI_xDR)为1个字(32位)。该文档说明
只要FIFO未满,对该寄存器的写操作将加载FIFO。
如果FIFO不为空,则对该寄存器的读取将清空FIFO。
如何解释?
我的猜测是:如果我对该寄存器进行写访问,则将寄存器内容(32位块)作为第一个字加载到FIFO中,然后在第二次写访问时,将第二个字加载到FIFO中,以此类推。然后,当我进行读取访问时,它将返回队列中的第一个单词,然后返回第二个单词,依此类推。是这样吗?
如果是这样,当我将少于32位写入寄存器时会发生什么情况?即我写了一个16位的块。然后我再写一个16位。两个位块共享一个字还是将它们转移为单独的字?如果我读一个单词,我会得到两个16位块还是只有第一个16位?我不了解FIFO如何知道我填充到数据寄存器中的位序列的大小。还是在每次写访问时总是占用整个32位?
答案 0 :(得分:1)
我的猜测是:如果我对该寄存器进行写访问,……对吗?
是的,你是对的。
据我了解,每个FIFO字都包含一个SAI插槽/来自一个SAI插槽的数据,而与数据大小无关。 FIFO与32位移位寄存器连接,而移位计数取决于数据大小。
似乎可以使用例如8 < data_size <= 16
的16位数据访问SAI_xDR的下半部分,但是无论如何,整个32位FIFO字都将用于传输,而其中只有data_size
位每个字都会移入/移出。
36.3.9串行音频接口(SAI)内部FIFO
...
每个FIFO是8字FIFO。无论访问大小如何,每次对FIFO的读/写操作都针对一个字FIFO位置。每个FIFO字包含一个音频插槽。每次访问SAI_xDR寄存器后,FIFO指针将增加一个字。
将数据写入SAI_xDR时应右对齐。
收到的数据将在SAI_xDR中正确对齐。