#include "spi.h"
SPI_HandleTypeDef SPI2_Handler; //SPI句柄
u8 spiRxBuffer[Rxsize]; //HAL库使用的spi接收缓冲
u8 SPI2_Init(void)
{
SPI2_Handler.Instance = SPI2;
SPI2_Handler.Init.Mode = SPI_MODE_MASTER;
SPI2_Handler.Init.Direction = SPI_DIRECTION_2LINES_RXONLY; // SPI_DIRECTION_1LINE; // SPI_DIRECTION_1LINE;
SPI1->CR1 =
SPI2_Handler.Init.DataSize = SPI_DATASIZE_16BIT;
SPI2_Handler.Init.CLKPolarity = SPI_POLARITY_LOW;// SPI_POLARITY_LOW; // 时钟极性 CPOL = 0, SCK 引脚在空闲状态处于低电平
SPI2_Handler.Init.CLKPhase = SPI_PHASE_2EDGE; // 第2个SCK边沿捕获第一个数据位,复位CPOL 位,则为下降沿
SPI2_Handler.Init.NSS = SPI_NSS_SOFT; // 软件管理NSS
SPI2_Handler.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256; // 波特率预分频 216/8 = 27
SPI2_Handler.Init.FirstBit = SPI_FIRSTBIT_MSB; // 定义帧格式,先移出高位,后移出后低位
SPI2_Handler.Init.TIMode = SPI_TIMODE_DISABLE; //
SPI2_Handler.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
SPI2_Handler.Init.CRCPolynomial = 7;
HAL_SPI_Init(&SPI2_Handler);
__HAL_SPI_ENABLE(&SPI2_Handler);
HAL_SPI_Receive_IT(&SPI2_Handler, (u8 *)spiRxBuffer, 2);
return 1;
}
//SPI底层驱动,引脚配置,时钟使能
//此函数会被HAL_SPI_Init()调用
//hqspiSPI句柄
void HAL_SPI_MspInit(SPI_HandleTypeDef *spiHander)
{
// GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitTypeDef GPIO_Initure;
if(spiHander->Instance == SPI2 )
{
__HAL_RCC_SPI2_CLK_ENABLE(); //使能SPI2时钟
__HAL_RCC_GPIOB_CLK_ENABLE(); //使能GPIOB时钟
// SPI2 GPIO CONFIGURATION
// PB13 ------> SPI2_SCK;
// PB14 ------> SPI2_MISO;
// PB15 ------> SPI2_MOSI;
// PB4 ------> SPI2_NSS;
//初始化PB13 片选信号
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_HIGH; //高速
GPIO_Initure.Alternate=GPIO_AF5_SPI2; //复用为SPI2
HAL_GPIO_Init(GPIOB, &GPIO_Initure);
GPIO_Initure.Pin = GPIO_PIN_4;
GPIO_Initure.Mode = GPIO_MODE_INPUT; // GPIO_MODE_OUTPUT_PP;
HAL_GPIO_Init(GPIOB, &GPIO_Initure);
HAL_NVIC_EnableIRQ(SPI2_IRQn); //使能USART1中断通道
HAL_NVIC_SetPriority(SPI2_IRQn,3,1); //抢占优先级3,子优先级3
}
}
void SPI2_IRQHandler(void)
{
HAL_SPI_IRQHandler(&SPI2_Handler);
//while(HAL_UART_Receive_IT(SPI2_Handler,(u8 *)spiRxBuffer, Rxsize)!=HAL_OK);
}
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *SPI2_Handler)
{
if(SPI2_Handler->Instance==SPI2) //如果是SPI2
{
printf("%X %X
",spiRxBuffer[0], spiRxBuffer[1]);
HAL_SPI_Receive_IT(SPI2_Handler, (u8 *)spiRxBuffer, 2);
}
} |