多语言展示
当前在线:934今日阅读:176今日分享:34

HAL库怎么使用SPI通信

分享一个基于STM32F103ZET6关于HAL库操作SPI的经验,希望对需要的朋友有帮助。
方法/步骤
1

第一步:新建或者打开一个HAL工程,在Pinout页右侧的“Configuration ->Peripherals”下找到需要使用的SPI外设,选择“Mode”右侧的下拉框,Full-Duplex Master为主机全双工通信。Hardware NSS Signal为使能端口硬件控制选择,建议Disable,使用软件控制使能端口。     选择完毕后会在右侧的引脚图中显示出端口配置。

2

第二步:因为这里没有使用硬件使能控制,所以还需要配置一个使能端口,这里就使用SPI的NSS端口进行配置,在右侧的引脚图中找到这个端口比如PA4,然后选择“GPIO_Output”。

3

使能端口配置完毕后再左侧的SPI配置中会显示一个突出的红色,这个是提示用户硬件SPI的使能端口被占用了,可以不予理会。

4

第三步:切换到“Clock Configuration”页,配置好外设时钟。

5

第四步:切换到“Configuration”页,找到对应的“SPI”。

6

第五步:软件弹出“SPIx Configuration”对话框(x为SPI编号,这里使用了SPI1),切换到“Parameter Settings”,在Basic Parameters选择SPI数据每次传输的bit数和传输的顺序,其中Data Size就是bit数,这里选择8 Bits,“First Bit”就是开始传输的bit位置,MSB First为高位先传。     “Clock Parameters”的“Prescaler”为分频数,它决定了SPI的波特率,根据需求选择,但不能超过SPI的最大速率。Clock Polarity为时钟极性,即数据不传输时的时钟是高电平还是低电平。Clock Phase为数据采集的相位,1 Edge即第一个跳变采集。     Advanced Parameters可以选择CRC校验和使能端口控制方式,这里禁止CRC校验,NSS控制前面已经选择了非硬件方式,可以不再理会。

7

第六步:继续切换到“GPIO Settings”,这里可以配置SPI各端口的模式,由于前面已经配置了SPI,一般只需要考虑MISO是否开启上拉,以及MOSI和CLK端口的通信速率。     配置完毕后不要忘记点击“OK”确认配置。

8

第七步:通过“Project ->Generate Code”生成代码。

9

第八步:使用Keil5打开工程,可以看到在软件初始化的代码中有MX_SPIx_Init(),注意如果软件中使用了FATFS那么需要自己手动把SPI的初始化放到FATFS的初始化前面。

10

HAL库提供了HAL_SPI_Transmit函数用于发送,第一个参数是SPI对应的句柄,这个可以在SPI的初始化函数中找到相关变量名称,一般是hspix(其中x为具体的SPI序号),第二个参数是数据缓存,第三个是需要发送的数据个数,第四个是超时等待数单位视毫秒。下面的代码是向SPI1发送一个数据,超时等待1000毫秒。 uint8_t d; HAL_SPI_Transmit(&hspi1, &d, 1, 1000);

11

对于接收数据,可以使用HAL_SPI_Receive()函数,参数和HAL_SPI_Transmit类似,但个人建议使用HAL_SPI_TransmitReceive()函数,因为HAL_SPI_Receive只管收,而SPI通信不管是收还是发都会发送一次数据,这回导致在接收数据时发送一个不可知的数据造成通信异常。

注意事项
1

1、SPI通信最重要的是时钟、相位的配置,不匹配的话会导致通信紊乱。

2

2、如果没有外接上拉电阻,那么请务必开启MISO的上拉功能。

3

3、软件使能控制灵活性较高,如果外设运行,那么也可以使用引脚使能控制,那样会省点事。

4

4、对于SD卡的SPI,注意要在SD卡初始化前面调用SPI的初始化。

推荐信息