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.

[参考译文] CC1101:使用 ASK/OOK 时接收随机/奇怪的数据

Guru**** 2560430 points
Other Parts Discussed in Thread: CC1101

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/752006/cc1101-receiving-random-weird-data-when-using-ask-ook

器件型号:CC1101

大家好。

现在、我正在使用几个带天线的 TI CC1101收发器板。 首先、我将它们与现有 Arduino 库结合使用、其中它们运行良好、但该库不支持 OOK、我还想使用在 Python 中编程的新 CircuitPython 微控制器。 现在、我正在为这些项目开发 Python 库、我在接收 OOK 数据时遇到问题(发送正常)。

在 RTL-SDR 的帮助下、我记录并分析了遥控器(控制某些电源插座)的信号、结果显示在433.92MHz 上为 OOK。 发送手动提取的代码对于我当前的寄存器配置来说可以正常工作、电源插座的行为就像信号来自其实际遥控器一样。 但接收是一个不同的故事。

当我甚至不发送任何内容时、我会从 CC1101接收大量数据。 此外、RTL-SDR 清楚地告诉我、我附近没有人在传输数据。 当我使用原始遥控器实际发送数据时、天线的输出会发生变化、并且大部分为零(与我一直接收到的0xFF 相反)、但它甚至不一致、因此我肯定无法解码来自该数据的实际信号。

虽然我目前无法访问 Windows 计算机、但我将尝试让某人使用 RF-Studio 找到正确的寄存器值、但您也可以在下面 的代码 GitHub 中检查它们是否有些正确

这些信号都以16个"1"开头、因此我想可以将其设置为前导码、但我不能完全确定要如何更改哪些寄存器、因为目前我的设置是(理论上)"没有同步字"。

此外、我不使用 GDO0或 GDO2、我不确定是否绝对需要它。

是一个现有 C++库使用的代码、我认为我的代码基本上是相同的、所以可能是错误的寄存器配置?

