请求指教!!SI4463 发送卡死

2019-07-20 10:55发布

fbfm.jpg    通过网口发送数据到STM32F407,板子收到数据之后再通过SI4463发送出去。图中黄 {MOD}的是si4463的GPIO 0管脚,配置的发送时为高电平,发完变低。现在问题是正常发送一段时间,突然卡死,si4463就一直处在发送状态,无法切换状态,GPIO0管脚一直为高。图中变低是我在判断状态出错后强制全部初始化SI4463,但是卡死的频率很高,有时发几百包就卡死了。发送我配置的是TX/RX FIFO共享129字节,每次发75字节。整个工程有外部中断,定时器中断,网口通过DMA中断接收数据。
int UdpTxReq()    //检测到网口发来数据调用
{
        if(state!=IDLE)
        {  
                __disable_irq();
                SI4463_Recover( );
//                SI446x_Interrupt_Status(SI4463ItStatus);
                state = IDLE;
                if_tx = 0;
                count++;
                return 0;
                __enable_irq();
        }
       
    state=TX;
       
    SI446x_Send_Packet(tx_frm.data,tx_len,0,0x80);
        return 1;
}


void SI446x_Send_Packet( uint8_t *pTxData, uint8_t Length, uint8_t Channel, uint8_t Condition )
{
    uint8_t l_Cmd[ 5 ] = { 0 };
    uint8_t tx_len = Length;

    SI446x_Reset_TxFifo( );                //清空TX FIFO

    SI_SET_CSN_LOW( );               
       
    drv_spi_read_write_byte( WRITE_TX_FIFO );        //写TX FIFO命令
       
#if PACKET_LENGTH == 0                        //动态数据长度
       
    tx_len ++;
    drv_spi_read_write_byte( Length );
       
#endif
       
    while( Length-- )   
        {
                drv_spi_read_write_byte( *pTxData++ );         //写数据到TX FIFO
        }
       
    SI_SET_CSN_HIGH( );
       
    l_Cmd[ 0 ] = START_TX;
    l_Cmd[ 1 ] = Channel;
    l_Cmd[ 2 ] = Condition;
    l_Cmd[ 3 ] = 0;
    l_Cmd[ 4 ] = tx_len;
       
    SI446x_Write_Cmds( l_Cmd, 5 );                //发送数据包
}



void SI4463_Recover( void )
{
        SI446x_Reset( );                        //SI4463复位
        SI446x_Power_Up( 26000000 );//reset 后需要Power up设备 晶振30MHz
        SI446x_Config_Init( );                //SI4463模块初始化
        SI446x_Set_Power( 0x7F );        //功率设置
        SI446x_Change_Status( 6 );        //切换到RX状态b
        while( 6 != SI446x_Get_Device_Status( ));
        SI446x_Start_Rx( 0, 0, PACKET_LENGTH,8,8,8 );
       
}


0条回答

一周热门 更多>