STM32的HAL库SPI操作(master 模式)-根据时序图配置SPI

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芯片的配置,生成代码后,我们看它的设置:

c 复制代码
/* 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芯片,所以直接用查询方式就够了,函数定义:

c 复制代码
//SPI2,master模式,读写一个字节操作
//TxData:要写入的字节
//返回值:读取到的字节
uint8_t SPI2_ReadWriteByte(uint8_t TxData)
{
	uint8_t Rxdata;
	HAL_SPI_TransmitReceive(&hspi2,&TxData,&Rxdata,1, 1000);       
	return Rxdata;          		    //返回收到的数据		
}
相关推荐
Aaron15886 小时前
无人机反制中AOA+TDOA联合定位技术与雷达探测定位技术的应用对比分析
arm开发·嵌入式硬件·fpga开发·硬件工程·无人机·信息与通信·信号处理
foundbug9997 小时前
STM32 睡眠模式测试程序
stm32·单片机·嵌入式硬件
wxmtwfx8 小时前
littlefs 源码分析
单片机·littlefs·嵌入式文件系统
嵌入式小站10 小时前
STM32 零基础可移植教程 18:I2C 入门,先用扫描器找一找总线上有没有设备
chrome·stm32·嵌入式硬件
天涯铭11 小时前
深入浅出:单片机I/O口串联电阻选型
单片机·嵌入式硬件·io口串联电阻
国科安芯11 小时前
ASP7A84AS——航天级低噪声高PSRR线性稳压器
网络·单片机·嵌入式硬件·架构·安全性测试
普中科技12 小时前
【普中STM32F1xx开发攻略--标准库版】-- 第 42 章 STM32 内部 FLASH 实验
stm32·单片机·嵌入式硬件·开发板·普中科技·内部flash
不做无法实现的梦~13 小时前
CLion+pyocd配置教程
嵌入式硬件
破晓单片机14 小时前
012、STM32项目分享:智能台灯系统
stm32·单片机·嵌入式硬件
悠哉悠哉愿意14 小时前
【单片机复习笔记】十五届国赛复盘
笔记·单片机·嵌入式硬件·学习