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); }
浙公网安备 33010602011771号