rt-thread-official/bsp/swm320/libraries/SWM320_StdPeriph_Driver/SWM320_spi.c

544 lines
26 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.

/******************************************************************************************************************************************
* 文件名称: SWM320_spi.c
* 功能说明: SWM320单片机的SPI功能驱动库
* 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
* 注意事项:
* 版本日期: V1.1.0 2017年10月25日
* 升级记录:
*
*
*******************************************************************************************************************************************
* @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"
/******************************************************************************************************************************************
* 函数名称: SPI_Init()
* 功能说明: SPI同步串行接口初始化包括帧长度设定、时序设定、速度设定、中断设定、FIFO触发设定
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* SPI_InitStructure * initStruct 包含SPI相关设定值的结构体
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
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):
SYS->CLKEN |= (0x01 << SYS_CLKEN_SPI0_Pos); //与SPI0使用同一位时钟使能
break;
}
SPI_Close(SPIx); //一些关键寄存器只能在SPI关闭时设置
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);
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); //清除中断标志
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;
}
}
/******************************************************************************************************************************************
* 函数名称: SPI_Open()
* 功能说明: SPI打开允许收发
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_Open(SPI_TypeDef *SPIx)
{
SPIx->CTRL |= (0x01 << SPI_CTRL_EN_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_Close()
* 功能说明: SPI关闭禁止收发
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_Close(SPI_TypeDef *SPIx)
{
SPIx->CTRL &= ~SPI_CTRL_EN_Msk;
}
/******************************************************************************************************************************************
* 函数名称: SPI_Read()
* 功能说明: 读取一个数据
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 读取到的数据
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_Read(SPI_TypeDef *SPIx)
{
return SPIx->DATA;
}
/******************************************************************************************************************************************
* 函数名称: SPI_Write()
* 功能说明: 写入一个数据
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* uint32_t 要写入的数据
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_Write(SPI_TypeDef *SPIx, uint32_t data)
{
SPIx->DATA = data;
}
/******************************************************************************************************************************************
* 函数名称: SPI_WriteWithWait()
* 功能说明: 写入一个数据并等待数据完全发送出去
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1、SPI1
* uint32_t 要写入的数据
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_WriteWithWait(SPI_TypeDef *SPIx, uint32_t data)
{
SPIx->STAT |= (1 << SPI_STAT_WTC_Pos);
SPIx->DATA = data;
while ((SPIx->STAT & SPI_STAT_WTC_Msk) == 0)
;
}
/******************************************************************************************************************************************
* 函数名称: SPI_ReadWrite()
* 功能说明: 发送一个数据,并返回发送过程中接收到的
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* uint32_t data 要发送的数据
* 输 出: uint32_t 接收到的数据
* 注意事项: 对于同一个SPI模块此函数不应与SPI_Write()混着用因为SPI_Write()不清除SPI_STAT_RFNE状态
******************************************************************************************************************************************/
uint32_t SPI_ReadWrite(SPI_TypeDef *SPIx, uint32_t data)
{
SPIx->DATA = data;
while (!(SPIx->STAT & SPI_STAT_RFNE_Msk))
;
return SPIx->DATA;
}
/******************************************************************************************************************************************
* 函数名称: SPI_IsRXEmpty()
* 功能说明: 接收FIFO是否空如果不空则可以继续SPI_Read()
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 接收FIFO空 0 接收FIFO非空
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_IsRXEmpty(SPI_TypeDef *SPIx)
{
return (SPIx->STAT & SPI_STAT_RFNE_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
* 函数名称: SPI_IsTXFull()
* 功能说明: 发送FIFO是否满如果不满则可以继续SPI_Write()
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 发送FIFO满 0 发送FIFO不满
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_IsTXFull(SPI_TypeDef *SPIx)
{
return (SPIx->STAT & SPI_STAT_TFNF_Msk) ? 0 : 1;
}
/******************************************************************************************************************************************
* 函数名称: SPI_IsTXEmpty()
* 功能说明: 发送FIFO是否空
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 发送FIFO空 0 发送FIFO非空
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_IsTXEmpty(SPI_TypeDef *SPIx)
{
return (SPIx->STAT & SPI_STAT_TFE_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXHalfFullEn()
* 功能说明: 接收FIFO半满中断使能
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXHalfFullEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_RFHF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXHalfFullDis()
* 功能说明: 接收FIFO半满中断禁止
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXHalfFullDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_RFHF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXHalfFullClr()
* 功能说明: 接收FIFO半满中断标志清除
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXHalfFullClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_RFHF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXHalfFullStat()
* 功能说明: 接收FIFO半满中断状态
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 接收FIFO达到半满 0 接收FIFO未达到半满
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_INTRXHalfFullStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_RFHF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXFullEn()
* 功能说明: 接收FIFO满中断使能
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXFullEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_RFF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXFullDis()
* 功能说明: 接收FIFO满中断禁止
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXFullDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_RFF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXFullClr()
* 功能说明: 接收FIFO满中断标志清除
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXFullClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_RFF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXFullStat()
* 功能说明: 接收FIFO满中断状态
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 接收FIFO满 0 接收FIFO未满
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_INTRXFullStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_RFF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXOverflowEn()
* 功能说明: 接收FIFO溢出中断使能
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXOverflowEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_RFOVF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXOverflowDis()
* 功能说明: 接收FIFO溢出中断禁止
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXOverflowDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_RFOVF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXOverflowClr()
* 功能说明: 接收FIFO溢出中断标志清除
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTRXOverflowClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (0x01 << SPI_IF_RFOVF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTRXOverflowStat()
* 功能说明: 接收FIFO溢出中断状态
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 接收FIFO溢出 0 接收FIFO未溢出
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_INTRXOverflowStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_RFOVF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXHalfFullEn()
* 功能说明: 发送FIFO半满中断使能
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXHalfFullEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_TFHF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXHalfFullDis()
* 功能说明: 发送FIFO半满中断禁止
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXHalfFullDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_TFHF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXHalfFullClr()
* 功能说明: 发送FIFO半满中断标志清除
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXHalfFullClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_TFHF_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXHalfFullStat()
* 功能说明: 发送FIFO半满中断状态
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 发送FIFO达到半满 0 发送FIFO未达到半满
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_INTTXHalfFullStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_TFHF_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXEmptyEn()
* 功能说明: 发送FIFO空中断使能
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXEmptyEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_TFE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXEmptyDis()
* 功能说明: 发送FIFO空中断禁止
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXEmptyDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_TFE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXEmptyClr()
* 功能说明: 发送FIFO空中断标志清除
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXEmptyClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_TFE_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXEmptyStat()
* 功能说明: 发送FIFO空中断状态
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 发送FIFO空 0 发送FIFO非空
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_INTTXEmptyStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_TFE_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXCompleteEn()
* 功能说明: 发送FIFO空且发送移位寄存器空中断使能
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXCompleteEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_FTC_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXCompleteDis()
* 功能说明: 发送FIFO空且发送移位寄存器空中断禁止
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXCompleteDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_FTC_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXCompleteClr()
* 功能说明: 发送FIFO空且发送移位寄存器空中断状态清除
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXCompleteClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_FTC_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXCompleteStat()
* 功能说明: 发送FIFO空且发送移位寄存器空中断状态
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 发送FIFO空且发送移位寄存器空 0 发送FIFO或发送移位寄存器非空
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_INTTXCompleteStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_FTC_Msk) ? 1 : 0;
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXWordCompleteEn()
* 功能说明: 发送FIFO字发送完成中断使能
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXWordCompleteEn(SPI_TypeDef *SPIx)
{
SPIx->IE |= (0x01 << SPI_IE_WTC_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXWordCompleteDis()
* 功能说明: 发送FIFO字发送完成中断禁止
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXWordCompleteDis(SPI_TypeDef *SPIx)
{
SPIx->IE &= ~(0x01 << SPI_IE_WTC_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXWordCompleteClr()
* 功能说明: 发送FIFO字发送完成中断标志清除
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: 无
* 注意事项: 无
******************************************************************************************************************************************/
void SPI_INTTXWordCompleteClr(SPI_TypeDef *SPIx)
{
SPIx->IF = (1 << SPI_IF_WTC_Pos);
}
/******************************************************************************************************************************************
* 函数名称: SPI_INTTXWordCompleteStat()
* 功能说明: 发送FIFO字发送完成中断状态
* 输 入: SPI_TypeDef * SPIx 指定要被设置的SPI有效值包括SPI0、SPI1
* 输 出: uint32_t 1 发送完成中断已发生 0 发送完成中断未发生
* 注意事项: 无
******************************************************************************************************************************************/
uint32_t SPI_INTTXWordCompleteStat(SPI_TypeDef *SPIx)
{
return (SPIx->IF & SPI_IF_WTC_Msk) ? 1 : 0;
}