TC397 之 TLF35584 应用部分代码实现章节

1 底层SPI配置见《TC397 之 TLF35584 SPI配置 代码实现章节》博客

2 TLF35584

2.1 TLF35584获取SPI通信状态

static uint8 SpiTask_GetTlf35584SpiState(void)
{
    uint8 ret = 0;

    /* SPI status flags *R2) reg address: 0x1F*/
	ret = SpiDrv_Qspi0DataExchange(0, 0x1F, 0x00);

    if(ret == TRUE)
    {
        s_SpiState = (g_Qspi0RxData >> 1) & 0xFF;

        return s_SpiState;
    }
    else
    {
        return 0xFF;
    }
}

2.2 保护寄存器解锁和上锁

/**
 * @brief 
 * @function
 * @param  [in]State
 * 0: Unlock
 * 1: Lock
 * @return uint8 
 */
static uint8 SpiTask_SwitchProtectionReg(boolean State)
{
    uint8 ret;

    /* Protection register *R2): 0x03*/
    /* Unlock: 1: 0xAB 2:0xEF 3:0x56 4:0x12*/
    if(State == FALSE)
    {
        ret = SpiDrv_Qspi0DataExchange(1, 0x03, 0xAB);
        if(ret == TRUE)
        {
            ret = SpiDrv_Qspi0DataExchange(1, 0x03, 0xEF);
            if(ret == TRUE)
            {
                ret = SpiDrv_Qspi0DataExchange(1, 0x03, 0x56);
                if(ret == TRUE)
                {
                    SpiDrv_Qspi0DataExchange(1, 0x03, 0x12);
                }
            }
        }
    }
    /* Lock: 1: 0xDF 2:0x34 3:0xBE 4:0xCA*/
    else
    {
        ret = SpiDrv_Qspi0DataExchange(1, 0x03, 0xDF);
        if(ret == TRUE)
        {
            ret = SpiDrv_Qspi0DataExchange(1, 0x03, 0x34);
            if(ret == TRUE)
            {
                ret = SpiDrv_Qspi0DataExchange(1, 0x03, 0xBE);
                if(ret == TRUE)
                {
                    SpiDrv_Qspi0DataExchange(1, 0x03, 0xCA);
                }
            }
        }
    }

    return (ret==1) ? 0:0xFF;
}

2.3 控制QST电源开关

/**
 * @brief 
 * @function
 * @param  [in]State
 * 0: Close
 * 1: Open
 * @return uint8 
 */
static uint8 SpiTask_SwitchTlf35584StandbyQST(boolean State)
{
    uint8 regData = 0;
    uint8 ret = 0;

    /* Protected System configuration request 0 *R1): 0x04*/
    /* System configuration 0 status *R0): 0x0B*/

    for(uint8 i =0; i<5; i++)
    {
        /* read reg */
        ret = SpiDrv_Qspi0DataExchange(0, 0x0B, 0x00);

        if(ret == TRUE)
        {
            regData = (g_Qspi0RxData >> 1) & 0xFF;

            if((regData & 0x1) != State)
            {
                regData = State;

                /* write reg */
                SpiDrv_Qspi0DataExchange(1, 0x04, regData);
            }
            else
            {
                return 0;
            }
        }
    }
    
    return 0xFF;
}

2.4 获取当前工作状态

static uint8 SpiTask_GetTlf35584State(void)
{
    uint8 regData = 0;
    uint8 ret = 0;

    /* Device status reg address: 0x27*/
	ret = SpiDrv_Qspi0DataExchange(0, 0x27, 0x00);

    if(ret == TRUE)
    {
        regData = (g_Qspi0RxData >> 1) & 0xFF;

        return (regData & 0x3);
    }
    else
    {
        return 0xFF;
    }
}

2.5 工作状态切换(NORMAL STANDBY)

/**
 * @brief 
 * @function: Set tlf35584 work state.
 * @param  [in]StateReq
 * 0: NONE
 * 1: INIT
 * 2: NORMAL
 * 3: SLEEP
 * 4: STANDBY
 * 5:WAKE
 * 6/7: RESERVED
 * @return uint8 
 */
static uint8 SpiTask_SetTlf35584State(uint8 StateReq)
{
    uint8 regData = 0;
    uint8 ret = 0;

    /* Device control request *R2) reg address: 0x15*/
    /* Device control inverted request *R2) reg address: 0x16*/
    for(uint8 i =0; i<5; i++)
    {
        /* read reg */
        ret = SpiTask_GetTlf35584State();

        if(ret != 0xFF)
        {
            if(ret != StateReq)
            {
                regData = StateReq;

                if(StateReq == 4)
                {
                    if(ret != 2)
                    {
                        /* write reg */
                        SpiDrv_Qspi0DataExchange(1, 0x15, 0x02);
                        SpiDrv_Qspi0DataExchange(1, 0x16, (~0x02));
                        SpiTask_SwitchProtectionReg(0);
                        SpiTask_SwitchTlf35584StandbyQST(0);
                        SpiTask_SwitchProtectionReg(1);
                            
                    }

                }
                else if(StateReq == 2)
                {
                    regData |= 0x80;
                }
        
                /* write reg */
                SpiDrv_Qspi0DataExchange(1, 0x15, regData);
                SpiDrv_Qspi0DataExchange(1, 0x16, (~regData));
                
            }
            else
            {
                return 0;
            }
        }
    }
    
    return 0xFF;
}

