You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

274 lines
6.6 KiB

/*********************************************************
*Copyright (C), 2015, Shanghai Eastsoft Microelectronics Co., Ltd.
*文件名: lib_spi.c
*作 者: AE Team
*版 本: V1.01
*日 期: 2021/06/09
*描 述: SPI模块库函数
*备 注:
本软件仅供学习和演示使用,对用户直接引用代码所带来的风险或后果不承担任何法律责任。
**********************************************************/
#include "lib_spi.h"
#include "system_ES8P5066.h"
/*************************************
函数名:SPI_Init
描 述:SPI初始化
输入值:SPI0/SPI1
初始化结构体
返回值:无
**************************************/
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStruType *SPI_InitStruct)
{
uint32_t tmp = 0;
if (SPI_InitStruct->SPI_Freq != SystemCoreClock)
{
tmp = SystemCoreClock / (SPI_InitStruct->SPI_Freq << 1);
tmp = tmp > 0xfe ? 0xff : tmp;
}
SPIx->CKS.CKS = tmp;
SPIx->CON.DW = SPI_InitStruct->SPI_DW;
SPIx->CON.DFS = SPI_InitStruct->SPI_Df;
SPIx->CON.MS = SPI_InitStruct->SPI_Mode;
SPIx->CON.DRE = SPI_InitStruct->SPI_DelayRec;
SPIx->CON.TME = SPI_InitStruct->SPI_DelaySend;
tmp = (uint32_t)SPI_InitStruct->SPI_SendDelayPeroid - 1;
tmp = tmp > 63 ? 63 : tmp;
SPIx->CON.TMP = tmp;
SPIx->CON.TXCLR = 1;
SPIx->CON.RXCLR = 1;
return;
}
/*************************************
函数名:SPI_ITConfig
描 述:配置中断使能
输入值:SPI0/SPI1
中断类型
使能/禁止
返回值:无
**************************************/
void SPI_ITConfig(SPI_TypeDef *SPIx, SPI_TYPE_IT SPI_IE, TYPE_FUNCEN NewState)
{
if (NewState != Disable)
SPIx->IE.Word |= (uint32_t)SPI_IE;
else
SPIx->IE.Word &= ~(uint32_t)SPI_IE;
return;
}
/*************************************
函数名:SPI_DataFormatConfig
描 述:SPI数据格式
输入值:SPI0/SPI1
数据格式
返回值:无
**************************************/
void SPI_DataFormatConfig(SPI_TypeDef *SPIx, SPI_TYPE_DFS Type)
{
SPIx->CON.DFS = Type;
return;
}
/*************************************
函数名:SPI_SendByte
描 述:发送一个字节
输入值:SPI0/SPI1
需要发送的数据
返回值:无
**************************************/
void SPI_SendByte(SPI_TypeDef *SPIx, uint8_t Temp)
{
SPIx->TBW.Byte[0] = Temp;
return;
}
/*************************************
函数名:SPI_SendHalfWord
描 述:发送半字
输入值:SPI0/SPI1
需要发送的数据
返回值:无
**************************************/
void SPI_SendHalfWord(SPI_TypeDef *SPIx, uint16_t Temp)
{
SPIx->TBW.HalfWord[0] = Temp;
return;
}
/*************************************
函数名:SPI_SendWord
描 述:发送字
输入值:SPI0/SPI1
需要发送的数据
返回值:无
**************************************/
void SPI_SendWord(SPI_TypeDef *SPIx, uint32_t Temp)
{
SPIx->TBW.Word = Temp;
return;
}
/*************************************
函数名:SPI_RecByte
描 述:接收一个字节
输入值:SPI0/SPI1
返回值:接收到的数据
**************************************/
uint8_t SPI_RecByte(SPI_TypeDef *SPIx)
{
return SPIx->RBR.Byte[0];
}
/*************************************
函数名:SPI_RecHalfWord
描 述:接收半字
输入值:SPI0/SPI1
返回值:接收到的数据
**************************************/
uint16_t SPI_RecHalfWord(SPI_TypeDef *SPIx)
{
return SPIx->RBR.HalfWord[0];
}
/*************************************
函数名:SPI_RecHalfWord
描 述:接收字
输入值:SPI0/SPI1
返回值:接收到的数据
**************************************/
uint32_t SPI_RecWord(SPI_TypeDef *SPIx)
{
return SPIx->RBR.Word;
}
/*************************************
函数名:SPI_TBIMConfig
描 述:配置发送缓冲器空中断类型
输入值:SPI0/SPI1
中断类型
返回值:无
**************************************/
void SPI_TBIMConfig(SPI_TypeDef *SPIx, SPI_TYPE_TRBIM Type)
{
SPIx->IE.TBIM = Type;
return;
}
/*************************************
函数名:SPI_RBIMConfig
描 述:配置接收缓冲器满中断类型
输入值:SPI0/SPI1
中断类型
返回值:无
**************************************/
void SPI_RBIMConfig(SPI_TypeDef *SPIx, SPI_TYPE_TRBIM Type)
{
SPIx->IE.RBIM = Type;
return;
}
/*************************************
函数名:SPI_GetFlagStatus
描 述:获取中断标志位状态
输入值:SPI0/SPI1
中断类型
返回值:SET/RESET
**************************************/
FlagStatus SPI_GetFlagStatus(SPI_TypeDef *SPIx, SPI_TYPE_FLAG Flag)
{
FlagStatus status = RESET;
if (Flag != SPI_Flag_TMS)
{
if (SPIx->IF.Word & (uint32_t)Flag)
status = SET;
}
else
{
if (SPIx->CON.Word & (uint32_t)Flag)
status = SET;
}
return status;
}
/*************************************
函数名:SPI_GetITStatus
描 述:获取中断使能状态
输入值:SPI0/SPI1
中断类型
返回值:SET/RESET
**************************************/
ITStatus SPI_GetITStatus(SPI_TypeDef *SPIx, SPI_TYPE_IT Flag)
{
ITStatus status = RESET;
if ((SPIx->IF.Word & (uint32_t)Flag) == RESET)
return status;
if ((SPIx->IE.Word & (uint32_t)Flag) != RESET)
status = SET;
return status;
}
/*************************************
函数名:SPI_GetStatus
描 述:获取SPI状态
输入值:SPI0/SPI1
状态类型
返回值:SET/RESET
**************************************/
FlagStatus SPI_GetStatus(SPI_TypeDef *SPIx, SPI_TYPE_STA Flag)
{
FlagStatus status = RESET;
if (SPIx->STA.Word & (uint32_t)Flag)
status = SET;
return status;
}
/*************************************
函数名:SPI_ClearITPendingBit
描 述:清除中断标志
输入值:SPI0/SPI1
状态类型
返回值:无
**************************************/
void SPI_ClearITPendingBit(SPI_TypeDef *SPI, SPI_CLR_IF Flag)
{
SPI->IF.Word = (uint32_t)Flag;
return;
}
/*************************************
函数名:Clear_TBW
描 述:清空发送缓冲器
输入值:SPI0/SPI1
返回值:无
**************************************/
void Clear_TBW(SPI_TypeDef *SPIx)
{
SPIx->CON.TXCLR = 1;
return;
}
/*************************************
函数名:Clear_RBR
描 述:清空接收缓冲器
输入值:SPI0/SPI1
返回值:无
**************************************/
void Clear_RBR(SPI_TypeDef *SPIx)
{
SPIx->CON.RXCLR = 1;
return;
}