我一直在尝试让 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 写入一个新值,但由于它从不清除,因此那里也没有任何事情发生。
我究竟做错了什么?