wooyeei 发表于 2019-12-27 16:11:08

有没有用过数字式mems麦克风的,想问下SPI通讯的问题

如题,萌新第一次用SPI通讯麦克风,SPI配置如下:
static void MX_SPI3_Init(void)
{

/* USER CODE BEGIN SPI3_Init 0 */

/* USER CODE END SPI3_Init 0 */

/* USER CODE BEGIN SPI3_Init 1 */

/* USER CODE END SPI3_Init 1 */
/* SPI3 parameter configuration*/
hspi3.Instance = SPI3;
hspi3.Init.Mode = SPI_MODE_MASTER;
hspi3.Init.Direction = SPI_DIRECTION_2LINES_RXONLY;
hspi3.Init.DataSize = SPI_DATASIZE_16BIT;
hspi3.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi3.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi3.Init.NSS = SPI_NSS_SOFT;
hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi3.Init.TIMode = SPI_TIMODE_DISABLE;
hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi3.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi3) != HAL_OK)
{
    Error_Handler();
}
/* USER CODE BEGIN SPI3_Init 2 */

/* USER CODE END SPI3_Init 2 */

}
波特率2M的,符合芯片运行范围。但是在WHILE里如果只读SPI的数据是有读数的,如果加一个延时,不管延时多少就没读数了,示波器看了下时钟信号隔几十ms才跳一下。在DEBUG里单句运行寄存器DR是有读数的。
求各位大佬指点!

butterflyspring 发表于 2020-1-3 17:24:49

大体来说,数字麦克风大致是一个数据线和一个时钟线,依靠上下沿采样。所以普通芯片是用SPI 模拟这样的接口去读数据并且还要软件解码,需要一些处理方法(详细请参考一些资料描述)。简单说靠软件模拟实现,需要了解底层细节多一些。另外ST官方在STM32F4等系列中有DFSDM的外设,通过这个外设连接到数字麦克风接口,这样直接出来需要的数据。可以参考一下官方手册的介绍:)

wooyeei 发表于 2019-12-27 16:14:47

可能问题没说清楚,
while (1)
{HAL_SPI_Receive_DMA(&hspi3,adc12buff,4); }
循环里这样写是有读数的,但是如果在后面加个delay就没了,一直是0x00偶尔跳一下0xFF,但是debug里这一句设断点会发现寄存器DR是有读数的。

maxtch 发表于 2019-12-28 23:18:19

大多数数字式麦克风输出的不是 SPI,而是一种类似 I2S 的协议。

wooyeei 发表于 2019-12-30 08:55:40

这芯片只有L/R没有WS脚,而且看芯片资料的推荐电路只引出来一个CLK一个DATA,所以用的SPI,如果要接I2S的话是L/R接WS吗?

hrg33802 发表于 2020-9-23 11:17:02

可以加个微信交流一下吗? 13249840081
页: [1]
查看完整版本: 有没有用过数字式mems麦克风的,想问下SPI通讯的问题