rt-thread-official/bsp/swm320-lq100/Libraries/SWM320_StdPeriph_Driver/SWM320_spi.c

544 lines
26 KiB
C
Raw Normal View History

2018-12-24 17:17:27 +08:00
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SWM320_spi.c
* : SWM320单片机的SPI功能驱动库
* : http://www.synwit.com.cn/e/tool/gbook/?bid=1
* :
* : V1.1.0 20171025
* :
2018-12-24 17:17:27 +08:00
*
*
*******************************************************************************************************************************************
* @attention
*
* THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
* REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
* FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
* OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
* -ECTION WITH THEIR PRODUCTS.
*
* COPYRIGHT 2012 Synwit Technology
*******************************************************************************************************************************************/
#include "SWM320.h"
#include "SWM320_spi.h"
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_Init()
* : SPI同步串行接口初始化FIFO触发设定
* : SPI_TypeDef * SPIx SPISPI0SPI1
* SPI_InitStructure * initStruct SPI相关设定值的结构体
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitStructure *initStruct)
{
switch ((uint32_t)SPIx)
{
case ((uint32_t)SPI0):
SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos);
break;
case ((uint32_t)SPI1):
2021-09-30 17:55:16 +08:00
SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos); //与SPI0使用同一位时钟使能
2018-12-24 17:17:27 +08:00
break;
}
2021-09-30 17:55:16 +08:00
SPI_Close(SPIx); //一些关键寄存器只能在SPI关闭时设置
2018-12-24 17:17:27 +08:00
SPIx->CTRL &= ~(SPI_CTRL_FFS_Msk | SPI_CTRL_CPHA_Msk | SPI_CTRL_CPOL_Msk |
SPI_CTRL_SIZE_Msk | SPI_CTRL_MSTR_Msk | SPI_CTRL_CLKDIV_Msk | SPI_CTRL_SSN_H_Msk);
2021-09-30 17:55:16 +08:00
SPIx->CTRL |= (initStruct->FrameFormat << SPI_CTRL_FFS_Pos) |
(initStruct->SampleEdge << SPI_CTRL_CPHA_Pos) |
(initStruct->IdleLevel << SPI_CTRL_CPOL_Pos) |
((initStruct->WordSize - 1) << SPI_CTRL_SIZE_Pos) |
(initStruct->Master << SPI_CTRL_MSTR_Pos) |
(initStruct->clkDiv << SPI_CTRL_CLKDIV_Pos) |
(0 << SPI_CTRL_SSN_H_Pos);
SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos); //清除中断标志
2018-12-24 17:17:27 +08:00
SPIx->IE &= ~(SPI_IE_RFHF_Msk | SPI_IE_TFHF_Msk | SPI_IE_FTC_Msk);
SPIx->IE |= (initStruct->RXHFullIEn << SPI_IE_RFHF_Pos) |
(initStruct->TXEmptyIEn << SPI_IE_TFHF_Pos) |
(initStruct->TXCompleteIEn << SPI_IE_FTC_Pos);
switch ((uint32_t)SPIx)
{
case ((uint32_t)SPI0):
if (initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
{
NVIC_EnableIRQ(SPI0_IRQn);
}
else
{
NVIC_DisableIRQ(SPI0_IRQn);
}
break;
case ((uint32_t)SPI1):
if (initStruct->RXHFullIEn | initStruct->TXEmptyIEn | initStruct->TXCompleteIEn)
{
NVIC_EnableIRQ(SPI1_IRQn);
}
else
{
NVIC_DisableIRQ(SPI1_IRQn);
}
break;
}
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_Open()
* : SPI打开
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_Open(SPI_TypeDef *SPIx)
{
SPIx->CTRL |= (0x01 << SPI_CTRL_EN_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_Close()
* : SPI关闭
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_Close(SPI_TypeDef *SPIx)
{
SPIx->CTRL &= ~SPI_CTRL_EN_Msk;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_Read()
* :
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_Read(SPI_TypeDef *SPIx)
{
return SPIx->DATA;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_Write()
* :
* : SPI_TypeDef * SPIx SPISPI0SPI1
* uint32_t
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_Write(SPI_TypeDef *SPIx, uint32_t data)
{
SPIx->DATA = data;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_WriteWithWait()
* :
* : SPI_TypeDef * SPIx SPISPI0SPI1SPI1
* uint32_t
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data)
{
SPIx->STAT |= (1 << SPI_STAT_WTC_Pos);
SPIx->DATA = data;
2021-09-30 17:55:16 +08:00
while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0)
;
2018-12-24 17:17:27 +08:00
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_ReadWrite()
* :
* : SPI_TypeDef * SPIx SPISPI0SPI1
* uint32_t data
* : uint32_t
* : SPI模块SPI_Write()SPI_Write()SPI_STAT_RFNE状态
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
{
SPIx->DATA = data;
2021-09-30 17:55:16 +08:00
while (!(SPIx->STAT & SPI_STAT_RFNE_Msk))
;
2018-12-24 17:17:27 +08:00
return SPIx->DATA;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_IsRXEmpty()
* : FIFO是否空SPI_Read()
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO空 0 FIFO非空
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx)
{
return (SPIx->STAT & SPI_STAT_RFNE_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_IsTXFull()
* : FIFO是否满SPI_Write()
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO满 0 FIFO不满
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx)
{
return (SPIx->STAT & SPI_STAT_TFNF_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_IsTXEmpty()
* : FIFO是否空
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO空 0 FIFO非空
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx)
{
return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXHalfFullEn()
* : FIFO半满中断使能
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_RFHF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXHalfFullDis()
* : FIFO半满中断禁止
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_RFHF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXHalfFullClr()
* : FIFO半满中断标志清除
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
******************************************************************************************************************************************/
void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_RFHF_Pos);
}
/******************************************************************************************************************************************
* : SPI_INTRXHalfFullStat()
* : FIFO半满中断状态
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO达到半满 0 FIFO未达到半满
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_RFHF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXFullEn()
* : FIFO满中断使能
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTRXFullEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_RFF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXFullDis()
* : FIFO满中断禁止
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTRXFullDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_RFF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXFullClr()
* : FIFO满中断标志清除
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
******************************************************************************************************************************************/
void SPI_INTRXFullClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_RFF_Pos);
}
/******************************************************************************************************************************************
* : SPI_INTRXFullStat()
* : FIFO满中断状态
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO满 0 FIFO未满
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_RFF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXOverflowEn()
* : FIFO溢出中断使能
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_RFOVF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXOverflowDis()
* : FIFO溢出中断禁止
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_RFOVF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXOverflowClr()
* : FIFO溢出中断标志清除
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTRXOverflowStat()
* : FIFO溢出中断状态
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO溢出 0 FIFO未溢出
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_RFOVF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXHalfFullEn()
* : FIFO半满中断使能
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_TFHF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXHalfFullDis()
* : FIFO半满中断禁止
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_TFHF_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXHalfFullClr()
* : FIFO半满中断标志清除
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
******************************************************************************************************************************************/
void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_TFHF_Pos);
}
/******************************************************************************************************************************************
* : SPI_INTTXHalfFullStat()
* : FIFO半满中断状态
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO达到半满 0 FIFO未达到半满
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_TFHF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXEmptyEn()
* : FIFO空中断使能
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_TFE_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXEmptyDis()
* : FIFO空中断禁止
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_TFE_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXEmptyClr()
* : FIFO空中断标志清除
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
******************************************************************************************************************************************/
void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_TFE_Pos);
}
/******************************************************************************************************************************************
* : SPI_INTTXEmptyStat()
* : FIFO空中断状态
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO空 0 FIFO非空
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_TFE_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXCompleteEn()
* : FIFO空且发送移位寄存器空中断使能
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_FTC_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXCompleteDis()
* : FIFO空且发送移位寄存器空中断禁止
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_FTC_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXCompleteClr()
* : FIFO空且发送移位寄存器空中断状态清除
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_FTC_Pos);
}
/******************************************************************************************************************************************
2021-09-30 17:55:16 +08:00
* : SPI_INTTXCompleteStat()
* : FIFO空且发送移位寄存器空中断状态
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 FIFO空且发送移位寄存器空 0 FIFO或发送移位寄存器非空
* :
2018-12-24 17:17:27 +08:00
******************************************************************************************************************************************/
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0;
}
2021-09-30 17:55:16 +08:00
/******************************************************************************************************************************************
* : SPI_INTTXWordCompleteEn()
* : FIFO字发送完成中断使能
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
******************************************************************************************************************************************/
void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_WTC_Pos);
}
/******************************************************************************************************************************************
* : SPI_INTTXWordCompleteDis()
* : FIFO字发送完成中断禁止
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
******************************************************************************************************************************************/
void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_WTC_Pos);
}
/******************************************************************************************************************************************
* : SPI_INTTXWordCompleteClr()
* : FIFO字发送完成中断标志清除
* : SPI_TypeDef * SPIx SPISPI0SPI1
* :
* :
******************************************************************************************************************************************/
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_WTC_Pos);
}
/******************************************************************************************************************************************
* : SPI_INTTXWordCompleteStat()
* : FIFO字发送完成中断状态
* : SPI_TypeDef * SPIx SPISPI0SPI1
* : uint32_t 1 0
* :
******************************************************************************************************************************************/
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_WTC_Msk) ? 1 : 0;
}