CH5XX/CH59X RF_PHY使用

前言:

本文对PF_PHY的例程的使用做一些简要的说明。

一、配对通信

1、保证接入地址accessAddress一致(preamble后跟的同步字,用于识别一个新包到来,收发设置成一样是是收到包的前提)

2、通信频点例程中配置的Channel 39,这里不做调频通信,收发在一个频点即可。Channel范围为0-39,对应2.402-2.480GHz,共40个频段。

3、工作模式有两种LLE_MODE_BASIC和LLE_MODE_AUTO;其中LLE_MODE_BASIC 是基本的收发,而LLE_MODE_AUTO 是带自动回复(回复内容是固定的)。具体选择根据需要来选择模式。

4、配置收发模式在一个例程即可;初始化时选择RF_TX或者RF_RX。下面会提到如何做状态切换。

void RF_Init(void)
{
    uint8_t    state;
    rfConfig_t rf_Config;

    tmos_memset(&rf_Config, 0, sizeof(rfConfig_t));
    taskID = TMOS_ProcessEventRegister(RF_ProcessEvent);
    rf_Config.accessAddress = 0x71764129; // 禁止使用0x55555555以及0xAAAAAAAA ( 建议不超过24次位反转,且不超过连续的6个0或1 )
    rf_Config.CRCInit = 0x555555;
    rf_Config.Channel = 39;
    rf_Config.Frequency = 2480000;
#if(RF_AUTO_MODE_EXAM)
    rf_Config.LLEMode = LLE_MODE_AUTO;
#else
    rf_Config.LLEMode = LLE_MODE_BASIC | LLE_MODE_EX_CHANNEL; // 使能 LLE_MODE_EX_CHANNEL 表示 选择 rf_Config.Frequency 作为通信频点
#endif
    rf_Config.rfStatusCB = RF_2G4StatusCallBack;
    rf_Config.RxMaxlen = 251;
    state = RF_Config(&rf_Config);
    PRINT("rf 2.4g init: %x\n", state);
//    { // RX mode
//#if(RF_AUTO_MODE_EXAM)
//        rx_end_flag = FALSE;
//#endif
//        state = RF_Rx(TX_DATA, 10, 0xFF, 0xFF);
//        PRINT("RX mode.state = %x\n", state);
//    }

    { // TX mode
        tmos_set_event( taskID , SBP_RF_PERIODIC_EVT );
    }
}

 二:状态回调

1、如果在接收模式下切换为发送模式在RX_MODE_RX_DATA调用RF_SHUT再调用RF_TX即可

2、如果在发送模式下切换为接收模式在TX_MODE_TX_FINISH调用RF_SHUT再调用RF_RX即可

3、RF_SHUT不建议在状态回调里直接调用,可以创建一个tmos任务在对应的case中调用

//这里的回调函数是在state = RF_Config( &rfConfig ); 注册的
//对于ch59x,ch32x208 系列,该回掉为LLE中断回掉, 对于ch58x,ch57x 系列芯片,该回掉为tmos回掉
void RF_2G4StatusCallBack( uint8 sta, uint8 crc, uint8 *rxBuf ) {
    switch( sta ) {
        case TX_MODE_TX_FINISH://发送完成,LLE_MODE_BASIC,LLE_MODE_AUTO模式都会产生
            break;
        case TX_MODE_TX_FAIL:  //发送失败,LLE_MODE_BASIC,LLE_MODE_AUTO模式都会产生
            break;
        case TX_MODE_RX_DATA:  //LLE_MODE_AUTO模式下,发送完数据后,接收到了ack信号
            if( !crc ) {
                uint8 i;
                //rxBuf[0] 默认情况下是rssi,如果 在LLEMode初始化时同时开启了LLE_MODE_NON_RSSI,那这里将会变为PKT_TYPE
                PRINT("rx recv, rssi: %d\n",(s8)rxBuf[0]);
 
                //我们还可以通过下面方式获取RSSI,这个不受LLE_MODE_NON_RSSI配置影响(CH573,CH583):
                PRINT("rssi:%d\r\n",(int8_t)rxBuf[2+((rxBuf[1]+5)&0xffc)]);
 
                //我们还可以通过下面方式获取RSSI,这个不受LLE_MODE_NON_RSSI配置影响(CH592,CH584,CH572):
                PRINT("rssi:%d\r\n",(int8_t)rxBuf[rxBuf[1]+4]);
                //数据部分
                PRINT("length: %d:",rxBuf[1]);
                for(i=0; i<rxBuf[1]; i++) {
                    PRINT("%02x ",rxBuf[i+2]);
                }
                PRINT("\n");
                break;
            }
            if( crc & 0x01 ) {
                 PRINT("crc error\n");
            }
            if( crc & 0x02 )
                PRINT("match type error\n");
            }
            break;
        case TX_MODE_RX_TIMEOUT: //LLE_MODE_AUTO模式下,发送完数据后,没有接收到ack信号,默认超时是 3 ms
            break;
        case RX_MODE_RX_DATA:    //接收到数据,LLE_MODE_BASIC,LLE_MODE_AUTO模式都会产生
            if( !crc ) {
                uint8 i;
                //rxBuf[0] 默认情况下是rssi,如果 在LLEMode初始化时同时开启了LLE_MODE_NON_RSSI,那这里将会变为PKT_TYPE
                PRINT("rx recv, rssi: %d\n",(s8)rxBuf[0]);
                //用户可以通过RX buf后的packet info 进行获取更多的包信息
                //数据部分
                PRINT("length: %d:",rxBuf[1]);
                for(i=0; i<rxBuf[1]; i++) {
                    PRINT("%02x ",rxBuf[i+2]);
                }
                PRINT("\n");
                break;
            }
            if( crc & 0x01 ) {
                 PRINT("crc error\n");
            }
            if( crc & 0x02 )
                PRINT("match type error\n");
            }
            break;
        case RX_MODE_TX_FINISH:  //LLE_MODE_AUTO模式下,接收到数据后,自动ack完成
            break;
        case RX_MODE_TX_FAIL:    //LLE_MODE_AUTO模式下,接收到数据后,ack失败,仅仅只是发送失败
            break;
    }
    PRINT("STA: %x\n",sta);
}

 

posted @ 2025-05-05 22:20  小舟从此逝_1  阅读(216)  评论(0)    收藏  举报