大家好、
这是一个长期开放的票。 如何将器件置于 RX 模式以及如何确保器件处于 RX 模式。 我们需要使用 VS 命令获得一个正确的示例或步骤 来执行该操作。
我们要实现的是处于 RX 模式的器件 A 和处于 TX 模式的器件 B。
设备 A 应该能够 打印 从设备 B 接收到的数据。
作为最低要求、 我们至少应该能够 从器件 B 获得器件 A 上收到的数据包的数量。
请帮助我们进行设置。
谢谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
大家好、
这是一个长期开放的票。 如何将器件置于 RX 模式以及如何确保器件处于 RX 模式。 我们需要使用 VS 命令获得一个正确的示例或步骤 来执行该操作。
我们要实现的是处于 RX 模式的器件 A 和处于 TX 模式的器件 B。
设备 A 应该能够 打印 从设备 B 接收到的数据。
作为最低要求、 我们至少应该能够 从器件 B 获得器件 A 上收到的数据包的数量。
请帮助我们进行设置。
谢谢!
尊敬的 Vishnuprasad:
您可以使用 TI 提供的 HCITester 工具来设置此方案。 附件提供了一些文档、说明如何设置器件以便使用 HCI 命令读取传入的数据包。 通过使用 HCITester、您可以通告两个器件并使它们彼此连接。 尝试使用生产线指南将广播设备设置为传输数据包、并将第二个设备设置为读取传入数据包。 我还随附了 有关 HCI 命令的 CC256x 文档。
e2e.ti.com/.../6560.swra751.pdf
e2e.ti.com/.../CC256x-Production-Line-Testing-Guide-_2D00_-Texas-Instruments-Wiki-_2800_1_2900_.pdf
Andy、您好!
我尝试了我们的应用程序代码中与生产线测试指南中提到的相关的命令。
由于我们无法访问产品上 BT 芯片的 HCI 端口(定制板)、因此我们将使用堆栈发送命令。
我在此附上函数。
下面附加了用于启动 BER 表的函数
void DRPb_BER_Meter_Start(){ 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. */ 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); // Frequency_Channel ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[1], 0x00); //Reserved ASSIGN_HOST_WORD_TO_LITTLE_ENDIAN_UNALIGNED_WORD(&CommandBuffer[2], 0x1234); //BD_ADDR ASSIGN_HOST_DWORD_TO_LITTLE_ENDIAN_UNALIGNED_DWORD(&CommandBuffer[4], 0x12345678); //BD_ADDR ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[8], 0x01); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[9], 0x01); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[10], 0x1B); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[11], 0x00); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[12], 0xE8); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[13], 0x03); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[14], 0xFF); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[15], 0x01); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[16], 0x01); Length = sizeof(ReturnBuffer); OGF = COMMAND_OGF(0xFD8B); //#define DRPb_BER_Meter_Start ((Word_t)(0xFD8B)) OCF = COMMAND_OCF(0xFD8B); //#define 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); } }
下面随附了 整个 BER 测试的代码(从此处调用仪表启动)。
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)){ DRPb_BER_Meter_Start(); 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_DRP_Read_BER_Meter_Result ((Word_t)(0xFD13)) OCF = COMMAND_OCF(0xFD13); //#define HCI_VS_DRP_Read_BER_Meter_Result ((Word_t)(0xFD13)) ret_val = HCI_Send_Raw_Command(RF_BTStackID, OGF, OCF, 0, (Byte_t *)CommandBuffer, &Status, &Length, ReturnBuffer, TRUE); if(ret_val == 0){ ProdDisplay(("Get_BT_BER_Result\n")); ProdDisplay(("%d\n",ReturnBuffer[63])); for(int i =0;i<Length;i++){ ProdDisplay(("%d: %d\n",i,ReturnBuffer[i])); } }else{ ProdDisplay(("Get_BT_BER_Result Failed\n")); } 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_DRP_Read_BER_Meter_Result ((Word_t)(0xFD13)) OCF = COMMAND_OCF(0xFD13); //#define HCI_VS_DRP_Read_BER_Meter_Result ((Word_t)(0xFD13)) ret_val = HCI_Send_Raw_Command(RF_BTStackID, OGF, OCF, 0, (Byte_t *)CommandBuffer, &Status, &Length, ReturnBuffer, TRUE); if(ret_val == 0){ ProdDisplay(("Get_BT_BER_Result\n")); ProdDisplay(("%d\n",ReturnBuffer[63])); for(int i =0;i<Length;i++){ ProdDisplay(("%d: %d\n",i,ReturnBuffer[i])); } }else{ ProdDisplay(("Get_LE_BER_Result Failed\n")); } 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_DRP_Read_BER_Meter_Result ((Word_t)(0xFD13)) OCF = COMMAND_OCF(0xFD13); //#define HCI_VS_DRP_Read_BER_Meter_Result ((Word_t)(0xFD13)) ret_val = HCI_Send_Raw_Command(RF_BTStackID, OGF, OCF, 0, (Byte_t *)CommandBuffer, &Status, &Length, ReturnBuffer, TRUE); if(ret_val == 0){ ProdDisplay(("Get_BT_BER_Result\n")); ProdDisplay(("%d\n",ReturnBuffer[63])); for(int i =0;i<Length;i++){ ProdDisplay(("%d: %d\n",i,ReturnBuffer[i])); } }else{ ProdDisplay(("Get_BER_Result Failed\n")); } } }
在发送器侧
void Start_Continuous_TX_RX(unsigned int RF_BTStackID,Byte_t Freq_Channel){ 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; Byte_t TXMode = 0x00; ASSIGN_BD_ADDR(BD_ADDR, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34); VS_Set_Bluetooth_Address(RF_BTStackID,BD_ADDR); if(Freq_Channel == 0xFF){ TXMode = 0x00; Freq_Channel = 0x00; }else{ TXMode = 0x03; } /* 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); //DOnt pushh 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); //Packet_Type ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[4], 0x03); ASSIGN_HOST_BYTE_TO_LITTLE_ENDIAN_UNALIGNED_BYTE(&CommandBuffer[5], 0x00); ASSIGN_HOST_WORD_TO_LITTLE_ENDIAN_UNALIGNED_WORD(&CommandBuffer[6], 0x001B); //Packet_Length 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); } }
仍然保持此状态、我得到的 BER 结果为零。
您是否可以在设置中执行测试并共享 HCI 日志? RX 侧和 TX 侧
希望 尽快解决此问题。
谢谢!
Andy、您好!
我将在这里附加发送器侧和接收器侧的 HCI 日志。
您能检查日志吗、让我知道哪里出了问题吗?
我们使用的是最新的 Buetopia v5.1.1。
e2e.ti.com/.../RECEIVER_5F00_TEST_5F00_LOGS_5F00_V1.zip
等待您的响应。
谢谢!!
您好 Vishnu:
这对我来说是第一个,但我会尽力帮助尽我所能。
CC2564C 的相应测试指南位于 https://www.ti.com/lit/an/swra749/swra749.pdf
从而获得连续 RX、请遵循第5.3节
连续 TX 为5.1
很遗憾、由于我们将发送原始 HCI 命令、记录器工具不会提供任何帮助。 唯一有用的可能是 HCI 的 UART 布线、但正如您上面所说的、您无法访问它们。 我也会出去到下周二。
此致!
罗格利奥
您好:Rogelio、
感谢您的答复。
我们能够验证的连续 TX。
问题是当我们将其置于连续 RX 模式时。 测试机构喜欢看到 BER 结果,这就是我要在这里努力实现的。
您是否可以仅检查日志并告诉我如何执行 BER 测试? 您可以使用从 HCI 测试仪工具提供的命令进行交叉验证。
(根据我从 CC2564C 架构中的理解、 即使您是通过 HCI 测试仪发出命令也是如此。 它将 使用 BT-logger 工具在 BT_DBG 引脚中提供调试日志)
除此之外、请咨询您的设置、了解 BER 测试是否适合您。 只是为了阐明生产线测试文档中提到的步骤是正确的。
谢谢!
尊敬的 Vishnu:
我已经能够使用最新的服务包运行 BER 测试。
以下是用于运行测试的脚本。 您将需要使用堆栈来实现它。
首先设置 TX。
# Set BD address BD_ADDR="123456781234" Send_HCI_VS_Write_BD_ADDR 0xFC06, BD_ADDR Wait_HCI_Command_Complete_VS_Write_BD_ADDR_Event 5000, any, HCI_VS_Write_BD_ADDR, 0x00 Send_HCI_Write_Scan_Enable 0x00 sleep 1000 Send_HCI_VS_DRPb_Enable_RF_Calibration 0xFD80, 0x01, 0x00000000, 0x01 Wait_HCI_Command_Complete_VS_DRPb_Enable_RF_Calibration_Event 5000, any, HCI_VS_DRPb_Enable_RF_Calibration, 0x00 Sleep 1000 # Sent Tx Packets Send_HCI_VS_DRPb_Tester_Packet_TX_RX 0xFDCC, 0x00, 0, 0, 0x5, 0x5, 0, 339, 7, 1, 0x01FF
然后设置 RX
$l10 count = 0 #DH5 Send_HCI_VS_DRPb_BER_Meter_Start 0xFD8B, 0, 0, 0x341278563412, 1, 0x5, 339, 500, 0x1FF, 0x1 Wait_HCI_Command_Complete_VS_DRPb_BER_Meter_Start_Event 5000, any, HCI_VS_DRPb_BER_Meter_Start, 0x00 # $l11 Sleep 100 count++ Send_HCI_VS_DRP_Read_BER_Meter_Status 0xFD5B Wait_HCI_Command_Complete_VS_DRP_Read_BER_Meter_Status_Event 5000, any, HCI_VS_DRP_Read_BER_Meter_Status, 0x00, &synched, &finished, any, &total_bits, &bit_errors, &packets if finished== 0 then if synched == 0 then log"not synced yet %d count",count #Fail "no SYNC" else log"not finished yet %d packets, count %d",packets,count endif goto $l11 else BER = 1000000*bit_errors/total_bits log"BER is %d e-6 (%d bits out of %d)",1000000*bit_errors/total_bits,bit_errors,total_bits if BER > 100 then Fail "BER is too high" else pause "Finished" endif endif #pause"" goto $l10
需要注意的是、请确保两个器件上的 BD 地址相同。 确保 ACL 数据包类型和数据包长度相同。
我期待您的跟进。
此致、
罗格利奥
尊敬的 RogelioD:
我现在能够在 BT 上运行 RX 测试。
I 所使用的命令是 HCI_VS_CL200_ISTR, Pb_Tester_Packet_ 带有操作码 0xFD85 而不是 0xFDCC。
请确认这是相同的、我们使用的服务包是 c256xc_bt_spv1.5。
另外、我在 RX 端附加了日志、以便进行验证。
e2e.ti.com/.../BER-Test_5F00_Bluarmor.zip
非常感谢大家的支持、这在过去的2到3年里一直是挂起的。
我希望您在此平台上提供更多支持。
现在、主要待处理的是 BLE 端的 RX 测试。
希望问题也能很快得到解决。
谢谢!
尊敬的 Vishnu:
Im 很高兴我们能够取得进展来解决这个问题,然而,看看你的日志,它似乎没有工作,它应该. 例如、您上次拨打 Read_BER_BER_759 Meter_Status 号线、但在呼叫之后的15分钟内、您仍能获得结果。
进行了比较。
这可能是由于我使用 HCI 测试仪与您使用 bluetootopia 堆栈发送这些 HCI 命令所造成的差异。
睡眠1000实际上只是1000ms 的延迟。
我仔细检查了一下、实际上使用了0xFDCC 操作码(这是用于 Wilink 器件的操作码、 但 cc2564c 和 Wilink 在 FW 中共享一些 HCI 命令、因此在此处起作用是合理的)我会使用 FD85、因为它们是具有相同参数的相同命令。
关于 Reciever_Test RX 测试、我假设您的意思是 HCI_LE_BLE 0x201d
结果没有 VS HCI 命令、因为此测试属于 BT Core 规范的一部分。
第 F 部分:2
e2e.ti.com/.../Core_5F00_v5.1.pdf
此致、
罗格利奥
您好@RogelioD:
感谢您查看 RX 测试结果。
HCI_VS_DRP_READ_BER_HCI_EVM Meter_Status 只需要调用一次该命令、还是以1秒的间隙循环调用该命令?
以下是我用于读取结果的函数。 它将形成一个循环20次。
void Get_BT_BER_Result(Byte_t Freq_Channel){ 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)){ DRPb_BER_Meter_Start(Freq_Channel); for(int i =0 ;i<20; i++){ 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(0xFE2A); OCF = COMMAND_OCF(0xFE2A); ret_val = HCI_Send_Raw_Command(RF_BTStackID, OGF, OCF, 0, (Byte_t *)CommandBuffer, &Status, &Length, ReturnBuffer, TRUE); if(ret_val == 0){ ProdDisplay(("Get_BT_BER_Result\n")); ProdDisplay(("%d\n",ReturnBuffer[63])); for(int i =0;i<Length;i++){ ProdDisplay(("%d: %d\n",i,ReturnBuffer[i])); } }else{ ProdDisplay(("Get_LE_BER_Result Failed\n")); } } } }
我将使用1秒轮询来更新结果。
您能否介绍执行 BLE RX 测试的过程您能否为我提供分别在 RX 和 TX 上执行的命令序列?
谢谢!
尊敬的 RogelioD:
至于您的疑虑、
" Im 很高兴我们能够继续解决这个问题、然而、从您的日志来看、它似乎没有正常工作。 例如、您上次呼叫 Read_BER_BER_759 Meter_Status 号线、但即使在呼叫15分钟后、您仍能获得结果。"
如果另一端继续 TX 传输、就会发生这种情况。
通过我对您的日志的分析、得出的结果如下所示、
在您的测试设置中、RX 最初已进入测试模式。
36832 21:55:03.262 +0:15:58.772 0x000EB746 0x000E852D HCI_VS_DRPb_BER_HCI--> Meter_Start
一段时间后、只有 TX 被启动。
接收到的第一个 TX 发生在
44750 21:57:50.982 +0:18:46.492 BER 结果:总位数1356000、总位数错误79307
大约需要 2到3分钟。
请确认这不是问题。
谢谢!
尊敬的 RogelioD:
您可以在设置 DK 或其他工具中运行测试、并向我提供 BT 的日志吗?
如上所述、这将有助于引脚不会暴露在外、但无论需要发送什么命令、我们都可以实施、因为这4线 HCI UART 连接到我们从现在开始运行测试的另一个 ST uC。
请提供操作码和操作数、只需共享 HCILOGS (表单 BT_DEBUG 引脚)、其余的我应该能够在此处管理。
请在设置中运行 BLE RX_Test 并共享日志、我将从日志中确定命令。
谢谢!
尊敬的 Vishnu:
我已经在蓝牙测试仪上运行测试、并为您获取日志。
连接到下面
第一 组命令是测试仪验证与器件的连接。
下一个正在运行测试。 我跑了两次。
此致、
罗格利奥
尊敬的 Vishnu:
抱歉、我在运行测试时跳过了一个步骤、因为我想向您展示测试程序发送的命令。 您的确需要启用 BLE 并设置测试模式、否则将不允许使用该命令。 我在下面提供了新日志。
e2e.ti.com/.../0654.BLE-TEST.lgr
此致!
罗格利奥