通过网口发送数据到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 );
}
一周热门 更多>