HAL库的SPI发送接收函数的确令人迷惑,明明支持16位传输,却必须使用8位的指针。如果没能正确理解SPI发送接收函数,很容易导致程序接入HardFault_Handler中断死循环。
最近用到STM32F407的HAL编程,SPI通讯的外设要求16位通讯,对HAL库的SPI的16位通讯做了个深入研究。发现HAL库提供的函数除了入口参数含义不太明确,还是很好用的。下面以中断方式发送接收
uint16_t 数据为例,阐述函数调用的过程和要点。
1、
首先,建立发送和接收缓冲区,用16位的数组:
uint16_t SPI_TxBuff[1],
SPI_RxBuff[1];
2、SPI初始化:
HAL_SPI_DeInit(&hspi1); //SPI1 复位
hspi1.Instance = SPI1;
hspi1.Init.Mode = SPI_MODE_MASTER;
hspi1.Init.Direction =
SPI_DIRECTION_2LINES; //双向通讯
hspi1.Init.DataSize =
SPI_DATASIZE_16BIT; //16位传输
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler =
SPI_BAUDRATEPRESCALER_16;