si4438 的初始化

来源:互联网 发布:java怎么定义函数 编辑:程序博客网 时间:2024/06/06 23:19
void si4438_Init(){
  
  si446x_reset();
  si446x_part_info();    //进入si4438
  while (SI446X_SUCCESS != si446x_configuration_init(Radio_Configuration_Data_Array)){   //Radio_Configuration_Data_Array  由WDS 产生的头文件生成
    si446x_reset();   //若初始化不成功,则一直初始化
  }
  si446x_get_int_status(0u, 0u, 0u); //清除标志中获取中断状态/挂起标志
  si446x_set_property(0x12, 0x02, 0x0d, 0x00, 255u);  //发送命令
  vRadio_StartRX(CHANNEL1, 0); //处于接收状态

}


void si446x_reset(void)
{
    U16 loopCount;                                               

    radio_hal_AssertShutdown();    //引脚拉高,芯片关闭                                            
    for (loopCount = 1000; loopCount != 0; loopCount--); //延时
    radio_hal_DeassertShutdown(); //引脚拉低,芯片使能
    for (loopCount = 1000; loopCount != 0; loopCount--);  //延时
    radio_comm_ClearCTS();    
}

 void radio_hal_DeassertShutdown(void)  //看芯片手册 SDN 管脚   在 管脚初始化的时候  SDN 管脚的初始化不能忘记

  {
      GPIO_ResetBits(GPIOB, GPIO_Pin_1);
  }


void radio_hal_AssertShutdown(void)  //看芯片手册 SDN 管脚  

  {
      GPIO_SetBits(GPIOB, GPIO_Pin_1);
  }


void si446x_part_info(void)
{
    Pro2Cmd[0] = SI446X_CMD_ID_PART_INFO;


    radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_PART_INFO,
                              Pro2Cmd,
                              SI446X_CMD_REPLY_COUNT_PART_INFO,
                              Pro2Cmd );


    Si446xCmd.PART_INFO.CHIPREV         = Pro2Cmd[0];
    Si446xCmd.PART_INFO.PART            = ((U16)Pro2Cmd[1] << 8) & 0xFF00;
    Si446xCmd.PART_INFO.PART           |= (U16)Pro2Cmd[2] & 0x00FF;
    Si446xCmd.PART_INFO.PBUILD          = Pro2Cmd[3];
    Si446xCmd.PART_INFO.ID              = ((U16)Pro2Cmd[4] << 8) & 0xFF00;
    Si446xCmd.PART_INFO.ID             |= (U16)Pro2Cmd[5] & 0x00FF;
    Si446xCmd.PART_INFO.CUSTOMER        = Pro2Cmd[6];
    Si446xCmd.PART_INFO.ROMID           = Pro2Cmd[7];
}

void si446x_get_int_status(U8 PH_CLR_PEND, U8 MODEM_CLR_PEND, U8 CHIP_CLR_PEND)
{
    Pro2Cmd[0] = SI446X_CMD_ID_GET_INT_STATUS;
    Pro2Cmd[1] = PH_CLR_PEND;
    Pro2Cmd[2] = MODEM_CLR_PEND;
    Pro2Cmd[3] = CHIP_CLR_PEND;


    radio_comm_SendCmdGetResp( SI446X_CMD_ARG_COUNT_GET_INT_STATUS,
                              Pro2Cmd,
                              SI446X_CMD_REPLY_COUNT_GET_INT_STATUS,
                              Pro2Cmd );


    Si446xCmd.GET_INT_STATUS.INT_PEND       = Pro2Cmd[0];
    Si446xCmd.GET_INT_STATUS.INT_STATUS     = Pro2Cmd[1];
    Si446xCmd.GET_INT_STATUS.PH_PEND        = Pro2Cmd[2];
    Si446xCmd.GET_INT_STATUS.PH_STATUS      = Pro2Cmd[3];
    Si446xCmd.GET_INT_STATUS.MODEM_PEND     = Pro2Cmd[4];
    Si446xCmd.GET_INT_STATUS.MODEM_STATUS   = Pro2Cmd[5];
    Si446xCmd.GET_INT_STATUS.CHIP_PEND      = Pro2Cmd[6];
    Si446xCmd.GET_INT_STATUS.CHIP_STATUS    = Pro2Cmd[7];
}