我正在为STM32F4xx设备开发一个软件,该软件是从STM32CubeMX生成的项目开始的。我正在使用已使用HAL库初始化的SPI外设。这是一个工作的SPI写入功能的示例:void spi_write(uint8_t data) {
HAL_SPI_Transmit(&hspi2,&data,1,HAL_MAX_DELAY);
}
如果我想在不使用HAL库的情况下使用SPI发送数据,但是在寄存器上做它的准系统(因为它更快)它不起作用。这是我的实现:- void spi_write(uint8_t data) {
- (&hspi2)->Instance->DR = data;
- while (!((&hspi2)->Instance->SR & ((uint16_t)0x0002))); //Check TXE flag (SPI_I2S_FLAG_TXE)
- while ((&hspi2)->Instance->SR & ((uint16_t)0x0080)); // Check busy flag (SPI_I2S_FLAG_BSY)
- }
复制代码知道为什么第二个实现不起作用?谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
*(volatile uint8_t *)&SPIx -> DR = data;
然后在发送之后等待两个标志是没有意义的。使用魔术数字是荒谬的。
void spi_write(uint8_t data)
{
while (!(hspi2.Instance->SR & SPI_SR_TXE))); // check the CMSIS definition for you uC
*(volatile uint8_t *)&hspi2.Instance->DR = data;
}
只有当你要禁用SPI或手动更改CS引脚的状态时才需要进行最后一次检查,并且必须等到最后一次发送。
另一个错误 - SR寄存器是32位而不是16.如果你想用“裸注册”方式使用HAL进行初始化有什么意义呢?
一周热门 更多>