STM32 HAL SPI 16 位发送

Posted

技术标签:

【中文标题】STM32 HAL SPI 16 位发送【英文标题】:STM32 HAL SPI 16 bit Transmit 【发布时间】:2018-02-01 21:51:08 【问题描述】:

我正在尝试使用 HAL_SPI_Transmit(.) 进行 16 位数据传输。

我已经将使用 STM32Cube 的 SPI 配置为 16 位数据大小

(与hspi2.Init.DataSize = SPI_DATASIZE_16BIT)。

我尝试发送 16 位数据:

uint16_t DataToSend[10]=...;

HAL_SPI_Transmit(&hspi2,DataToSend, 2,TIMEOUTSPI);

但是函数HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)需要专门针对uint8_t*,它返回如下错误:

error: #167: argument of type "uint16_t *" is incompatible with parameter of type "uint8_t *"

那么如何使用HAL_SPI_Transmit() 发送 16 位数据?

我找到了这个link,但只讨论了这个错误,而不是使用该功能的方式。所以我的问题仍然存在。

我已经搜索了网络没有任何运气。 我对 STM32 比较陌生,所以答案对你来说可能很明显。

【问题讨论】:

【参考方案1】:

要消除错误,请写:

HAL_SPI_Transmit(&hspi2,(uint8_t*)(DataToSend), 2,TIMEOUTSPI);

我注意到您的数组大小为 10 uint16_t DataToSend[10](即 20 个字节),也许您的意思是:

HAL_SPI_Transmit(&hspi2,(uint8_t*)(DataToSend), 20,TIMEOUTSPI);

您不应该收到链接中提到的对齐错误,因为您使用的是 STM32F4 系列。

【讨论】:

我使用 2 作为 Size 参数的原因是我想发送 2 个 16 位数据。在那种情况下我应该写 4 吗? @纪尧姆 刚刚看了下HAL代码,貌似大小就是字数。所以看来你是对的,应该是2(发送2个16位字) 感谢您的回答。我测试了它并且它有效。但是我觉得应该把函数定义改成支持16位数据,不用类型转换。

以上是关于STM32 HAL SPI 16 位发送的主要内容,如果未能解决你的问题,请参考以下文章

STM32 HAL库怎么使用SPI的发送和接收函数

STM32 SPI 发送第一个数据不成功问题

STM32 HAL SPI 中断处理

STM32F0xx HAL 库使用问题记录

spidma发送更新中断

stm32f412 SPI dma接收和UART dma发送问题解决