0

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

根据数据表,串行音频接口 (SAI) 最多支持 8 个字的 FIFO。(8x32bits) SAI 的数据寄存器 (SAI_xDR) 为 1 word (32bits)。文档解释了

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

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

如何解读它?

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

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

在此处输入图像描述在此处输入图像描述

4

1 回答 1

1

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

是的你是对的。

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

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

...

每个 FIFO 是一个 8 字 FIFO。无论访问大小如何,从/到 FIFO 的每次读取或写入操作都以一个字 FIFO 位置为目标。每个 FIFO 字包含一个音频槽。每次访问 SAI_xDR 寄存器后,FIFO 指针都会增加一个字。

数据写入 SAI_xDR 时应右对齐。

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

于 2019-02-19T21:37:27.873 回答