STM32的HAL库SPI操作(master 模式)

本文介绍了在STM32中使用HAL库进行SPI通信的Master模式,重点关注接线对应、从设备时序图的理解以及初始化参数的设置。通过STM32CubeMX配置示例,展示了如何匹配不同从设备的时序要求,并讨论了查询、中断和DMA三种通信方式的选择。
AI助手已提取文章相关产品:

SPI相关基础知识

SPI基本概念请自行百度,参考:百度百科SPI简介.我们讲重点和要注意的地方。

master模式下要关注的地方

接线一一对应

也就是说主控的MISO,MOSI,SCLK,[CSn]分别和设备的MISO,MOSI,SCLK,[CSn]一一对应相连,不交叉,不交叉,不交叉…(重要的事情说三遍)。

从设备的时序图

在这里插入图片描述
这是无线模块CC2500的SPI接口时序,这里可以看到,从设备要求,1、时钟空闲时为低电平;2、数据在时钟下降沿跳变,上升沿稳定,第1个沿为数据采样点;3、高位先发送;4、数据长度8位;
在这里插入图片描述
这是AD7192的SPI接口时序,这里可以看到从设备要求,1、时钟空闲时为高电平;2、数据在时钟下降沿跳变,上升沿稳定,第2个沿为数据采样点;3、高位先发送;4、数据长度8位;
我们的master模式要根据从设备的时序要求来设置参数,才能正常访问设备。

初始化参数

STM32CubeMX是一个比较好用的可视化工具,具体使用方法参考官方文档,这里看重点:
在这里插入图片描述
这是连接上面那个AD7192芯片的配置,生成代码后,我们看它的设置:

/* SPI2 init function */
void MX_SPI2_Init(void)
{
  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;								//MASTER模式
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;							//一个数据8位
  hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH;						//时钟空闲为高电平
  hspi2.Init.CLKPhase = SPI_PHASE_2EDGE;							//第二个跳变采样数据
  hspi2.Init.NSS = SPI_NSS_SOFT;									//软件设置CS
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;							//高位在前
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;							//禁用TI模式
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;			//禁用CRC校验
  hspi2.Init.CRCPolynomial = 10;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    Error_Handler();
  }
}
//引脚配置,自动生成,一般不用修改
void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	if(spiHandle->Instance==SPI2)
	{
	    /* SPI2 clock enable */
	    __HAL_RCC_SPI2_CLK_ENABLE();
	  
	    __HAL_RCC_GPIOB_CLK_ENABLE();
	    /**SPI2 GPIO Configuration    
	    PB13     ------> SPI2_SCK
	    PB14     ------> SPI2_MISO
	    PB15     ------> SPI2_MOSI 
	    */
	    GPIO_InitStruct.Pin = ADC_SCLK_Pin|ADC_MOSI_Pin;
	    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
	    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
	    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	
	    GPIO_InitStruct.Pin = ADC_MISO_Pin;
	    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	    GPIO_InitStruct.Pull = GPIO_NOPULL;
	    HAL_GPIO_Init(ADC_MISO_GPIO_Port, &GPIO_InitStruct);
	}
}

查询、中断还是DMA?

总的来说一句话就是,根据需要来决定,因为我们是接的低速AD芯片,所以直接用查询方式就够了,函数定义:

//SPI2,master模式,读写一个字节操作
//TxData:要写入的字节
//返回值:读取到的字节
uint8_t SPI2_ReadWriteByte(uint8_t TxData)
{
	uint8_t Rxdata;
	HAL_SPI_TransmitReceive(&hspi2,&TxData,&Rxdata,1, 1000);       
	return Rxdata;          		    //返回收到的数据		
}

再根据AD芯片的工作流程进行通讯就OK了。

您可能感兴趣的与本文相关内容

### STM32 HALSPI的使用方法 #### 创建SPI句柄 在使用STM32 HAL中的SPI功能之前,需要先定义并初始化一个`SPI_HandleTypeDef`类型的句柄。该句柄用于存储SPI的相关参数和状态信息[^1]。 ```c SPI_HandleTypeDef SPI5_Handler; ``` #### 初始化SPI外设 通过调用`HAL_SPI_Init`函数可以完成SPI外设的初始化工作。此函数会根据用户配置的结构体参数设置SPI的工作模式、波特率、数据帧格式等内容[^3]。 ```c // 配置SPI参数 SPI5_Handler.Instance = SPI5; SPI5_Handler.Init.Mode = SPI_MODE_MASTER; // 主设备模式 SPI5_Handler.Init.Direction = SPI_DIRECTION_2LINES; // 双向通信 SPI5_Handler.Init.DataSize = SPI_DATASIZE_8BIT; // 数据大小为8位 SPI5_Handler.Init.CLKPolarity = SPI_POLARITY_LOW; // 时钟极性低电平有效 SPI5_Handler.Init.CLKPhase = SPI_PHASE_1EDGE; // 时钟相位第一个边沿采样 SPI5_Handler.Init.NSS = SPI_NSS_SOFT; // 软件管理NSS信号 SPI5_Handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; // 波特率分频器 SPI5_Handler.Init.FirstBit = SPI_FIRSTBIT_MSB; // MSB优先发送 SPI5_Handler.Init.TIMode = SPI_TIMODE_DISABLE; // 禁用TI模式 SPI5_Handler.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 关闭CRC校验 if (HAL_SPI_Init(&SPI5_Handler) != HAL_OK) { Error_Handler(); // 错误处理函数 } ``` #### 发送与接收数据 HAL提供了多种API供开发者实现不同的SPI操作需求: - `HAL_SPI_Transmit`: 单纯发送数据。 - `HAL_SPI_Receive`: 单纯接收数据。 - `HAL_SPI_TransmitReceive`: 同时进行发送和接收操作。 下面是一个完整的同步收发示例代码片段: ```c uint8_t txData[] = {0x01, 0x02, 0x03}; uint8_t rxData[sizeof(txData)]; // 执行同步发送和接收 if (HAL_SPI_TransmitReceive(&SPI5_Handler, txData, rxData, sizeof(txData), HAL_MAX_DELAY) != HAL_OK) { Error_Handler(); } for(int i=0;i<sizeof(rxData);i++) { printf("Received byte %d: 0x%02X\n", i, rxData[i]); } ``` 上述代码展示了如何利用`HAL_SPI_TransmitReceive`函数执行一次全双工的数据交换过程[^2]。 #### 外设时钟使能 需要注意的是,在实际项目开发过程中,必须确保对应SPI模块所在的总线时钟已经被启用。通常情况下,默认状态下这些外设的功能及其时钟都是关闭状态以节省能耗[^4]。 例如对于APB2上的SPI5而言,则需加入如下语句来打开其运行所需的时基支持: ```c __HAL_RCC_SPI5_CLK_ENABLE(); ``` --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值