提前感谢您!
Dave

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:
    最好的方法是在 SmartRF Studio 上配置 CC1101以接收预期的数据包(从远程设备)、然后使用 Register Export 功能在软件中移植寄存器设置。 确保对讲机参数(数据速率、带宽等)与您从 SDR 捕获中分析的内容一致。

    建议使用1和0的交替字符串作为前导码以及同步字(具有良好的自动相关性)、以便不接收不相关的数据包(这是您目前观察到的内容)。

    这有助于解调器更好地区分噪声和预期数据包(请参阅 www.ti.com/.../cc1101.pdf 中的第15.2节及以后的部分)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、FI、
    感谢您的建议、我将尝试让 SmartRF Studio 以某种方式运行。 我希望接收的代码从16个1开始(16个~80%的"填充"脉冲)和4个零开始。

    我将附上屏幕截图、以便您可以看到我的意思。

    我如何让接收器寻找它? 这是 SmartRF Studio 中的设置吗?

    此外、前导码和同步字之间是否存在差异?  

    我已经阅读了好几个小时的数据表、但不知道如何使接收工作正常。 )

    谢谢、
    Dave

    编辑: 我有一个正在运行的虚拟机。 SmartRF Studio 为我提供的值(我选择了 CC1101离线模式)不再允许我成功传输、我也不知道如何"导出"它们。 在"Register Export"窗口中、我创建了一个新的模板、然后选择了所有寄存器、但在这样做之后没有发生任何情况、我在窗口右侧看到一个空白文件(称为"Registers")。

    什么对 TX 有效(请参阅之前的 GitHub 链接):

    IOCFG2、0x2E
    IOCFG1、0x2E
    IOCFG0、0x06
    FIFOTHR、0x47
    PKTLEN、0x23
    PKTCTRL1、0x04
    PKTCTRL0、0x00
    SYNC1、0x55
    SYNC0、0x55
    CHANNR、0x00
    FSCTRL1、0x06
    FSCTRL0、0x00
    MDMCFG4、0xE8
    MDMCFG3、0x1A
    MDMCFG2、0x30
    MDMCFG1、0x22
    MDMCFG0、0xf8
    DEVIATN、0x15
    MCSM2、0x07
    MCSM1、0x20
    MCSM0、0x18
    FOCCFG、0x16
    BSCFG、0x6C
    AGCCTRL2、0x03
    AGCCTRL1、0x00
    AGCCTRL0、0x91
    WOREVT1、0x87
    WOREVT0、0x6B
    WORCTRL、0xFB
    FREND1、0x56
    FREND0、0x11
    FSCAL3、0xE9
    FSCAL2、0x2A
    FSCAL1、0x00
    FSCAL0、0x1F
    RCCTRL1、0x41
    RCCTRL0、0x00
    FSTEST、0x59
    Ptest、0x7F
    AGCTEST、0x3F
    test2、0x81
    test1、0x35
    TEST0、0x0B

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Dave、
    我将在我们的发送器中仿真您的数据包、并设置 CC1101以接收和发送设置。
    您将在 www.ti.com/.../swru194b.pdf 上找到有关如何导出寄存器并将其集成到您的软件中的详细信息
    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    一些额外信息:

    我现在更改了采样频率、使信号看起来像以前一样、同时使用3位"代码"表示0或1信号。

    我不确定原因、但我始终必须使用反相代码("001"表示高电平低电平信号= 1、"011"表示高电平低电平信号= 0)。 使用这些设置(结尾为零填充)、这是发出的数据:

    24 92 49 24 92 49 6d B2 49 64 96 49 6c

    因此、我可以使用2 49 6作为同步字、对吧?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    以下是图和设置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上是否可以使用同步字而不使用前导码?
    我找到了此帖子: e2e.ti.com/.../15893
    根据它,激活同步字时会自动使用前导码,它固定为0101010...
    在我的情况下,这将不会/不起作用,因为我不会在 CC1101之间进行通信,而是与不发送/期望这样的前导码的现有系统进行通信。
    如果我发送同步字设置为前2个数据字节的信号(并从实际有效载荷数据中删除这些数据字节),接收器将不能识别它,因为它不喜欢附加在同步字之前的前导码。
    同时,我没有发送任何前导码的现有发件人,在没有正在进行的传输(当然也没有传输,包括任何前导码和同步字)时,我仍在接收垃圾。
    如果无法使用集成同步字功能,如何过滤接收到的信号?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。 因此、我只需在"RF Parameters"中设置参数并从"register view"中获取寄存器是否正确?
    同步字和前导码之间有什么区别?
    我的波特率可能是错误的? 我对其进行设置、使信号(在传输时)看起来就像我尝试复制的信号。
    为此、我每1或0使用一个字节。 如下所示:

    DEF 准备(字符串):
    一个= 0b00000011
    零= 0b00111111
    返回列表(map (lambda x:0 if x='0' else one、list (string))
    
    ) send (prepare ("11111111111111111111000010100111001000")) 

    您是否建议每1/0使用3位并相应地调整波特率? 这肯定会使查找良好的16位同步字变得更加容易、因为在我的案例中、这意味着我只能使用16位同步检测任何2个"位"。

    这就是我检查接收到的数据是否可用的方法(在这种情况下、我尝试从 FIFO 中获取数据等):

    RX_Bytes_val = self._readSingleByte (self.RXBYTES)
    
    #if RX_Bytes_val 有一些东西、并且如果
    (RX_Bytes_val & 0x7F 而不是(RX_Bytes_val & 0x80)):
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在433MHz 频带上工作的远程控制通常使用 OOK、而不像 CC1101所使用的那样使用前导码/ SYNC。 在这种情况下,我建议使用异步模式并使用 MCU 来解码数据流。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,所以我无法将前导码设置为我的现有系统使用的精确同步,对吧?
    在异步模式下、正确的是我基本上绕过所有 FIFO 等、并且我选择的引脚(GDO2/GDO1/GDO0)被拉高还是拉低?
    是否可以通过 SPI 读取相应寄存器的值、或者速度太慢、我应该在 while 循环中简单地执行 digitalRead?
    我通常还会遇到另一个问题,那就是自动增益控制。 噪声始终被识别为信号;如何更改该值、以便有一个阈值? (特别是对于我现在可能需要使用的异步设置)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据 Adafruit 的不和,我的主板太慢,无法获取433MHz 快速数据(或过采样速度更快):/

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您如何"同步"接收器? 我的意思是让它知道从哪里开始捕获(0110110.... 或110110110.... 或10110110110110...)?
    因为根据这种情况、数据包内容的十六进制值将发生变化...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这可能对您有所帮助。 我现在将模式设置为"15/16同步字"、它也用10101010激活前导码。 我的意思是,我想模拟的信号也有这样的前导码,但更像110110110110 (就像你说的)...... 我是否可以用似乎不可更改的序言来模拟我的序言?
    因为这样我就可以将整个设备切换为"RX 模式"、它将接收/接受原始遥控器的信号。

    问题是,如果我在接收器中激活“前导码”,那么不管我做什么,它都不会检测到原始的远程,因为它不会发送精确的前导码或任何同步字....

    您已经拥有原始信号的图像、因此您会推荐什么? 我也无法读取兆赫兹范围内速度的引脚,因此不能选择异步模式