从STM32 HAL库SPI驱动认识大小端

1、HAL库驱动设置

2、SPI函数HAL_SPI_TransmitReceive引发的大小端格式问题

在CUBE下对SPI进行设置后,系统自动生成SPI初始化以及驱动代码,应用级所需要做的就是进行通讯,轮询方式下使用的函数有:

//数据发送:
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

//数据接收:
HAL_StatusTypeDef HAL_SPI_Receive(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout)

//数据发送+接收:
HAL_StatusTypeDef HAL_SPI_TransmitReceive(SPI_HandleTypeDef *hspi, uint8_t *pTxData, uint8_t *pRxData, uint16_t Size, uint32_t Timeout)
//Timeout为ms级别

一般,对于发送1Byte+接收1Byte的通讯方式,直接调用HAL_SPI_Transmit 、 HAL_SPI_Receive即可

	uint8_t Data=0;
	uint8_t Reg=(reg | 0x80);
	ADXMAIN_CE_L;

	HAL_SPI_Transmit(&hspi3,&REG,1,0xff);
	HAL_SPI_Receive(&hspi3,&data,1,0xff);

	ADXMAIN_CE_H;
	return Data;

出于好奇,调用HAL_SPI_TransmitReceive(&hspis,&TxData,&RxData,1,1)函数,完整代码如下

uint8_t ADXLREF_Read_1Byte(uint8_t reg)
{
	uint8_t Data=0;
	uint8_t Reg=(reg | 0x80);
	ADXMAIN_CE_L;

	HAL_SPI_TransmitReceive(&hspi3,&Reg,&Data,1,0xff);

	ADXMAIN_CE_H;
	return Data;
}

接收数据非预期,对HAL_SPI_TransmitReceive进行分析,函数中先发送1Byte数据(*Reg+0)发送的同时接收1Byte数据放入(*Data+0),即该函数并不会发送1Byte数据后再给时钟进行接收。于是修改代码如下

	uint16_t Data=0;
	uint16_t Reg=(reg | 0x80)<<8;
	ADXMAIN_CE_L;

	HAL_SPI_TransmitReceive(&hspi3,&Reg,&Data,2,0xff);

	ADXMAIN_CE_H;
	return (uint8_t)Data;

接收数据非预期。同时SPI数据线路波形如下蓝色为时钟,红色为MOSI,

 按理应该在第一个Byte发送0x80,但在第二个Byte发送。原因是第一个STM32是小端格式(高位数据在地址低位),Reg=(reg | 0x80)<<8,Reg在内存中存储为(0x00地址:00000000,0x08地址100000000)在代码中顺地址获取Reg数据时,先获取了0x00地址数据,后获取0x08地址数据。需要修改为Reg=reg | 0x80;

	uint16_t Data=0;
	uint16_t Reg=reg | 0x80;
	ADXMAIN_CE_L;

	HAL_SPI_TransmitReceive(&hspi3,&Reg,&Data,2,0xff);
	ADXMAIN_CE_H;
	return (uint8_t)Data;

3、扩展

假如现有一32位int型数0x12345678,那么其MSB(Most Significant Byte,最高有效字节)为0x12,其LSB (Least Significant Byte,最低有效字节)为0x78,在CPU内存中有两种存放方式:(假设从地址0x4000开始存放)

https://blog.csdn.net/wwwlyj123321/article/details/100066463

上面问题还有一种更常规的解决思路:使用uint_8数组格式存储数据

uint8_t Data[2]={0};
uint8_t Reg[2]={reg | 0x80,0};

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STM32HAL库中的SPI驱动可以用来驱动ILI9341液晶屏。ILI9341是一种常见的TFT液晶屏,具有高分辨率和高色彩深度。使用SPI驱动可以实现快速的数据传输和高效的显示控制。在STM32HAL库中,可以使用SPI的相关函数来配置和控制SPI总线,以及发送和接收数据。具体的驱动实现可以参考相关的资料和示例代码。 ### 回答2: STM32HAL库是ST公司为STM32系列微控制器提供的一个开发库,它为开发者提供了一组易于使用的API,让开发者可以轻松地操控STM32微控制器的各种硬件资源。 而SPI(Serial Peripheral Interface)是一种通信协议,它以主从方式连接多个外设,可以用于传输数据、配置寄存器等功能。在STM32HAL库中,SPI驱动使得开发者可以轻松地将ILI9341液晶屏连接到STM32微控制器上,并且实现对其进行控制。 ILI9341是一种常用的TFT液晶屏控制器,具有320x240像素的分辨率,其屏幕刷新速率达到了60帧/秒,颜色饱和度高,图像清晰度好等优点。在STM32HAL库中,可以通过配置SPI通信参数来实现对ILI9341液晶屏的控制。 具体来说,STM32HAL库中的SPI驱动提供了一组API,可以让开发者轻松地进行SPI通信的配置和数据传输。这些API包括了SPI初始化、SPI传输、SPI中断和SPI DMA模式等。开发者可以根据需要选择最合适的SPI模式和配置参数,实现对ILI9341液晶屏的控制。 例如,通过初始化SPI外设、配置通信模式和时序参数,开发者可以实现对ILI9341液晶屏的初始化。同时,通过SPI传输数据,开发者可以将图像数据传输到液晶屏上,从而显示图像。还可以使用SPI中断或DMA模式来提高SPI传输的效率,实现更加流畅的图像显示效果。 总之,STM32HAL库SPI驱动为开发者带来了方便和效率,让开发者可以轻松地实现对ILI9341液晶屏的控制。这不仅节省了开发时间,也提高了开发效率和产品质量。 ### 回答3: STM32HAL库是STMicroelectronics公司推出的针对STM32系列微控制器的软件库,它包含了丰富的驱动和示例代码,可以方便地进行基于STM32的开发。而ILI9341是一款常见的TFT-LCD驱动芯片,具有高分辨率、色彩丰富和低功耗等优点,被广泛应用于各种嵌入式产品中。 在使用STM32HAL库进行SPI驱动ILI9341的时候,需要先了解SPI的基本原理和ILI9341的通信协议。SPI是一种串行总线协议,通常用于芯片之间的通信,它主要由四条信号线组成:时钟线(SCLK)、主机输出从机输入线(MOSI)、主机输入从机输出线(MISO)和片选信号线(CS)。而ILI9341的通信协议是基于SPI的,需要向芯片发送多个指令字和数据字。 在STM32HAL库中,可以使用HAL_SPI_Init()函数进行SPI的初始化配置,包括时钟频率、传输模式、数据位数等参数。然后使用HAL_SPI_Transmit()函数发送指令字和数据字,其中需要注意的是每个指令字和数据字的发送顺序和格式,可以通过ILI9341的数据手册进行查看。 除了SPI的配置和数据传输之外,还需要控制ILI9341的片选信号、复位信号和数据/命令选择信号等。可以使用GPIO模块进行控制,通过HAL_GPIO_WritePin()函数控制相应引脚的高低电平。 总的来说,使用STM32HAL库进行SPI驱动ILI9341需要熟悉SPI的基本原理和ILI9341的通信协议,同时需要了解STM32HAL库的API函数和GPIO模块的使用方法。需要注意的是,在实际应用中需要根据具体情况进行优化和调试,以保证系统稳定可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值