current_v/Drivers/FM33LG0xx_FL_Driver/Src/fm33lg0xx_fl_spi.c

230 lines
8.8 KiB
C
Raw Permalink Normal View History

2025-12-31 08:21:43 +08:00
/**
*******************************************************************************************************
* @file fm33lg0xx_fl_spi.c
* @author FMSH Application Team
* @brief Src file of SPI FL Module
*******************************************************************************************************
* @attention
*
* Copyright (c) [2021] [Fudan Microelectronics]
* THIS SOFTWARE is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*
*******************************************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "fm33lg0xx_fl.h"
/** @addtogroup FM33LG0XX_FL_Driver
* @{
*/
/** @addtogroup SPI
* @{
*/
#ifdef FL_SPI_DRIVER_ENABLED
/* Private macros ------------------------------------------------------------*/
/** @addtogroup SPI_FL_Private_Macros
* @{
*/
#define IS_FL_SPI_INSTANCE(INTANCE) (((INTANCE) == SPI0)||\
((INTANCE) == SPI1)||\
((INTANCE) == SPI2))
#define IS_FL_SPI_MODE(__VALUE__) (((__VALUE__) == FL_SPI_WORK_MODE_SLAVE)||\
((__VALUE__) == FL_SPI_WORK_MODE_MASTER))
#define IS_FL_SPI_BITORDER(__VALUE__) (((__VALUE__) == FL_SPI_BIT_ORDER_MSB_FIRST)||\
((__VALUE__) == FL_SPI_BIT_ORDER_LSB_FIRST))
#define IS_FL_SPI_DATAWIDT(__VALUE__) (((__VALUE__) == FL_SPI_DATA_WIDTH_8B)||\
((__VALUE__) == FL_SPI_DATA_WIDTH_16B)||\
((__VALUE__) == FL_SPI_DATA_WIDTH_24B)||\
((__VALUE__) == FL_SPI_DATA_WIDTH_32B))
#define IS_FL_SPI_CLOCK_PHASE(__VALUE__) (((__VALUE__) == FL_SPI_PHASE_EDGE1)||\
((__VALUE__) == FL_SPI_PHASE_EDGE2))
#define IS_FL_SPI_CLOCK_POLARITY(__VALUE__) (((__VALUE__) == FL_SPI_POLARITY_NORMAL)||\
((__VALUE__) == FL_SPI_POLARITY_INVERT))
#define IS_FL_SPI_BAUDRATE(__VALUE__) (((__VALUE__) == FL_SPI_BAUDRATE_DIV2)||\
((__VALUE__) == FL_SPI_BAUDRATE_DIV4)||\
((__VALUE__) == FL_SPI_BAUDRATE_DIV8)||\
((__VALUE__) == FL_SPI_BAUDRATE_DIV16)||\
((__VALUE__) == FL_SPI_BAUDRATE_DIV32)||\
((__VALUE__) == FL_SPI_BAUDRATE_DIV64)||\
((__VALUE__) == FL_SPI_BAUDRATE_DIV128)||\
((__VALUE__) == FL_SPI_BAUDRATE_DIV256))
#define IS_FL_SPI_TANSFERMODE(__VALUE__) (((__VALUE__) == FL_SPI_TRANSFER_MODE_FULL_DUPLEX)||\
((__VALUE__) == FL_SPI_TRANSFER_MODE_HALF_DUPLEX))
/**
* @}
*/
/* Exported functions --------------------------------------------------------*/
/** @addtogroup SPI_FL_EF_Init
* @{
*/
/**
* @brief SPI寄存器.
* @param SPIx
* @retval ErrorStatus枚举值:
* -FL_PASS
* -FL_FAIL
*/
FL_ErrorStatus FL_SPI_DeInit(SPI_Type *SPIx)
{
assert_param(IS_FL_SPI_INSTANCE(SPIx));
/* 使能外设复位 */
FL_RMU_EnablePeripheralReset(RMU);
if(SPIx == SPI0)
{
/* 复位SPI外设寄存器 */
FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI0);
FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI0);
/* 关闭外设总线始时钟和工作时钟 */
FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI0);
}
else
if(SPIx == SPI1)
{
/* 复位SPI外设寄存器 */
FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI1);
FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI1);
/* 关闭外设总线始时钟和工作时钟 */
FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI1);
}
else
if(SPIx == SPI2)
{
/* 复位SPI外设寄存器 */
FL_RMU_EnableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI2);
FL_RMU_DisableResetAPBPeripheral(RMU, FL_RMU_RSTAPB_SPI2);
/* 关闭外设总线始时钟和工作时钟 */
FL_CMU_DisableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI2);
}
else
{
FL_RMU_DisablePeripheralReset(RMU);
return FL_FAIL;
}
/* 锁定外设复位 */
FL_RMU_DisablePeripheralReset(RMU);
return FL_PASS;
}
/**
* @brief SPI_InitStruct .
* @param SPIx SPIx
* @param SPI_InitStruct @ref FL_SPI_InitTypeDef
* .
* @retval ErrorStatus枚举值
* -FL_FAIL
* -FL_PASS SPI配置成功
*/
FL_ErrorStatus FL_SPI_Init(SPI_Type *SPIx, FL_SPI_InitTypeDef *initStruct)
{
assert_param(IS_FL_SPI_INSTANCE(SPIx));
assert_param(IS_FL_SPI_MODE(initStruct->mode));
assert_param(IS_FL_SPI_BITORDER(initStruct->bitOrder));
assert_param(IS_FL_SPI_DATAWIDT(initStruct->dataWidth));
assert_param(IS_FL_SPI_BAUDRATE(initStruct->baudRate));
assert_param(IS_FL_SPI_CLOCK_PHASE(initStruct->clockPhase));
assert_param(IS_FL_SPI_CLOCK_POLARITY(initStruct->clockPolarity));
if(SPIx == SPI0)
{
/* 外设总线始时钟 */
FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI0);
}
else
if(SPIx == SPI1)
{
/* 外设总线始时钟 */
FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI1);
}
else
if(SPIx == SPI2)
{
/* 外设总线始时钟 */
FL_CMU_EnableGroup3BusClock(FL_CMU_GROUP3_BUSCLK_SPI2);
}
else
{
return FL_FAIL;
}
/* 选择NSS脚控制模式 */
if(initStruct->softControl == FL_ENABLE)
{
FL_SPI_EnableSSNSoftControl(SPIx);
}
else
{
FL_SPI_DisableSSNSoftControl(SPIx);
}
/* 外设工作主从模式 */
FL_SPI_SetWorkMode(SPIx, initStruct->mode);
/* 总线通讯速率 */
FL_SPI_SetClockDivision(SPIx, initStruct->baudRate);
/* 数据bit方向 */
FL_SPI_SetBitOrder(SPIx, initStruct->bitOrder);
/* 总线数据位宽 */
FL_SPI_SetDataWidth(SPIx, initStruct->dataWidth);
/* 时钟相位 */
FL_SPI_SetClockPhase(SPIx, initStruct->clockPhase);
/* 传输模式 双工半双工 */
FL_SPI_SetTransferMode(SPIx, initStruct->transferMode);
/* 时钟极性 */
FL_SPI_SetClockPolarity(SPIx, initStruct->clockPolarity);
/* 使能 外设*/
FL_SPI_Enable(SPIx);
return FL_PASS;
}
/**
* @brief SPI_InitStruct
* @param SPI_InitStruct @ref FL_SPI_InitTypeDef
*
* @retval None
*/
void FL_SPI_StructInit(FL_SPI_InitTypeDef *initStruct)
{
initStruct->softControl = FL_DISABLE;
initStruct->mode = FL_SPI_WORK_MODE_MASTER;
initStruct->baudRate = FL_SPI_CLK_DIV8;
initStruct->bitOrder = FL_SPI_BIT_ORDER_MSB_FIRST;
initStruct->dataWidth = FL_SPI_DATA_WIDTH_8B;
initStruct->clockPolarity = FL_SPI_POLARITY_NORMAL;
initStruct->clockPhase = FL_SPI_PHASE_EDGE1;
initStruct->transferMode = FL_SPI_TRANSFER_MODE_FULL_DUPLEX;
}
/**
* @}
*/
#endif /* FL_SPI_DRIVER_ENABLED */
/**
* @}
*/
/**
* @}
*/
/*************************(C) COPYRIGHT Fudan Microelectronics **** END OF FILE*************************/