2.6 关闭看门狗

static uint8 SpiTask_CloseTlf35584Wdgs(void)
{
    uint8 regData = 0;
    uint8 ret = 0;

    /* Protected Watchdog configuration request 0 reg address: 0x06*/
    /* Watchdog configuration 0 status *R3) reg address: 0x0D*/

    for(uint8 i =0; i<5; i++)
    {
        /* read reg */
        ret = SpiDrv_Qspi0DataExchange(0, 0x0D, 0x00);

        if(ret == TRUE)
        {
            regData = (g_Qspi0RxData >> 1) & 0xFF;

            if(regData & 0xC)
            {
                regData &= (~0xC);

                /* write reg */
                SpiDrv_Qspi0DataExchange(1, 0x06, regData);
            }
            else
            {
                return 0;
            }
        }
    }
    
    return 0xFF;
}

2.7 关闭EER PIN 监测

static uint8 SpiTask_CloseTlf35584ErrMonitor(void)
{
    uint8 regData = 0;
    uint8 ret = 0;

    /* Protected System configuration request 1 *R2): 0x05*/
    /* System configuration 1 status *R3): 0x0C*/

    for(uint8 i =0; i<5; i++)
    {
        /* read reg */
        ret = SpiDrv_Qspi0DataExchange(0, 0x0C, 0x00);

        if(ret == TRUE)
        {
            regData = (g_Qspi0RxData >> 1) & 0xFF;

            if(regData & 0x8)
            {
                regData &= (~0x8);

                /* write reg */
                SpiDrv_Qspi0DataExchange(1, 0x05, regData);
            }
            else
            {
                return 0;
            }
        }
    }
    
    return 0xFF;
}

2.8 初始化状态切换至NORMAL状态

static void SpiTask_Tlf35584SwitchState_INIT_NORMAL(void)
{
    uint8 ret =0, ret1 = 0, ret2 =0, ret3 = 0;

    /* MSP P00.6 Set HIGH*/
    /* KL15 P21.6 */
    const IfxPort_Io_ConfigPin configPin[] = 
    {
        {&IfxPort_P21_6,  IfxPort_Mode_inputPullUp, IfxPort_PadDriver_cmosAutomotiveSpeed1},             
        {&IfxPort_P00_6, IfxPort_Mode_outputPushPullGeneral, IfxPort_PadDriver_cmosAutomotiveSpeed1},      
    };
    const IfxPort_Io_Config conf = 
    {
        sizeof(configPin)/sizeof(IfxPort_Io_ConfigPin),
        (IfxPort_Io_ConfigPin *)configPin
    };
    IfxPort_Io_initModule(&conf);
    IfxPort_setPinHigh(&MODULE_P00, 6); 

    for(uint8 i=0; i<10; i++)
    {
        ret = SpiTask_SwitchProtectionReg(0);
        if(ret == 0)
        {
            ret1 = SpiTask_CloseTlf35584Wdgs();
            ret2 = SpiTask_CloseTlf35584ErrMonitor();
            ret3 = SpiTask_SwitchTlf35584StandbyQST(0);

            if((ret1 == 0) && (ret2 == 0) && (ret3 == 0))
            {
                SpiTask_SwitchProtectionReg(1);
                break;
            }
        }
    }
    
    SpiTask_SetTlf35584State(2);
}

2.9 设备初始化函数

void SpiTask_Init(void)
{
    SpiDrv_Qspi0Init();
    SpiTask_Tlf35584SwitchState_INIT_NORMAL();
    SpiTask_GetTlf35584SpiState();
}

2.10 TLF35584 根据实时的KL15/ACC状态判断是否需要切换到STANDBY模式

/**
 * @brief 
 * @function: 100ms period
 */
void SpiTask_Tlf35584SwitchState_NORMAL_STANDBY(void)
{
    /* KL15 = !Kl15PinDetState */
    boolean Kl15PinDetState = IfxPort_getPinState(&MODULE_P21, 6); // read P21.6
    static uint8 Kl15HighTime = 0, Kl15LowTime = 0;

    if(Kl15PinDetState == TRUE)
    {
        Kl15HighTime++;

        if(Kl15LowTime != 0)
        {
            Kl15LowTime = 0;
        }
    }
    else
    {
        Kl15LowTime++;
        if(Kl15HighTime != 0)
        {
            Kl15HighTime = 0;
        }
    }

    if(((Kl15PinDetState == TRUE) && (g_Kl15State == FALSE)) ||\
       ((Kl15PinDetState == FALSE) && (g_Kl15State == TRUE)))
    {
        if(Kl15HighTime != 0)
        {
            Kl15HighTime = 0;
        }
        if(Kl15LowTime != 0)
        {
            Kl15LowTime = 0;
        }
    }

    /* time > 1S */
    if(( Kl15HighTime > 10 ) && (Kl15LowTime == 0))
    {
        if(g_Kl15State != FALSE)
        {
            g_Kl15State = FALSE;
            SpiTask_SetTlf35584State(4);
        }
    }
    else if (( Kl15HighTime == 0 ) && (Kl15LowTime > 10))
    {
        if(g_Kl15State != TRUE)
        {
            g_Kl15State = TRUE;
        }
    }
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值