ST意法半导体
直播中

南中南

9年用户 1042经验值
擅长:光电显示
私信 关注
[问答]

STM32F446 I2S卡在忙碌状态怎么解决?

我一直在尝试让 I2S 在不使用 HAL 的情况下工作,以更多地了解 MCU。我按照参考手册中的说明配置了外围设备,但是每当我写入 SPI->DR 时,状态都会卡在忙碌状态。
这是我的初始化函数
  •         RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;        // enable GPIOA Port CLK; PA4 I2S1-WS; PA5 I2S1-CK; PA7 I2S1-SD
  •         GPIOA->MODER |= GPIO_MODER_MODE4_1
  •                                         | GPIO_MODER_MODE5_1
  •                                         | GPIO_MODER_MODE7_1;
  •         GPIOA->MODER &= ~(GPIO_MODER_MODE4_0 | GPIO_MODER_MODE5_0 | GPIO_MODER_MODE7_0);
  •         GPIOA->AFR[0] |= (GPIO_AF5_SPI1 << GPIO_AFRL_AFSEL4_Pos);
  •         GPIOA->AFR[0] |= (GPIO_AF5_SPI1 << GPIO_AFRL_AFSEL5_Pos);
  •         GPIOA->AFR[0] |= (GPIO_AF5_SPI1 << GPIO_AFRL_AFSEL7_Pos);
  •         RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;                // enable I2S Peripheral CLK
  •         SPI1->I2SPR  |= SPI_I2SPR_I2SDIV & 47u; // set I2S Prescaler to 47
  •         SPI1->I2SPR  &= ~SPI_I2SPR_ODD;                        // set I2S ODD to 0
  •         SPI1->I2SCFGR &= ~SPI_I2SCFGR_CKPOL;        // set Clock Polarity to LOW when IDLE
  •         SPI1->I2SCFGR |= SPI_I2SCFGR_I2SMOD;        // set Mode to I2S
  •         SPI1->I2SCFGR |= SPI_I2SCFGR_I2SCFG_1;  // set Mode to I2S Master Transmit
  •         SPI1->I2SCFGR &= ~SPI_I2SCFGR_DATLEN;        // set Data Length to 16 Bit
  •         SPI1->I2SCFGR |= SPI_I2SCFGR_CHLEN;        // set Channel Length to 32 Bit
  •         SPI1->I2SCFGR &= ~SPI_I2SCFGR_I2SSTD;        // set Channel to Philips Standard
  • //        SPI1->CR2 |= SPI_CR2_TXEIE;
  • //        NVIC_EnableIRQ(SPI1_IRQn);
  •         SPI1->I2SCFGR |= SPI_I2SCFGR_I2SE;                // enable I2S
在我的主要任务中,我只是检查是否设置了 TXE,然后向 DR 写入一个新值,但由于它从不清除,因此那里也没有任何事情发生。
我究竟做错了什么?






回帖(1)

王秀芳

2023-1-12 10:33:04
你能看到 LRCK 上的采样频率吗?
尝试直接在引脚上测量(怀疑焊点不良)并检查是否短路——除非这是“已知良好”的电路板,例如 Nucleo 或 Disco。尝试将引脚设置为 GPIO 输出并摆动它,测量输出电平。
巧合的是,我正在 F446 上研究 I2S1,并且确实有 PA4/PA5 作为 LRCK/BICK,并且可以确认是的,它们在 AFR=5 时确实有效。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分