用STM32F3读取非常规ADC

Read non conventional ADC with STM32F3

我正在尝试将 STM32F303 Nucleo 与 AD7748-4 ADC 连接起来。 ADC 的数据表:

https://www.analog.com/media/en/technical-documentation/data-sheets/ad7768-7768-4.pdf

问题是,ADC 不通过 SPI 端口输出转换后的值,而是使用数据就绪信号 (DRDY)、数据时钟 (DCLK) 和 4 个数据输出 (DOUT0- DOUT3).如果我这样设置,输出将通过一根线串行传输 96 位,但时序在我的应用中很关键,我需要使用 DOUT0 到 DOUT2 对数据进行计时,每个输出 32 位。如果我串行传输数据,我可以欺骗 SPI 端口读取它,但我没有。 ADC 在 20MHz 时为 运行,因此 DCLK 将以相同频率运行。 Nucleo 的最高运行频率为 72MHz,但当使用 DAM 时,它将时钟设置为 64MHz。

在 STM 手册中,它将 "GPIO port input data register (GPIOx_IDR) (x = A..H)" 描述为只读寄存器 - 我的理解是低 16 位可以存储最多 16 位的输入值(最有可能用于内存数据 R/W) - 所以问题是,如何配置 GPIO 以读取数据?我在这里有点僵局。我的直觉告诉我,Nucleo 可能不够快,无法读取来自 ADC 的数据……有什么想法吗?所有都是用 C/C++ 编写的,基本上是裸机...我是 Nucleo 的新手,已经 4 年没有编写代码了 - 请原谅任何知识上的失误...

如果DCLK工作在20Mhz,uC显然不够快(每个周期之间大约有3条指令,所以即使是汇编语言也很难实现...)。由于我不熟悉 stm 体系结构,我只能建议一个可能会在您脑海中激发一些想法的技巧。不要为 ADC 使用 crystal,而是使用连接到输出引脚的 STM 定时器,并使用该引脚 (MCLK) 为 ADC 提供时钟。使用 spi、空闲模式等配置 ADC 时,您可以将此时钟信号保持在 20Mhz。但是,当您需要来自 ADC 的样本时,停止 STM 计时器并为 ADC 计时 "manually"。 (您实际上控制了 DCLK 信号)。转换例程结束后,以 20Mhz 重新启动计时器。