您好!
我正在尝试在 CC1311上实现旧的专有无线电协议。 该数据包采用 曼彻斯特编码(前导码+ syncword +有效负载+ CRC)、具有可变长度和 CRC。 我发现 这篇文章 解释了如何在像 CC1311这样的最新芯片上实现这种协议。
这个解决方案几乎是完美的、但是 CRC 不能 被自动检查。
我想知道是否可以自动检查 CRC。
提前感谢。
Alexandre Humbert
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.
您好!
我正在尝试在 CC1311上实现旧的专有无线电协议。 该数据包采用 曼彻斯特编码(前导码+ syncword +有效负载+ CRC)、具有可变长度和 CRC。 我发现 这篇文章 解释了如何在像 CC1311这样的最新芯片上实现这种协议。
这个解决方案几乎是完美的、但是 CRC 不能 被自动检查。
我想知道是否可以自动检查 CRC。
提前感谢。
Alexandre Humbert
感谢您的回答。
以下是一些附加信息:
我们正在尝试实现 RX 和 TX。
有效载荷的最大长度为255字节。
完整数据包的示例:
编码前:
00 00 00 00 00 00 (5字节) 前导码
CC CC CC CC CC CC CC CC CC (4字节) Syncword
09. (1字节) 数据包长度
00 12 34 12 34 20 00 00 00 (9字节) 有效载荷
2C 35. (2字节) CRC (MSB 优先、POL 0x1021、SEED 0x00)
全帧:00 00 00 00 CC CC CC CC CC 09 00 12 34 12 34 20 00 00 2C 35
曼彻斯特:0=>10和1=>01
编码后:
AA AA AA AA AA AA AA AA AA AA AA AA AA 5A 5A 5A 5A 5A 5A 5A 5A 5A AA 69 A9 A6 9A A9 A5 9A A5 9A A6 9A A6 AA AA AA AA AA AA AA AA AA AA AA AA A6 5A A5 99
位:
10101010 10101010 10101010 10101010 10101010 101010101010 10101010 10101010 10101010 10101010 10101010 10101010 01011010 01011010 01011010 01011010 01011010 01011010 01011010 01011010 01011010 01011010 01011010 01011010 01011010 01011010 10101010 01101001 10101001 10100110 10100101 10011010 101001 10100110 10100101 10011010 10100110 10110110 10101010 10101010 10101010 10101010 10101010 10101010 10101010 101010101010 101010101010 10101010 10101010 10101010 10100110 01011010 10100101 10011001
我们的目标是仅使用射频内核。
亚历山大
你(们)好
我已经能够查看其中的 TX 部分、但没有查看 CRC 详细信息。
这意味着我能够发送以下内容:
长度 | 有效载荷 | CRC | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
09. | 00 | 12. | 34 | 12. | 34 | 20. | 00 | 00 | 00 | 80 | 0a | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | ||||||||||||||||||
AA | AA | AA | AA | AA | AA | AA | AA | AA | AA | 5A | 5A | 5A | 5A | 5A | 5A | 5A | 5A | AA | 69 | AA | AA | A9 | A6 | 问题5. | 9A | A9 | A6 | 问题5. | 9A | A6 | AA | AA | AA | AA | AA | AA | AA | 6A | AA | AA | 66 |
从上面可以看到、我一直在使用 CC13xx 的默认 CRC、而我的重点仅在于使 曼彻斯特器件正确(请参阅 数据包格式—SimpleLink CC13XX/CC26XX SDK 专有射频用户指南5.20.00文档 、了解如何更改 CRC)
我使用了 rfPacketTX 示例作为起点、但使用了高级 TX 命令、而不是标准的 TX 命令。
我的 TX 代码如下:
static uint8_t packet[PAYLOAD_LENGTH + 2 + 1] = {0xCC, 0xCC, // Header (included to get the last part of the manchester encoded sync word 0x9, // Length 0x00, 0x12, 0x34, 0x12, 0x34, 0x20, 0x00, 0x00, 0x00}; // Payload /***** Function definitions *****/ void *mainThread(void *arg0) { RF_Params rfParams; RF_Params_init(&rfParams); GPIO_setConfig(CONFIG_GPIO_GLED, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW); GPIO_write(CONFIG_GPIO_GLED, CONFIG_GPIO_LED_OFF); GPIO_setMux(CONFIG_GPIO_GLED, IOC_PORT_RFC_GPO0); RF_cmdPropTxAdv.pktLen = PAYLOAD_LENGTH + 2 + 1; // Header (0xCCCC + length) RF_cmdPropTxAdv.pPkt = packet; RF_cmdPropTxAdv.startTrigger.triggerType = TRIG_NOW; RF_cmdPropTxAdv.pktConf.bUseCrc = 0x1; // Preamble RF_cmdPropRadioDivSetup.preamConf.nPreamBytes = 10; // 10 bytes RF_cmdPropRadioDivSetup.preamConf.preamMode = 1; // 0xAA // Sync RF_cmdPropTxAdv.syncWord = 0x5A5A5A5A; // First part of sync word (manually manchester encoded) // 2 bytes Header containing 0xCCCC RF_cmdPropTxAdv.numHdrBits = 16; RF_cmdPropTxAdv.pktConf.bCrcIncHdr = 0; /* Request access to the radio */ rfHandle = RF_open(&rfObject, &RF_prop, (RF_RadioSetup*)&RF_cmdPropRadioDivSetup, &rfParams); RF_cmdPropRadioDivSetup.formatConf.fecMode = 0xA; /* Set the frequency */ RF_postCmd(rfHandle, (RF_Op*)&RF_cmdFs, RF_PriorityNormal, NULL, 0); while(1) { /* Send packet */ RF_EventMask terminationReason = RF_runCmd(rfHandle, (RF_Op*)&RF_cmdPropTxAdv, RF_PriorityNormal, NULL, 0); /* Power down the radio */ RF_yield(rfHandle); /* Sleep for PACKET_INTERVAL us */ usleep(PACKET_INTERVAL); } }
我已经核实 ,空运的内容符合上表。
我没有看过 RX 端、因为我不知道这在射频方面能否很好地工作。
由于 CC13xx 不对同步字进行曼彻斯特编码/解码、因此接收器需要查找0xA5A5A5A5作为同步字。
由于您正在无线发送0x5A5A5A5A5A5A5A5A、之前为10 x 0xAA、因此您将看到对讲机有时会在正确的位置找到 SYNC、有时会进行位移。 不确定您是否能够以任何方式解决此问题。
BR
Siri