You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于STM32H7A2现有SPI代码,如何修改实现16位数据传输?

问题:STM32H7A2 SPI从8位传输改为仅16位数据传输的代码调整方案

目前正在使用STM32H7A2的SPI外设传输8位数据,且运行正常,相关代码如下(包含寄存器地址和对应数据)。现需基于该代码修改,实现仅传输16位数据的功能,请问该如何调整代码?原代码在发送SPI地址位和8位数据位时工作正常,现在需要修改为通过SPI仅发送16位数据,望各位提供修改建议。

原代码:

uint8_t dataOut = 0x50;
uint8_t regAddr = 18; // address of register

HAL_StatusTypeDef spi_write(uint8_t regAddr, uint8_t *pData)
{
  HAL_StatusTypeDef ret;
  uint8_t sendData[2] = {regAddr, *pData};

  // Start communication
  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 0);

  // send reg addr and data to write into
  ret = HAL_SPI_Transmit(&hspi1, sendData, 2, 20);
  if (ret != HAL_OK) {
    HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 1);
    return ret;
  }
}

调整方案

核心思路

原代码是分两次8位传输(寄存器地址+8位数据),现在要改成仅传输16位数据,需要从数据封装和**SPI配置(可选)**两方面调整,具体如下:

1. 修改函数接口与数据封装

  • 移除寄存器地址参数,将函数参数改为接收uint16_t类型的16位数据
  • 根据外设要求的字节序(大端/小端),把16位数据拆分为高低两个字节,放入发送缓冲区

2. 修正传输逻辑

  • 发送缓冲区仅存放16位数据拆分后的两个字节,传输长度保持为2(对应2个8位字节,合计16位)
  • 补充原代码缺失的正常传输完成后CS置高操作,保证时序严谨

3. SPI配置切换(可选)

如果外设支持16位帧格式传输,可以直接修改SPI配置:

  • 在STM32CubeMX中把SPI的Data Size设为16 Bits,或者手动配置SPI_CR1寄存器的DS[3:0]位为0b1111
  • 这种情况下,HAL_SPI_Transmit的传输长度设为1(对应1个16位帧),无需拆分字节

修改后的示例代码

方式一:保持8位帧格式,拆分16位数据传输

uint16_t dataOut = 0x1234; // 要发送的16位数据

HAL_StatusTypeDef spi_write_16bit(uint16_t pData)
{
  HAL_StatusTypeDef ret;
  // 按大端序拆分(高字节先发送,若外设要求小端则调换顺序)
  uint8_t sendData[2] = {(uint8_t)(pData >> 8), (uint8_t)pData};

  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 0);
  // 传输2个8位字节,合计16位
  ret = HAL_SPI_Transmit(&hspi1, sendData, 2, 20);
  
  // 无论传输成功与否,都置高CS
  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 1);
  return ret;
}

方式二:切换为16位帧格式传输

uint16_t dataOut = 0x1234; // 要发送的16位数据

HAL_StatusTypeDef spi_write_16bit(uint16_t pData)
{
  HAL_StatusTypeDef ret;

  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 0);
  // 传输1个16位帧,长度参数设为1
  ret = HAL_SPI_Transmit(&hspi1, (uint8_t*)&pData, 1, 20);
  
  HAL_GPIO_WritePin(SPI1_CS_GPIO_Port, SPI1_CS_Pin, 1);
  return ret;
}

注意事项

  • 必须确认外设的字节序要求,否则会出现数据传输错误
  • 若使用16位帧格式,需确保SPI的时钟极性、相位等配置与外设完全匹配
  • 原代码仅在传输错误时置高CS,修改后的代码统一在传输结束后置高,避免出现总线挂起问题

内容的提问来源于stack exchange,提问作者Stan woldes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 00:33:28