如何量測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();
}
}