STM32 SAI:了解FIFO

问题描述 投票:0回答:1

根据我的理解,FIFO(在硬件环境中)是一个缓冲区,将按照先进先出原则进行管理。您按顺序放入一些位,然后您可以读取它们,即在达到所需阈值时按块。但我对STM32的串行音频接口的FIFO管理感到困惑:

根据数据表,串行音频接口(SAI)支持最多8个字的FIFO。 (8x32bits)SAI的数据寄存器(SAI_xDR)是1个字(32位)。文档说明

如果FIFO未满,则写入该寄存器会加载FIFO。

如果FIFO不为空,则从该寄存器读取将清空FIFO。

怎么解释呢?

我的猜测是:如果我对该寄存器进行写入访问,它会将寄存器内容(32位块)作为第一个字加载到FIFO中,然后在第二次写入访问时,将第二个字加载到FIFO中,依此类推。然后,当我进行读取访问时,它返回队列中的第一个单词,然后是第二个单词,依此类推。这是正确的吗?

如果是这样,当我向寄存器写入少于32位时会发生什么?即我写了一个16位的块。然后我再写一个16位。两个位块是否共享一个单词,或者它们是否被转换为单独的单词?如果我读了一个字,我会得到16位块还是只有前16位?我不明白FIFO如何知道我填充到数据寄存器中的位序列的大小。或者在每次写访问时总是占用整个32位?

enter image description hereenter image description here

stm32 stm32f7
1个回答
1
投票

我的猜测是:如果我对该寄存器进行写入访问,......这是对的吗?

是的,你是对的。

据我所知,每个FIFO字包含一个SAI插槽的数据,与数据大小无关。 FIFO与32位移位寄存器相连,而移位计数取决于数据大小。似乎可以使用例如对8 < data_size <= 16的SAI_xDR的下半部分进行16位数据访问,但无论如何整个32位FIFO字将用于传输,并且每个字的data_size位将被移入/移出。

36.3.9串行音频接口(SAI)内部FIFO

...

每个FIFO都是一个8字FIFO。无论访问大小如何,来自/到FIFO的每个读或写操作都针对一个字FIFO位置。每个FIFO字包含一个音频插槽。每次访问SAI_xDR寄存器后,FIFO指针递增一个字。

在SAI_xDR中写入数据时,数据应正确对齐。

收到的数据将在SAI_xDR中右对齐。

© www.soinside.com 2019 - 2024. All rights reserved.