STM32F4xx准系统SPI(HAL初始化)

2019-07-14 17:47发布

我正在为STM32F4xx设备开发一个软件,该软件是从STM32CubeMX生成的项目开始的。我正在使用已使用HAL库初始化的SPI外设。这是一个工作的SPI写入功能的示例:
void spi_write(uint8_t data) {
    HAL_SPI_Transmit(&hspi2,&data,1,HAL_MAX_DELAY);
}
如果我想在不使用HAL库的情况下使用SPI发送数据,但是在寄存器上做它的准系统(因为它更快)它不起作用。这是我的实现:
  1. void spi_write(uint8_t data) {
  2.     (&hspi2)->Instance->DR = data;
  3.     while (!((&hspi2)->Instance->SR & ((uint16_t)0x0002))); //Check TXE flag (SPI_I2S_FLAG_TXE)
  4.     while ((&hspi2)->Instance->SR & ((uint16_t)0x0080)); // Check busy flag (SPI_I2S_FLAG_BSY)
  5. }
复制代码知道为什么第二个实现不起作用?谢谢!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
zhangminmin
2019-07-15 03:27
根据SPI的实现,您可能需要正确投射
*(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进行初始化有什么意义呢?

一周热门 更多>