HAL_Project/Project -APP-V1.0/Hardware/SPI/spi.c

229 lines
9.3 KiB
C
Raw Permalink 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 "main.h"
SPI_HandleTypeDef SPI1_Handler; //SPI2句柄
#if 0
SPI_HandleTypeDef SPI2_Handler; //SPI2句柄
#endif
uint8_t temprxdata;
/*-------------------------------------------------*/
/*函数名初始化SPI2接口 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
void SPI1_Init(void)
{
SPI1_Handler.Instance=SPI1; //SPI2
SPI1_Handler.Init.Mode=SPI_MODE_MASTER; //设置SPI工作模式设置为主模式
SPI1_Handler.Init.Direction=SPI_DIRECTION_2LINES; //设置SPI单向或者双向的数据模式:SPI设置为双线模式
SPI1_Handler.Init.DataSize=SPI_DATASIZE_8BIT; //设置SPI的数据大小:SPI发送接收8位帧结构
SPI1_Handler.Init.CLKPolarity=SPI_POLARITY_HIGH; //串行同步时钟的空闲状态为高电平
SPI1_Handler.Init.CLKPhase=SPI_PHASE_2EDGE; //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
SPI1_Handler.Init.NSS=SPI_NSS_SOFT; //NSS信号由硬件NSS管脚还是软件使用SSI位管理:内部NSS信号有SSI位控制
SPI1_Handler.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2; //定义波特率预分频的值:波特率预分频值为2
SPI1_Handler.Init.FirstBit=SPI_FIRSTBIT_MSB; //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
SPI1_Handler.Init.TIMode=SPI_TIMODE_DISABLE; //关闭TI模式
SPI1_Handler.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE; //关闭硬件CRC校验
SPI1_Handler.Init.CRCPolynomial=7; //CRC值计算的多项式
HAL_SPI_Init(&SPI1_Handler); //初始化
__HAL_SPI_ENABLE(&SPI1_Handler); //使能SPI1
}
/*-------------------------------------------------*/
/*函数名初始化SPI2接口 */
/*参 数:无 */
/*返回值:无 */
/*-------------------------------------------------*/
#if 0
void SPI2_Init(void)
{
SPI2_Handler.Instance=SPI2; //SPI2
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.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2; //定义波特率预分频的值:波特率预分频值为2
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
}
#endif
/*-------------------------------------------------*/
/*函数名SPI接口的底层初始化 */
/*参 数hspiSPI接口配置句柄 */
/*返回值:无 */
/*说 明此函数会被HAL_SPI_Init()回调调用 */
/*-------------------------------------------------*/
void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi)
{
GPIO_InitTypeDef GPIO_Initure;
if(hspi->Instance==SPI1){
__HAL_RCC_GPIOA_CLK_ENABLE(); //开启端口D时钟
__HAL_RCC_SPI1_CLK_ENABLE(); //开启SPI2接口时钟
GPIO_Initure.Pin=GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; //配置PD1 3 4
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用模式
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //VERY_HIGH模式
HAL_GPIO_Init(GPIOA,&GPIO_Initure); //配置
}
if(hspi->Instance==SPI2){
__HAL_RCC_GPIOB_CLK_ENABLE(); //开启端口D时钟
__HAL_RCC_SPI2_CLK_ENABLE(); //开启SPI2接口时钟
GPIO_Initure.Pin=GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; //配置PD1 3 4
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用模式
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH; //VERY_HIGH模式
HAL_GPIO_Init(GPIOB,&GPIO_Initure); //配置
}
}
/*-------------------------------------------------*/
/*函数名SPI接口读写数据 */
/*参 数TxData发送的数据 */
/*返回值:读取的数据 */
/*-------------------------------------------------*/
#if 0
uint8_t SPI2_ReadWriteByte(uint8_t TxData)
{
while((__HAL_SPI_GET_FLAG(&SPI2_Handler, SPI_FLAG_TXE))==0);
*(__IO uint8_t *)&(&SPI2_Handler)->Instance->DR = TxData ;
while((__HAL_SPI_GET_FLAG(&SPI2_Handler, SPI_FLAG_RXNE))==0);
return *(__IO uint8_t *)&(&SPI2_Handler)->Instance->DR;
}
#endif
uint8_t SPI1_ReadWriteByte(uint8_t TxData)
{
while((__HAL_SPI_GET_FLAG(&SPI1_Handler, SPI_FLAG_TXE))==0);
*(__IO uint8_t *)&(&SPI1_Handler)->Instance->DR = TxData ;
while((__HAL_SPI_GET_FLAG(&SPI1_Handler, SPI_FLAG_RXNE))==0);
return *(__IO uint8_t *)&(&SPI1_Handler)->Instance->DR;
}
/*-------------------------------------------------*/
/*函数名SPI2接口写数据 */
/*参 数TxData发送的数据 */
/*返回值:无 */
/*-------------------------------------------------*/
#if 0
void SPI2_WriteByte(uint8_t TxData)
{
while((__HAL_SPI_GET_FLAG(&SPI2_Handler, SPI_FLAG_TXE))==0);
*(__IO uint8_t *)&(&SPI2_Handler)->Instance->DR = TxData ;
while((__HAL_SPI_GET_FLAG(&SPI2_Handler, SPI_FLAG_RXNE))==0);
temprxdata = *(__IO uint8_t *)&(&SPI2_Handler)->Instance->DR;
}
#endif
void SPI1_WriteByte(uint8_t TxData)
{
while((__HAL_SPI_GET_FLAG(&SPI1_Handler, SPI_FLAG_TXE))==0);
*(__IO uint8_t *)&(&SPI1_Handler)->Instance->DR = TxData ;
while((__HAL_SPI_GET_FLAG(&SPI1_Handler, SPI_FLAG_RXNE))==0);
temprxdata = *(__IO uint8_t *)&(&SPI1_Handler)->Instance->DR;
}
/*-------------------------------------------------*/
/*函数名SPI2接口读数据 */
/*参 数:无 */
/*返回值:读到的数据 */
/*-------------------------------------------------*/
#if 0
uint8_t SPI2_ReadByte(void)
{
while((__HAL_SPI_GET_FLAG(&SPI2_Handler, SPI_FLAG_TXE))==0);
*(__IO uint8_t *)&(&SPI2_Handler)->Instance->DR = 0xFF ;
while((__HAL_SPI_GET_FLAG(&SPI2_Handler, SPI_FLAG_RXNE))==0);
return *(__IO uint8_t *)&(&SPI2_Handler)->Instance->DR;
}
#endif
uint8_t SPI1_ReadByte(void)
{
while((__HAL_SPI_GET_FLAG(&SPI1_Handler, SPI_FLAG_TXE))==0);
*(__IO uint8_t *)&(&SPI1_Handler)->Instance->DR = 0xFF ;
while((__HAL_SPI_GET_FLAG(&SPI1_Handler, SPI_FLAG_RXNE))==0);
return *(__IO uint8_t *)&(&SPI1_Handler)->Instance->DR;
}
/*-------------------------------------------------*/
/*函数名SPI2接口读写指定数量数据 */
/*参 数TxData发送的数据 */
/*参 数Rxdata发送的数据 */
/*参 数len发送的数据数量 */
/*返回值:无 */
/*-------------------------------------------------*/
#if 0
void SPI2_WriteRead(uint8_t *TxData, uint8_t *Rxdata, uint16_t len)
{
uint16_t i;
for(i=0;i<len;i++){
Rxdata[i] = SPI2_ReadWriteByte(TxData[i]);
}
}
#endif
void SPI1_WriteRead(uint8_t *TxData, uint8_t *Rxdata, uint16_t len)
{
uint16_t i;
for(i=0;i<len;i++){
Rxdata[i] = SPI1_ReadWriteByte(TxData[i]);
}
}
/*-------------------------------------------------*/
/*函数名SPI2接口写指定数量数据 */
/*参 数TxData发送的数据 */
/*参 数len发送的数据数量 */
/*返回值:无 */
/*-------------------------------------------------*/
#if 0
void SPI2_Write(uint8_t *TxData, uint16_t len)
{
uint16_t i;
for(i=0;i<len;i++){
SPI2_WriteByte(TxData[i]);
}
}
#endif
void SPI1_Write(uint8_t *TxData, uint16_t len)
{
uint16_t i;
for(i=0;i<len;i++){
SPI1_WriteByte(TxData[i]);
}
}
/*-------------------------------------------------*/
/*函数名SPI2接口读指定数量数据 */
/*参 数TxData发送的数据 */
/*参 数len发送的数据数量 */
/*返回值:无 */
/*-------------------------------------------------*/
#if 0
void SPI2_Read(uint8_t *Rxdata, uint16_t len)
{
uint16_t i;
for(i=0;i<len;i++){
Rxdata[i] = SPI2_ReadWriteByte(0xFF);
}
}
#endif
void SPI1_Read(uint8_t *Rxdata, uint16_t len)
{
uint16_t i;
for(i=0;i<len;i++){
Rxdata[i] = SPI1_ReadWriteByte(0xFF);
}
}