如何量測A91x9M0 RSSI Power

SamYang2024-05-07M0核77
  • 本篇介紹使用A9139M0 RSSI功能,量測TX 端的Power RSSI值

  • 根據A9139M0 手冊說明RSSI值為9 bits[ADCO 8:0] (AGC ON)有效範圍為-115dbm~-30dbm

擷取.PNG

擷取.JPG

擷取.PNG

  • 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

擷取2.JPG

代碼:

DR2M_IFBW250K_RC_A9139M0_x0_470MHz-510MHz Band Ref. Code for FIFO mode V0.2-230905-RSSI - power input.zip

 1.設定T/RX的 頻點 ==>"RFLIB_SetCH ( 0 );//470Mhz"

 2.Turn on AGC==> "RXCTL_Reg = A9139M0_Config[INDEX_RXCTL].load[ConfigType]; //AGCE"

擷取.JPG

 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"

202405071715089160158947.jpg

 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)

image.png



代碼:

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();
		} 
		
}


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。