#include "lks32mc09x_spi.h"
#include "lks32mc09x_sys.h"

/**
 * @brief SPI模块初始化函数
 * @param SPIx SPI模块指针
 * @param SPI_InitStruct 指向SPI初始化结构体的指针
 */
void SPI_Init(SPI_TypeDef *SPIx, SPI_InitTypeDef *SPI_InitStruct)
{
    // 使能SPI模块时钟
    SYS_ModuleClockCmd(SYS_MODULE_SPI0, ENABLE);

    // 配置SPI控制寄存器
    SPIx->CFG = (SPI_InitStruct->Duplex << 6) |
                (SPI_InitStruct->CS << 5) |
                (SPI_InitStruct->Mode << 4) |
                (SPI_InitStruct->CPHA << 3) |
                (SPI_InitStruct->CPOL << 2) |
                (SPI_InitStruct->ENDIAN << 1) |
                SPI_InitStruct->EN;

    // 配置SPI中断使能寄存器
    SPIx->IE = (SPI_InitStruct->IRQEna << 4) |
               (SPI_InitStruct->Trig << 3);

    // 配置SPI波特率
    SPIx->DIV = (SPI_InitStruct->TRANS_MODE << 15) |
                (SPI_InitStruct->BaudRate);

    // 配置SPI数据长度
    SPIx->SIZE = SPI_InitStruct->ByteLength;
}

/**
 * @brief SPI初始化结构体默认配置函数
 * @param SPI_InitStruct 指向SPI初始化结构体的指针
 */
void SPI_StructInit(SPI_InitTypeDef *SPI_InitStruct)
{
    for (int i = 0; i < sizeof(SPI_InitTypeDef); i++)
    {
        ((uint8_t *)SPI_InitStruct)[i] = 0;
    }
}

/**
 * @brief SPI发送数据函数
 * @param SPIx SPI模块指针
 * @param n 要发送的数据
 */
void SPI_SendData(SPI_TypeDef *SPIx, uint8_t n)
{
    SPIx->TX_DATA = n;
}

/**
 * @brief SPI读取数据函数
 * @param SPIx SPI模块指针
 * @return 读取到的数据
 */
uint8_t SPI_ReadData(SPI_TypeDef *SPIx)
{
    return (uint8_t)SPIx->RX_DATA;
}

/**
 * @brief 获取SPI中断标志位状态函数
 * @param SPIx SPI模块指针
 * @param IRQ_Flag 中断标志位
 * @return 中断标志位状态
 */
uint8_t SPI_GetIRQFlag(SPI_TypeDef *SPIx, uint8_t IRQ_Flag)
{
    return (SPIx->IE & IRQ_Flag) ? 1 : 0;
}

/**
 * @brief 清除SPI中断标志位函数
 * @param SPIx SPI模块指针
 * @param IRQ_Flag 要清除的中断标志位
 */
void SPI_ClearIRQFlag(SPI_TypeDef *SPIx, uint8_t IRQ_Flag)
{
    SPIx->IE = (SPIx->IE & 0xf8) | IRQ_Flag;
}
