Hi TI,
We are working on a Product which use Dual mode feature of CC2564C (BT+BLE).
We like to set up one production line Testing system, So that we can make sure the RF part is working as expected.
From the FCC Testing guides, We are able to put the Device in Continuous TX modes for BR, EDR, and LE. That part is working Fine.
Now to make sure the RX path is also Working as expected, We like to Perform the RX mode Test.
We are following the document: CC256x-Testing-Guide-_2D00_-Texas-Instruments-Wiki.pdf
As we don't have any tester setups, we are using CC2564C itself as the TX Part(instead of PLT tester)
It is entering the TX mode using the following functions (verified with RSSI viewer. We observed activity on selected channels) :
HCI_VS_Write_BD_ADDR 0xFC06, "123456781234"
HCI_VS_DRPb_Tester_Packet_TX_RX 0xFD85, 3, 0, 0xFF, 0x1, 0x5, 0, 27, 9, 1, 0x01FF
These functions we rewrote in the Bluetopia stack as follows
void Start_Continuous_TX_RX(unsigned int RF_BTStackID){ int ret_val; Byte_t Length; Byte_t Status; Byte_t OGF; Word_t OCF; Byte_t CommandBuffer[30]; Byte_t ReturnBuffer[12]; BD_ADDR_t BD_ADDR; ASSIGN_BD_ADDR(BD_ADDR, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34); VS_Set_Bluetooth_Address(RF_BTStackID,BD_ADDR); /* Before continuing, make sure the input parameters appears to be */ /* semi-valid. */ if((RF_BTStackID)){ /* Format the HCI VS DRPB Tester Con Tx Command. */ BTPS_MemInitialize(CommandBuffer, 0, 30); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[0], 0x03); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[1], 0x00); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[2], 0xFF); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[3], 0x01); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[4], 0x03); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[5], 0x00); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[6], 0x1B); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[7], 0x00); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[8], 0x0F); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[9], 0x01); ASSIGN_HOST_WORD_TO_LITTLE_ENDIAN_UNALIGNED_WORD(&CommandBuffer[10], 0x01FF); Length = sizeof(ReturnBuffer); OGF = COMMAND_OGF(0xFD85); //#define HCI_VS_DRPb_Tester_Packet_TX_RX OCF = COMMAND_OCF(0xFD85); //#define HCI_VS_DRPb_Tester_Packet_TX_RX ret_val = HCI_Send_Raw_Command(RF_BTStackID, OGF, OCF, 12, (Byte_t *)CommandBuffer, &Status, &Length, ReturnBuffer, TRUE); } }
For the RX part we are using the Function
HCI_VS_DRPb_BER_Meter_Start 0xFD8B, 0, 0, 0x123456781234, 1, 0x1, 27, 1000, 0x1FF, 0x1
This function we rewrote in the Bluetopia stack as follows
void Start_Continuous_RX(unsigned int RF_BTStackID,Byte_t Test_Pattern, Byte_t Frequency_Channel){ int ret_val; Byte_t Length; Byte_t Status; Byte_t OGF; Word_t OCF; Byte_t CommandBuffer[30]; Byte_t ReturnBuffer[12]; /* Before continuing, make sure the input parameters appears to be */ /* semi-valid. */ //MAX_BLE_Channel = 39 if((RF_BTStackID)){ /* Format the HCI VS DRPB Tester Con Tx Command. */ BTPS_MemInitialize(CommandBuffer, 0, 30); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[0], 0x00); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[1], 0x00); ASSIGN_HOST_WORD_TO_LITTLE_ENDIAN_UNALIGNED_WORD(&CommandBuffer[2], 0x1234); ASSIGN_HOST_DWORD_TO_LITTLE_ENDIAN_UNALIGNED_DWORD(&CommandBuffer[4], 0x12345678); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[8], 0x01); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[9], 0x01); ASSIGN_HOST_WORD_TO_LITTLE_ENDIAN_UNALIGNED_WORD(&CommandBuffer[10], 27); ASSIGN_HOST_WORD_TO_LITTLE_ENDIAN_UNALIGNED_WORD(&CommandBuffer[12], 10); ASSIGN_HOST_WORD_TO_LITTLE_ENDIAN_UNALIGNED_WORD(&CommandBuffer[14], 0x1FF); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[16], 0x1); Length = sizeof(ReturnBuffer); OGF = COMMAND_OGF(0xFD8B); //#define HCI_VS_DRPb_BER_Meter_Start ((Word_t)(0xFD8B)) OCF = COMMAND_OCF(0xFD8B); //#define HCI_VS_DRPb_BER_Meter_Start ((Word_t)(0xFD8B)) ret_val = HCI_Send_Raw_Command(RF_BTStackID, OGF, OCF, 17, (Byte_t *)CommandBuffer, &Status, &Length, ReturnBuffer, TRUE); } }
Before calling this function Stack initialization is done.
To get the result of this BER test we use
HCI_VS_DRP_Read_BER_Meter_Result 0xFD13
void Get_BT_BER_Result(){
int ret_val;
Byte_t Length;
Byte_t Status;
Byte_t OGF;
Word_t OCF;
Byte_t CommandBuffer[30];
Byte_t ReturnBuffer[65];
/* Before continuing, make sure the input parameters appears to be */
/* semi-valid. */
//MAX_BLE_Channel = 39
if((RF_BTStackID)){
Start_Continuous_RX(RF_BTStackID,0,0);
osDelay(10000);
/* Format the HCI VS DRPB Tester Con Tx Command. */
BTPS_MemInitialize(CommandBuffer, 0, 30);
ReturnBuffer[63] =55;
Length = sizeof(ReturnBuffer);
OGF = COMMAND_OGF(0xFD13); //#define HCI_VS_DRPb_BER_Meter_Start ((Word_t)(0xFD8B))
OCF = COMMAND_OCF(0xFD13); //#define HCI_VS_DRPb_BER_Meter_Start ((Word_t)(0xFD8B))
ret_val = HCI_Send_Raw_Command(RF_BTStackID, OGF, OCF, 0, (Byte_t *)CommandBuffer, &Status, &Length, ReturnBuffer, TRUE);
if(ret_val == 0){
Display(("Get_BT_BER_Result\n"));
Display(("%d\n",ReturnBuffer[63]));
for(int i =0;i<Length;i++){
Display(("%d: %d\n",i,ReturnBuffer[i]));
}
}else{
Display(("Get_LE_BER_Result Failed\n"));
}
}
}
But I am getting the Result as all Zero's.
Is this the correct way of doing this BER test?
Do we have to pair the RX and TX before testing?
Does TI have any sequence of commands to perform these tests correctly?
Thanks!
Vishnuprasad V