如何量測A91x9M0 RSSI Power
本篇介紹使用A9139M0 RSSI功能,量測TX 端的Power RSSI值
根據A9139M0 手冊說明RSSI值為9 bits[ADCO 8:0] (AGC ON)有效範圍為-115dbm~-30dbm
A9139M0的RSSI檢測分成2種,1種是檢測同是Amiccom協議的對端Tx power的強度(Auto RSSI measurement for RF power input to transceiver),另一種則為檢測環境中相同頻率載波的強度(Auto RSSI measurement for noise power)
底下介紹第1種量測對端的TX power
代碼:
1.設定T/RX的 頻點 ==>"RFLIB_SetCH ( 0 );//470Mhz"
2.Turn on AGC==> "RXCTL_Reg = A9139M0_Config[INDEX_RXCTL].load[ConfigType]; //AGCE"
3.設定ADC_REG如下螢光筆,打開相關RSSI設定==>"ADC_Reg = ( ( ADC_Reg & ~0x000318 ) | BIT3 | BIT4 | MVSEL_AVERAGE_8 ); //b3:RADC=1, b4:ARSSI=1, MVSEL(RADC=1),ADC average is set by MVSEL"
4.進入RX
5.當RX收到'ID Code'時讀取ADCO[8:0]數值==>"adco_tmp = RADIO->ADC_THRESHOLD_READ_Item.ADCO; //read RSSI value(wanted signal RSSI) ADCO[8:0] when AGC on"
Slave端呼叫"RSSI_measurement_for_power_input"函數,當RX succeed,讀取當下RSSI值
void RSSI_measurement_for_power_input ( void ) { Uint32 volatile adc_tmp; Uint32 volatile adco_tmp; RFLIB_StrobeCmd ( CMD_STBY ); RXCTL_Reg = A9139M0_Config[INDEX_RXCTL].load[ConfigType]; //AGC Enable RXCTL_Reg = (RXCTL_Reg|0x00010000); RADIO->RXCTL = RXCTL_Reg; RF_SetBBIO ( FSYNC_GPIO1, ARCWTR_GPIO2, RCK_CKO, ENABLE ); ADC_Reg = ( ( ADC_Reg & ~0x000318 ) | BIT3 | BIT4 | MVSEL_AVERAGE_8 ); //b3:RADC=1, b4:ARSSI=1, MVSEL(RADC=1),ADC average is set by MVSEL //The ADC clock is :PF8M/1.6, ADC clock periods is 1/ADC clock //Each RSSI measurning time is 30 * ADC clock periods * 8(MVSEL_AVERAGE_8) + (1/PF8M)*8*5 //IF data rate=9.6Kbps,PF8M=6.14M. Data rate=250Kbps,PF8M=8M. Else PF8M=6.4M. //ex:Fxtal=12.8MHz,data rate=100Kbps,PF8M=6.4M, the ADC clock is :6.4M/1.6=4MHz //Each RSSI measurning time is 30 * (1/4M) * 8 + (1/6.4M) * 8 * 5 = 66.25us RADIO->ADC = ADC_Reg; NVIC_EnableIRQ( RADIO_IRQn ); //Enable RF Interrupt INTIE_Reg |= RADIO_INT_CLEAR | ENABLE_RFINT_WTR; //Enable WTR RADIO->RFINT_WRITE = INTIE_Reg; RFLIB_StrobeCmd ( CMD_RX );//Enter RX RF_Flag = 0; while (RF_Flag==0 ); //Stay in RX mode until receiving ID code(sync ok) adco_tmp = RADIO->ADC_THRESHOLD_READ_Item.ADCO; //read RSSI value(wanted signal RSSI) ADCO[8:0] when AGC on RSSIValue=adco_tmp; }
第2種:檢測環境中相同頻率載波的RSSI強度(noise power)
代碼:
RC_A9139M0_x0_470MHz-510MHz Band Ref. Code for Direct mode V0.2-230828-RSSI.zip
void RSSI_measurement ( void ) { Uint32 volatile adc_tmp; Uint32 volatile adco_tmp; RFLIB_StrobeCmd ( CMD_STBY ); RADIO->RXCTL=0x0A010000; RF_SetBBIO ( FSYNC_GPIO1, ARCWTR_GPIO2, RCK_CKO, ENABLE ); MODEC2_Reg = A9139M0_Config[INDEX_MODEC2].load[ConfigType]; //direct MODEC2_Reg = (MODEC2_Reg&0xFFFFFFFD); RADIO->MODECTRL2 = MODEC2_Reg; ADC_Reg = ( ( ADC_Reg & ~0x000318 ) | BIT3 | BIT4 | MVSEL_AVERAGE_8 ); //b3:RADC=1, b4:ARSSI=1, MVSEL(RADC=1),ADC average is set by MVSEL //The ADC clock is :PF8M/1.6, ADC clock periods is 1/ADC clock //Each RSSI measurning time is 30 * ADC clock periods * 8(MVSEL_AVERAGE_8) + (1/PF8M)*8*5 //IF data rate=9.6Kbps,PF8M=6.14M. Data rate=250Kbps,PF8M=8M. Else PF8M=6.4M. //ex:Fxtal=12.8MHz,data rate=100Kbps,PF8M=6.4M, the ADC clock is :6.4M/1.6=4MHz //Each RSSI measurning time is 30 * (1/4M) * 8 + (1/6.4M) * 8 * 5 = 66.25us RADIO->ADC = ADC_Reg; NVIC_EnableIRQ ( RADIO_IRQn ); INTIE_Reg |= RADIO_INT_CLEAR | ENABLE_RFINT_FSYNC; RADIO->RFINT_WRITE = INTIE_Reg; RFLIB_StrobeCmd ( CMD_RX ); RF_Flag = 0; while (1) //Stay in RX mode until receiving ID code(sync ok) { adco_tmp = RADIO->ADC_THRESHOLD_READ_Item.ADCO; //read RSSI value(environment RSSI) ADCO[8:0] when AGC on RSSIValue=adco_tmp; __nop(); } }