193 lines
5.4 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "spi.h"
//////////////////////////////////////////////////////////////////////////////////
/************************************************************************************************/
//SPI驱动代码
//STM32H7工程模板-HAL库函数版本
//DevEBox 大越创新
//淘宝店铺mcudev.taobao.com
//淘宝店铺shop389957290.taobao.com
/************************************************************************************************/
//////////////////////////////////////////////////////////////////////////////////
SPI_HandleTypeDef SPI2_Handler; //SPI2句柄
/************************************************************************************************/
//以下是SPI模块的初始化代码配置成主机模式
//SPI口初始化
//这里针是对SPI2的初始化
//STM32H7工程模板-HAL库函数版本
//DevEBox 大越创新
//淘宝店铺mcudev.taobao.com
//淘宝店铺shop389957290.taobao.com
/************************************************************************************************/
void SPI2_Init(void)
{
SPI2_Handler.Instance=SPI2; //SP2
SPI2_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式设置为主模式
SPI2_Handler.Init.Direction=SPI_DIRECTION_2LINES;//设置SPI单向或者双向的数据模式:SPI设置为双线模式
SPI2_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI2_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平
SPI2_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI2_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件NSS管脚还是软件使用SSI位管理:内部NSS信号有SSI位控制
SPI2_Handler.Init.NSSPMode=SPI_NSS_PULSE_DISABLE;//NSS信号脉冲失能
SPI2_Handler.Init.MasterKeepIOState=SPI_MASTER_KEEP_IO_STATE_ENABLE; //SPI主模式IO状态保持使能
SPI2_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_256;//定义波特率预分频的值:波特率预分频值为256
SPI2_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI2_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式
SPI2_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;//关闭硬件CRC校验
SPI2_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式
HAL_SPI_Init(&SPI2_Handler);
__HAL_SPI_ENABLE(&SPI2_Handler); //使能SPI2
SPI2_ReadWriteByte(0Xff); //启动传输
}
/************************************************************************************************/
//SPI2底层驱动时钟使能引脚配置
//此函数会被HAL_SPI_Init()调用
//hspi:SPI句柄
//STM32H7工程模板-HAL库函数版本
//DevEBox 大越创新
//淘宝店铺mcudev.taobao.com
//淘宝店铺shop389957290.taobao.com
/************************************************************************************************/
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_Initure;
RCC_PeriphCLKInitTypeDef SPI2ClkInit;
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
__HAL_RCC_SPI2_CLK_ENABLE(); //使能SPI2时钟
//设置SPI2的时钟源
SPI2ClkInit.PeriphClockSelection=RCC_PERIPHCLK_SPI2; //设置SPI2时钟源
SPI2ClkInit.Spi123ClockSelection=RCC_SPI123CLKSOURCE_PLL; //SPI2时钟源使用PLL1Q
HAL_RCCEx_PeriphCLKConfig(&SPI2ClkInit);
//PB13,14,15
GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推挽输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_VERY_HIGH; //快速
GPIO_Initure.Alternate=GPIO_AF5_SPI2; //复用为SPI2
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //初始化
}
/************************************************************************************************/
//SPI速度设置函数
//SPI速度=PLL1Q/分频系数
//@ref SPI_BaudRate_Prescaler:SPI_BAUDRATEPRESCALER_2~SPI_BAUDRATEPRESCALER_256
//PLL1Q时钟一般为200Mhz
//STM32H7工程模板-HAL库函数版本
//DevEBox 大越创新
//淘宝店铺mcudev.taobao.com
//淘宝店铺shop389957290.taobao.com
/************************************************************************************************/
void SPI2_SetSpeed(u32 SPI_BaudRatePrescaler)
{
assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler));//判断有效性
__HAL_SPI_DISABLE(&SPI2_Handler); //关闭SPI
SPI2_Handler.Instance->CFG1&=~(0X7<<28); //位30-28清零用来设置波特率
SPI2_Handler.Instance->CFG1|=SPI_BaudRatePrescaler;//设置SPI速度
__HAL_SPI_ENABLE(&SPI2_Handler); //使能SPI
}
/************************************************************************************************/
//SPI2 读写一个字节
//TxData:要写入的字节
//返回值:读取到的字节
//STM32H7工程模板-HAL库函数版本
//DevEBox 大越创新
//淘宝店铺mcudev.taobao.com
//淘宝店铺shop389957290.taobao.com
/************************************************************************************************/
u8 SPI2_ReadWriteByte(u8 TxData)
{
u8 Rxdata;
HAL_SPI_TransmitReceive(&SPI2_Handler,&TxData,&Rxdata,1, 1000);
return Rxdata; //返回收到的数据
}
/************************************************************************************************/
//STM32H7工程模板-HAL库函数版本
//DevEBox 大越创新
//淘宝店铺mcudev.taobao.com
//淘宝店铺shop389957290.taobao.com
/************************************************************************************************/