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:CC1101

Guru**** 2381990 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/1322314/cc1101-cc1101

器件型号:CC1101
主题中讨论的其他器件: 测试2

团队、您好!

我正在处理一个项目、其中我使用了 CC1101芯片进行射频通信。 我面临一个问题、可以发送数据、但无法在另一个 CC1101芯片上接收数据。 我正在共享我的寄存器配置以及发送和接收寄存器功能以供参考。

  • 寄存器配置

/CC1101 CONFIG REGSITER
#define CC1101_IOCFG2       0x00        // GDO2 output pin configuration
#define CC1101_IOCFG1       0x01        // GDO1 output pin configuration
#define CC1101_IOCFG0       0x02        // GDO0 output pin configuration
#define CC1101_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds
#define CC1101_SYNC1        0x04        // Sync word, high INT8U
#define CC1101_SYNC0        0x05        // Sync word, low INT8U
#define CC1101_PKTLEN       0x06        // Packet length
#define CC1101_PKTCTRL1     0x07        // Packet automation control
#define CC1101_PKTCTRL0     0x08        // Packet automation control
#define CC1101_ADDR         0x09        // Device address
#define CC1101_CHANNR       0x0A        // Channel number
#define CC1101_FSCTRL1      0x0B        // Frequency synthesizer control
#define CC1101_FSCTRL0      0x0C        // Frequency synthesizer control
#define CC1101_FREQ2        0x0D        // Frequency control word, high INT8U
#define CC1101_FREQ1        0x0E        // Frequency control word, middle INT8U
#define CC1101_FREQ0        0x0F        // Frequency control word, low INT8U
#define CC1101_MDMCFG4      0x10        // Modem configuration
#define CC1101_MDMCFG3      0x11        // Modem configuration
#define CC1101_MDMCFG2      0x12        // Modem configuration
#define CC1101_MDMCFG1      0x13        // Modem configuration
#define CC1101_MDMCFG0      0x14        // Modem configuration
#define CC1101_DEVIATN      0x15        // Modem deviation setting
#define CC1101_MCSM2        0x16        // Main Radio Control State Machine configuration
#define CC1101_MCSM1        0x17        // Main Radio Control State Machine configuration
#define CC1101_MCSM0        0x18        // Main Radio Control State Machine configuration
#define CC1101_FOCCFG       0x19        // Frequency Offset Compensation configuration
#define CC1101_BSCFG        0x1A        // Bit Synchronization configuration
#define CC1101_AGCCTRL2     0x1B        // AGC control
#define CC1101_AGCCTRL1     0x1C        // AGC control
#define CC1101_AGCCTRL0     0x1D        // AGC control
#define CC1101_WOREVT1      0x1E        // High INT8U Event 0 timeout
#define CC1101_WOREVT0      0x1F        // Low INT8U Event 0 timeout
#define CC1101_WORCTRL      0x20        // Wake On Radio control
#define CC1101_FREND1       0x21        // Front end RX configuration
#define CC1101_FREND0       0x22        // Front end TX configuration
#define CC1101_FSCAL3       0x23        // Frequency synthesizer calibration
#define CC1101_FSCAL2       0x24        // Frequency synthesizer calibration
#define CC1101_FSCAL1       0x25        // Frequency synthesizer calibration
#define CC1101_FSCAL0       0x26        // Frequency synthesizer calibration
#define CC1101_RCCTRL1      0x27        // RC oscillator configuration
#define CC1101_RCCTRL0      0x28        // RC oscillator configuration
#define CC1101_FSTEST       0x29        // Frequency synthesizer calibration control
#define CC1101_PTEST        0x2A        // Production test
#define CC1101_AGCTEST      0x2B        // AGC test
#define CC1101_TEST2        0x2C        // Various test settings
#define CC1101_TEST1        0x2D        // Various test settings
#define CC1101_TEST0        0x2E        // Various test settings

  • 寄存器值

#define VAL_IOCFG2        0x29
#define VAL_IOCFG1        0x2E
#define VAL_IOCFG0        0x06
#define VAL_FIFOTHR       0x47
#define VAL_SYNC1         0xD3
#define VAL_SYNC0         0x91
#define VAL_PKTLEN        0xFF
#define VAL_PKTCTRL1      0x04
#define VAL_PKTCTRL0      0x05
#define VAL_ADDR          0x00
#define VAL_CHANNR        0x00
#define VAL_FSCTRL1       0x06
#define VAL_FSCTRL0       0x00
#define VAL_FREQ2         0x10
#define VAL_FREQ1         0xA7
#define VAL_FREQ0         0x62
#define VAL_MDMCFG4       0xF5
#define VAL_MDMCFG3       0x83
#define VAL_MDMCFG2       0x13
#define VAL_MDMCFG1       0x22
#define VAL_MDMCFG0       0xF8
#define VAL_DEVIATN       0x15
#define VAL_MCSM2         0x07
#define VAL_MCSM1         0x33//0x3B
#define VAL_MCSM0         0x10
#define VAL_FOCCFG        0x16
#define VAL_BSCFG         0x6C
#define VAL_AGCCTRL2      0x03
#define VAL_AGCCTRL1      0x40
#define VAL_AGCCTRL0      0x91
#define VAL_WOREVT1       0x80
#define VAL_WOREVT0       0x00
#define VAL_WORCTRL       0xFB
#define VAL_FREND1        0x56
#define VAL_FREND0        0x10
#define VAL_FSCAL3        0xE9
#define VAL_FSCAL2        0x2A
#define VAL_FSCAL1        0x00
#define VAL_FSCAL0        0x1F
#define VAL_FSTEST        0x59
#define VAL_PTEST         0x7F
#define VAL_AGCTEST       0x3F
#define VAL_TEST2         0x81
#define VAL_TEST1         0x35
#define VAL_TEST0         0x09
#define VAL_PARTNUM       0x00
#define VAL_VERSION       0x06
#define VAL_FREQEST       0x00
#define VAL_LQI           0x00
#define VAL_RSSI          0x00
#define VAL_MARCSTATE     0x00
#define VAL_WORTIME1      0x00
#define VAL_WORTIME0      0x00
#define VAL_PKTSTATUS     0x00
#define VAL_VCO_VC_DAC    0x00
#define VAL_TXBYTES       0x00
#define VAL_RXBYTES       0x00
#define VAL_RF1AIFCTL0    0x00
#define VAL_RF1AIFCTL1    0x00
#define VAL_RF1AIFCTL2    0x00
#define VAL_RF1AIFERR     0x00
#define VAL_RF1AIFERRV    0x00
#define VAL_RF1AIFIV      0x00
#define VAL_RF1AINSTRW    0x00
#define VAL_RF1AINSTR1W   0x00
#define VAL_RF1AINSTR2W   0x00
#define VAL_RF1ADINW      0x00
#define VAL_RF1ASTAT0W    0x00
#define VAL_RF1ASTAT1W    0x00
#define VAL_RF1ASTAT2W    0x00
#define VAL_RF1ADOUT0W    0x00
#define VAL_RF1ADOUT1W    0x00
#define VAL_RF1ADOUT2W    0x00
#define VAL_RF1AIN        0x00
#define VAL_RF1AIFG       0x00
#define VAL_RF1AIES       0x00
#define VAL_RF1AIE        0x00
#define VAL_RF1AIV        0x00
#define VAL_RF1ARXFIFO    0x00
#define VAL_RF1ATXFIFO    0x00

TX_function ()和 Rx_function ()

tx_fun()
{
    SpiWriteReg(CC1101_TXFIFO,size);
	
	SpiWriteBurstReg(CC1101_TXFIFO,txBuffer,size);			//write data to send
	SpiStrobe(CC1101_STX);									//start send
	while(!(PIND & (1 <<GDO0 )));							// Wait for GDO0 to be set -> sync transmitted
	while((PIND & (1 << GDO0)));							// Wait for GDO0 to be cleared -> end of packet
	
	SpiStrobe(CC1101_SFTX);									//flush TXfifo
}

rx_func()
{
    SpiStrobe(CC1101_SRX);
}

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

    您好!

    您是否曾尝试使用 CC3220无线 MCU  SmartRF Studio 7:  https://www.ti.com/tool/SMARTRFTM-STUDIO ?

    您是使用定制硬件还是使用 TI 评估板?

    此致、

    扎克

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

    您好、Zack、

    是的、我已尝试使用智能射频残桩7的基本 TX 和 Rx。

    我使用的是433Mhz cc11101无线射频收发器模块。

    谢谢。

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

    大家好、Parth、

    很抱歉、您能说明在使用 SmartRF Studio 时该问题是否仍然存在? 您在原始问题中发布了一个代码片段(以及设置)、因此我只想检查一下-我将询问我的一位软件同事、如果这可能是代码(而不是射频设置)问题。

    此致、

    扎克

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

    您好、Zack、

    感谢您的快速响应。

    我们解决了这个问题、一些其他功能是不允许射频芯片接收中断。 现在、 收发器模块的发送和接收工作正常。

    我有一个查询、当一段时间(比如说30分钟)没有发送或接收任何数据包时、RF 不会响应新的数据包(30分钟后)。

    过一段时间芯片是否处于睡眠模式? 由于我的器件是由电池供电的、所以 我们必须进入低功耗模式、怎么才能让芯片在收到信号时唤醒呢?

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

    大家好,帕斯

    在电流消耗方面、让无线电处于连续 RX 状态不是一个好主意。 此外、您可能会遇到合成器失锁的情况、如果您不不时地对其进行校准、因此即使在电流消耗不成问题的情况下、也不建议使用连续 RX (或)。

    为了减少 RX 中的时间、您可以 选择

    1)您可以创建一个同步系统,其中您的发送器和接收器 同时处于活动状态。 如果您有一个系统让您的发送器以固定的间隔发送数据包、并且您设法将接收器同步到此间隔、这样就不必一直处于 RX 状态、

    2)无线电唤醒。 请参阅 AN047--CC1100/CC2500无线电激活(修订版 B (TI.com)) 了解详细信息

    3) 3)如果您的发送器没有频繁传输、解决方案是让发送器在首次传输时多次重复同一消息。 然后、传输的消息长度将决定接收器需要进入 RX 模式以确保其中一个数据包得到接收的频率。

    Br

    Siri

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

    你好、Siri、

    感谢您的宝贵答复。

    对于我的应用、WOR 最适合优化功耗、我将更新我的固件 ACC。 数据表、并尽快更新结果。

    谢谢。此致、

    帕尔特。

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

    尊敬的 Siri:

    我已经为我的应用实现了 WOR 功能。

    这些是 WOR 配置。

    WOR_INIT

    void WakeOnRadioInit()
    {
    	SpiWriteReg(CC1101_WOREVT1, 0xF1);
    	SpiWriteReg(CC1101_WOREVT0, 0x7F);
    
    	SpiWriteReg(CC1101_WORCTRL, 0x78);
    	SpiWriteReg(CC1101_MCSM0, 0x18);
    	SpiWriteReg(CC1101_MCSM2, 0x01);
    
    	SpiWriteReg(CC1101_IOCFG0, 0x24);
    	SpiWriteReg(CC1101_IOCFG2, 0x25);
    	
    }

    WOR_START

    void WakeOnRadioStart()
    {
    	SpiStrobe(CC1101_SRX);
    	SpiStrobe(CC1101_SWORRST);
    	SpiStrobe(CC1101_SWOR);
    	
    }

    主循环

    int main(void)
    {
    	GPIO_init();
    	USART_Init();
    	WS_Init();          //CC1101 Init
        WakeOnRadioInit();
    	WakeOnRadioStart();
    	
    	while (1) 
        {
            //Poling GdO0 pin to check data receivied or not [planning to make it on interrupt]    
        }
    }

    我使用的寄存器配置与我在第一篇文章中提到的相同。

    在当前应用中、我们在接收到特定数据包时发送 ACK 信号。

    在接收到特定的数据包时、CC1101连续发送 Ack 数据包、如果我禁用 WOR、它只发送了一次 Ack 数据包。

    谢谢、此致

    帕尔特。

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

    很抱歉、我不了解您的测试场景以及哪个设备会发送什么内容?

    请尝试澄清(可能使用时序图)这两个器件正在做什么以及它是如何发生故障的。

    Siri

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

    尊敬的 Siri:

    我有两个 CC1101芯片发送器和接收器。

    我正在共享一个 SMART RF Studio 映像。 我使用的是 CC430开发板。

    首先、数据包的4个字节是 id、第5个字节是无关字节、第6个字节是数据包标识字节、即 C9 (201)。因此、如果发送器发送 C9、那么接收应使用包括 CD (205)的数据包来确认它、 正如你可以看到在图像它发送 CD(205)多次。

    Br、

    帕尔特。

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

    对不起、我仍然感到困惑。

    首先、您使用的是 CC430还是 CC1101? 这是两种不同的器件、由两个不同的团队提供支持。其中一种是收发器、另一种是 I A SoC、因此我们有必要了解您遇到问题的器件。

    您说过您有一个使用 WOR 的 CC1101、但是什么用于发送器以及发送器在做什么?

    CC430 RX 在 Studio 中的用途是什么? 是否用作监听器?

    请提供您的实施的时间图表、并清楚地解释出现了什么问题。

    我需要以下格式的内容:

    根据您发布的代码、我假设您有一个在 WOR 模式(器件 B)下使用的 CC1101、它在给定的时间间隔唤醒以搜索数据包。

    但是、对于接收到数据包后将发生的情况、您不会显示任何代码。

    我需要知道代码在做什么、并显示您计划将其用于什么的图表。

    发送器(器件 A)也是如此。 在发送数据包并被器件 B 接收后、它会执行什么操作?

    代码应该做什么、以及您实际看到发生了什么(因为它显然无法按您希望的方式工作)。

    Siri

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

    另一方面、Studio Plots 具有适用于可变数据包长度模式的设置、但接收到的数据包中没有显示长度字节???

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

    你好、Siri、

    感谢您的宝贵答复。 我有一些健康问题、这就是为什么我无法回复的原因。  

    1.  我将 CC1101芯片用于发送器(器件 A)和接收器(器件 B)
    2. CC430的作用就是在同一频率(433.92MHz)上嗅探数据包。
    3. 发送器中使用了相同的 CC1101芯片。 我们设计了一个可将 CC1101与另一个微控制器搭配使用的电路板。 假设 Devie A 是创建的每个触发数据包上的输入传感器、它将通过射频发送到输出传感器设备 B、随后开启或关闭输出。
    4. 抱歉、目前我无法使用逻辑分析仪来显示该图。
    5. 我共享了一个代码片段、以便更好地了解我所描述的 DevieA (Tx)和 DeviceB (RX)的工作原理。 射频的寄存器配置以及发送和接收功能已固定在上述帖子中。

    ISR(INT1_vect)         // Interrupt Pin for GDO2 
    {	
    	WakeOnRadio_Receive();
    	WS_Handler();
    }
    
    
    void WS_Handler()
    {
    uint8_t len;
    uint32_t dev_addr;
    	
        len = WS_ReceiveData(gbl_ws_buffer);
    
    		switch (gbl_ws_buffer[5]) 
    		{
    		case ipop_data      : WS_CheckInputData(&ws_packetdata, (uint32_t *)gbl_ws_buffer); //This function checks the input data received over RF and make decision acc to that.
    		                       break;
    		case op_dataout	    :WS_OutputSuccessPacket(static_device_address,true);  //This function checks the output data received over RF and turn on/off output.
    		                        break;
    		}
    }
    
    void WakeOnRadio_Receive()
    {
    	SpiWriteReg(CC1101_WORCTRL,0x78);
    	SpiWriteReg(CC1101_MCSM2, 0x18);
    	SpiWriteReg(CC1101_WOREVT0, 0x11); 
    	SpiWriteReg(CC1101_WOREVT1, 0x9A); 
    	
    }
    
    int main(void)
    {
    	GPIO_init();
    	USART_Init();
    	WS_Init();          //CC1101 Init
        WakeOnRadioInit();
    	WakeOnRadioStart();
    }

    我已将此帖子转至 WOR https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/181405/wake-up-on-radio-cc1101

    芯片 TX 和 RX 使用相同的配置、启用 WOR 后、器件 A (TX)输入传感器可以成功发送数据包、但器件 B (Rx)输出传感器无法接收数据包。

    谢谢。此致、

    Parth Makwana.

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

    我不确定我可以如何进一步帮助您、我强烈建议您选用逻辑分析仪、以便能够正确对其进行调试。

    从您的设置来看、好像您使用的是1.2kbps 数据速率、并发送4字节的前导码和4字节的同步。

    从 SmartRF Studio 的屏幕截图可以看出、数据包负载好像是9字节。 添加2个 CRC 字节意味着您的数据包

    4 + 4 + 1 + 9 + 2 = 20字节= 160位、这将花费160/1200 = 133ms 的时间进行传输

    您不提供关于设备 A 向设备 B 发送数据包的频率的任何信息、因此我假设数据包仅以随机间隔发送:

    器件 B 处于 WOR 模式、条件如下:

    EVENT0 = 0xF17F = 61823

    tEvent0 =(750/26000000)* 61823 = 1.783s

    tEvent1 =(750/26000000)* 48 = 1.385ms

    RX 超时= 111ms

    这意味着您有如下代码:

    如果您每1.78s 仅唤醒嗅探一次、 您尝试捕获的数据包只是以随机间隔发送、并持续133ms、接收器在发送器传输的同时唤醒的可能性不大。

    请再次阅读您参考的 WOR 帖子、并查看随附的内容、其中我尝试解释如何为给定数据包设置 WOR。

    Siri

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

    尊敬的 Siri:

    我已经购买了一个用于图形验证的逻辑分析仪。 在此期间、我将提交我的代码供您查看。

    您能否评估无线电唤醒(WOR)功能的配置、注意到我正在使用 GDO02引脚进行接收监控?

    而且、为实现输出传感器功能、将复制该配置。

    此外、我还在寻求有关最大限度降低功耗策略的指导。

    Br、

    帕尔特。

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

    我无法为您进行代码审核。

    我需要你告诉我、换句话说、你的系统是如何工作的。

    如果您的 TX 应用需要 以随机间隔传输133ms 长的数据包、则无法使用 WOR 来接收该数据包、因为您必须能够确保在前导码中至少唤醒两次才能检测到数据包。

    如果您的 TX 应用非常灵活、您可以让发送器发送更长的前导码(前导码的长度将决定接收器的唤醒间隔)、也可以在 n 个持续时间内发送许多短 TX 数据包、 然后在该时间间隔内唤醒 RX。

    当您决定了如何操作并实现后、您可以提供逻辑分析仪图、如果您仍然无法使逻辑分析仪正常工作、我可以供您查看。

    Siri

     

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

    HiSiri、

    根据您的建议、我已将前导码大小增加到24并将 WOR 功能的值更改为该值、我将共享我的配置。 我可以在开启 WOR 模式的情况下接收数据包、但它并不总是接收数据包。 关于安装芯片时所用的波形、很难在 SPI 线上布线并获取图。

    void WakeOnRadio_Init()
    {
        SpiWriteReg(CC1101_WORCTRL,  0x78); 
    	
    	SpiWriteReg(CC1101_MCSM2,0x18);
    	
    	SpiWriteReg(CC1101_WOREVT0,0X9A);
    	
    	SpiWriteReg(CC1101_WOREVT1,0X11);
    	
    	SpiStrobe(CC1101_SWOR);	
    }

    寄存器配置

    #define VAL_IOCFG2        0x06
    #define VAL_IOCFG1        0x5c
    #define VAL_IOCFG0        0x07
    #define VAL_FIFOTHR       0x47
    #define VAL_SYNC1         0xD3
    #define VAL_SYNC0         0x91
    #define VAL_PKTLEN        0x61
    #define VAL_PKTCTRL1      0x44
    #define VAL_PKTCTRL0      0x05
    #define VAL_ADDR          0x00
    #define VAL_CHANNR        0x00
    #define VAL_FSCTRL1       0x06
    #define VAL_FSCTRL0       0x00
    #define VAL_FREQ2         0x10
    #define VAL_FREQ1         0xA7
    #define VAL_FREQ0         0x62
    #define VAL_MDMCFG4       0xF5
    #define VAL_MDMCFG3       0x83
    #define VAL_MDMCFG2       0x13
    #define VAL_MDMCFG1       0x72
    #define VAL_MDMCFG0       0xF8
    #define VAL_DEVIATN       0x15
    #define VAL_MCSM2         0x00
    #define VAL_MCSM1         0x33
    #define VAL_MCSM0         0x18
    #define VAL_FOCCFG        0x16
    #define VAL_BSCFG         0x6C
    #define VAL_AGCCTRL2      0x03
    #define VAL_AGCCTRL1      0x40
    #define VAL_AGCCTRL0      0x91
    #define VAL_WOREVT1       0x00
    #define VAL_WOREVT0       0x00
    #define VAL_WORCTRL       0x00
    #define VAL_FREND1        0x56
    #define VAL_FREND0        0x10
    #define VAL_FSCAL3        0xE9
    #define VAL_FSCAL2        0x2A
    #define VAL_FSCAL1        0x00
    #define VAL_FSCAL0        0x1F
    #define VAL_FSTEST        0x59
    #define VAL_PTEST         0x7F
    #define VAL_AGCTEST       0x3F
    #define VAL_TEST2         0x81
    #define VAL_TEST1         0x35
    #define VAL_TEST0         0x09
    #define VAL_PARTNUM       0x00
    #define VAL_VERSION       0x06

    我必须更改我的传输函数以将数据发送到

    void TX_data()
    {
        SpiStrobe(CC1101_SIDLE);
    	_delay_ms(2);
    	SpiStrobe(CC1101_SFTX);
    	_delay_ms(2);
    	SpiStrobe(CC1101_SIDLE);
    
    
    
     	SpiWriteReg(CC1101_TXFIFO,size);
    	SpiWriteBurstReg(CC1101_TXFIFO,txBuffer,size);			//write data to send
    	SpiStrobe(CC1101_STX);									//start send
    	
    	while(!(PIND & (1 <<GDO2 )));							// Wait for GDO2 to be set -> sync transmitted
    	while((PIND & (1 << GDO2)));							// Wait for GDO2 to be cleared -> end of packet
    
    	_delay_ms(750);
    	SpiStrobe(CC1101_SIDLE);
    	
    	SpiStrobe(CC1101_SWORRST);
    	SpiStrobe(CC1101_SWOR);
    	
    }

    接收功能  

    void Rx_Data()
    {
        char size;
    	char status[2];
    	
    	SpiWriteReg(CC1101_WORCTRL, 0x78);
    	SpiWriteReg(CC1101_WOREVT1, 0x11);
    	SpiWriteReg(CC1101_WOREVT0, 0x9A);
    	SpiWriteReg(CC1101_MCSM2, 0x18);
    	SpiWriteReg(CC1101_PKTCTRL1, 0x64);
    
    	
    	if(SpiReadStatus(CC1101_RXBYTES) & BYTES_IN_RXFIFO)
    	{
    		size=SpiReadReg(CC1101_RXFIFO);
    		SpiReadBurstReg(CC1101_RXFIFO,rxBuffer,size);
    		SpiReadBurstReg(CC1101_RXFIFO,status,2);
    		SpiStrobe(CC1101_SFRX);
    		return size;
    	}
     	else
     	{
     		SpiStrobe(CC1101_SFRX);
     		return 0;
     	}
    }

    在我的器件中、CC1101芯片与 ATmega324pb 结合使用。  独立运行时、MCU 的功耗为1.7uA;如果使用 CC1101芯片、则功耗约为500uA。  

    如数据表中所述、在执行 WOR 运算时、消耗值为 nA、但将芯片执行 WOR 运算后、消耗值为微安。

    谢谢、此致。

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

    唤醒间隔看起来还可以、因此很难说一说为什么只是基于配置来释放数据包。

    您确实需要尝试至少能够使用逻辑分析仪监控器件的 GDO 信号以找出故障。

    您可以从发送器输出 PA 信号以查看它何时处于 TX 中以及接收器的 LNA 信号。

    这样、您就可以在进行传输时查看发送器是否实际处于 RX 状态、并可以验证它是否不会过早超时等。

    在 WOR 模式下、电流消耗应为0.5uA。

    如果测量的电压高于此值、则需要查看 GDO 引脚的配置方式、以及在 CC1101被告知进入睡眠模式时连接到 CC1101的 MCU 及其引脚(SPI 和 GDO 引脚)会执行什么操作。

    Br

    Siri

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

    尊敬的 Siri:

    感谢您的宝贵答复。

    我还有一个关于数据发送的问题。

    正如您在我的传输函数中看到的、我在发送数据时添加了延迟。 是否有必要在选通空闲 SFTX 后添加一些延迟?  如果我移除此延迟、在连续发送数据时会丢失数据包。 或不需要延迟? 这是在数据发送后将芯片进行 WOR 运算的正确方法吗?

    	SpiStrobe(CC1101_SIDLE);
    	SpiStrobe(CC1101_SWORRST);
    	SpiStrobe(CC1101_SWOR);

    Br.

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

    没有必要延迟、但我不理解您的设置与您的代码之间的关系。

    当您显然希望在 TX 之后进入空闲状态时、为什么要将 TXOFF_MODE 配置为 RX?

    您应该将 TXOFF_MODE 设置为 IDLE、您的传输函数应该/可能如下所示:

    void TX_data()
    {
        // SpiStrobe(CC1101_SIDLE); Not necessary since the radio should be in IDLE after both RX and TX
    	// _delay_ms(2);
    	// SpiStrobe(CC1101_SFTX); If you use the length byte correct, the FIFO will always be empty after a packet has been transmitted
    	// _delay_ms(2);
    	// SpiStrobe(CC1101_SIDLE); Radio should already be in IDLE
    
     	SpiWriteReg(CC1101_TXFIFO,size);
    	SpiWriteBurstReg(CC1101_TXFIFO,txBuffer,size);			//write data to send
    	SpiStrobe(CC1101_STX);									//start send
    	
    	while(!(PIND & (1 <<GDO2 )));							// Wait for GDO2 to be set -> sync transmitted
    	while((PIND & (1 << GDO2)));							// Wait for GDO2 to be cleared -> end of packet
    
    	// _delay_ms(750); Nothing to wait for here unless you want a delay between packets
    	// SpiStrobe(CC1101_SIDLE); Radio will enter IDLE automatically when a packet is transmitted
    	
    	SpiStrobe(CC1101_SWORRST);
    	SpiStrobe(CC1101_SWOR);
    	
    }

    要将器件置于 WOR 模式、您唯一需要做的就是:

    SpiStrobe(CC1101_SWOR);

    如果希望/需要 在进入 WOR 模式之前将实时时钟重置为 Event1值、可执行以下操作:

    SpiStrobe(CC1101_SWORRST);
    SpiStrobe(CC1101_SWOR);

    如果您不确定是否在启动 WOR 模式时处于空闲状态、可执行以下操作:

    SpiStrobe(CC1101_SIDLE);
    SpiStrobe(CC1101_SWORRST);
    SpiStrobe(CC1101_SWOR);

    Siri

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

    你好

    非常感谢您、更改 TX 函数后、我可以每次使用 WOR 来发送和接收数据包。

    功耗约为800uA、正如您在上一篇文章中所提到的、我将查看 SPI 和 GDO 配置、我将很快向您更新。

    谢谢。此致、

    帕尔特。

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

    很高兴听到您启动并运行了代码。

    Br

    Siri

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

    你好、Siri、

    通过此 WOR 功能、功耗约为300微安。  

    现在我将 WORCTRL 寄存器的值改为0xf8 ( RC_PD 1 R/W 掉电信号转换为 RC 振荡器)。

    这种变化导致消耗约为2uA。这会影响我的接收功能吗? 或者与以前的工作方式相同吗?

    如果它影响我需要实施哪些更改?

    Br.

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

    如果将 RC 振荡器断电、则无法运行 WOR。 这是控制睡眠计时器、以确保无线电从睡眠中唤醒。

    如果 RC 振荡器未运行、那么在您将其置于睡眠状态(SPWD)时、无线电应消耗大约0.2uA 的电流。 确保所有 GDO 引脚均设置为 0x2F。 对于 RC 振荡器、它将消耗0.5uA。

    运行 WOR 时的平均电流消耗量取决于唤醒频率以及每次唤醒时处于 RX 状态的时间。 如果您在唤醒时收到信号、无线电将在 RX 中停留更长的时间、如果您没有收到任何信号、则会产生电流消耗。

    Siri

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

    你好、Siri、
    我正面临着 几个问题。 如果您能帮我解决问题、那将会很有帮助。

    1.) 当发送数据设备卡在行中 while (! (Pind &(1 <<GDO2)));  "等待 GDO2被置位->同步传输"。 请查看我的数据发送功能和所有其他寄存器设置。 器件处于 WOR 模式。

    void WS_SendData(char *txBuffer,char size)
    {
     	SpiWriteReg(CC1101_TXFIFO,size);
    	SpiWriteBurstReg(CC1101_TXFIFO,txBuffer,size);			//write data to send
    	SpiStrobe(CC1101_STX);									//start send
    	while(!(PIND & (1 <<GDO2 )));	//DEVICE STUCK in this while LOOP //-- Wait for GDO0 to be set -> sync transmitted
    	while((PIND & (1 << GDO2)));							// Wait for GDO0 to be cleared -> end of packet
    	
    	SpiStrobe(CC1101_SFTX);									//flush TXfifo
    	SpiStrobe(CC1101_SIDLE);
    	SpiStrobe(CC1101_SWOR);
    }
    
    NOTE:- DEVICE is in WOR mode with following settings
    
    #define VAL_IOCFG2        0x06
    #define VAL_IOCFG1        0x5c
    #define VAL_IOCFG0        0x07 
    #define VAL_FIFOTHR       0x47
    #define VAL_SYNC1         0xD3
    #define VAL_SYNC0         0x91
    #define VAL_PKTLEN        0x3d
    #define VAL_PKTCTRL1      0x44  //0x05--Address checking enable//0x04--Add. check disabled
    #define VAL_PKTCTRL0      0x05
    #define VAL_ADDR          0x00
    #define VAL_CHANNR        0x00
    #define VAL_FSCTRL1       0x06
    #define VAL_FSCTRL0       0x00
    #define VAL_FREQ2         0x10
    #define VAL_FREQ1         0xA7
    #define VAL_FREQ0         0x62
    #define VAL_MDMCFG4       0xF5
    #define VAL_MDMCFG3       0x83
    #define VAL_MDMCFG2       0x13										//GFSK -- 0X13// FSK -- 0X03 // OOK/ASK--0X33// 4-FSK--0X43 //MSK --0X73
    #define VAL_MDMCFG1       0x22							//0x72// preamble set to 0x72-->24 bytes //older 0x22-->4 bytes
    #define VAL_MDMCFG0       0xF8
    #define VAL_DEVIATN       0x15
    #define VAL_MCSM2         0x16
    #define VAL_MCSM1         0x33
    #define VAL_MCSM0         0x38
    #define VAL_FOCCFG        0x16
    #define VAL_BSCFG         0x6C
    #define VAL_AGCCTRL2      0x03
    #define VAL_AGCCTRL1      0x40
    #define VAL_AGCCTRL0      0x91
    #define VAL_WOREVT1       0x87
    #define VAL_WOREVT0       0x6B
    #define VAL_WORCTRL       0x78
    #define VAL_FREND1        0x56
    #define VAL_FREND0        0x10
    #define VAL_FSCAL3        0xE9
    #define VAL_FSCAL2        0x2A
    #define VAL_FSCAL1        0x00
    #define VAL_FSCAL0        0x1F
    #define VAL_FSTEST        0x59
    #define VAL_PTEST         0x7F
    #define VAL_AGCTEST       0x3F
    #define VAL_TEST2         0x81
    #define VAL_TEST1         0x35
    #define VAL_TEST0         0x09
    #define VAL_PARTNUM       0x00
    #define VAL_VERSION       0x06
    #define VAL_FREQEST       0x00
    #define VAL_LQI           0x00
    #define VAL_RSSI          0x00
    #define VAL_MARCSTATE     0x00
    #define VAL_WORTIME1      0x00
    #define VAL_WORTIME0      0x00
    #define VAL_PKTSTATUS     0x00
    #define VAL_VCO_VC_DAC    0x00
    #define VAL_TXBYTES       0x00
    #define VAL_RXBYTES       0x00
    #define VAL_RF1AIFCTL0    0x00
    #define VAL_RF1AIFCTL1    0x00
    #define VAL_RF1AIFCTL2    0x00
    #define VAL_RF1AIFERR     0x00
    #define VAL_RF1AIFERRV    0x00
    #define VAL_RF1AIFIV      0x00
    #define VAL_RF1AINSTRW    0x00
    #define VAL_RF1AINSTR1W   0x00
    #define VAL_RF1AINSTR2W   0x00
    #define VAL_RF1ADINW      0x00
    #define VAL_RF1ASTAT0W    0x00
    #define VAL_RF1ASTAT1W    0x00
    #define VAL_RF1ASTAT2W    0x00
    #define VAL_RF1ADOUT0W    0x00
    #define VAL_RF1ADOUT1W    0x00
    #define VAL_RF1ADOUT2W    0x00
    #define VAL_RF1AIN        0x00
    #define VAL_RF1AIFG       0x00
    #define VAL_RF1AIES       0x00
    #define VAL_RF1AIE        0x00
    #define VAL_RF1AIV        0x00
    #define VAL_RF1ARXFIFO    0x00
    #define VAL_RF1ATXFIFO    0x00
    

    2. 第二个问题是,在 WOR 模式下我没有在 GDO0上获得任何中断。 请帮助我完成发送器侧的寄存器设置、以便接收器可以通过此设置进行 WOR 运算来接收中断。 此外 、请告诉我上述接收器设置中需要进行的任何更改。

    注意:-上述提供的代码和寄存器值位于 CC1101的接收器侧。

    提前感谢

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

    1)

    我不理解您对器件处于 WOR 模式的看法。

    WOR 模式是一种接收模式、因此在尝试传输内容时不能处于 WOR 模式。

    您需要确定的是、问题是 GDO2引脚是否有效、或者问题是您的代码无法检测到它。

    由于我不知道您在测试什么硬件或您在使用什么 MCU、因此我无法告诉您是否正确读取了引脚。

    测试无线电本身时、您应该执行的操作是断开 GDO2与 MCU 的连接、然后在代码中执行以下操作:

    写 TX FIFO

    频闪灯 STX

    while (1);

    然后、应将示波器或逻辑分析仪连接至 GDO2引脚、以验证其是否按预期置位。 确认该条件后、您需要调试代码、以确保 GDO2引脚连接到的 MCY 上的引脚、正确配置为输入、并且您的代码能够读取该引脚。

    2)

    我们没有可用于在 CC1101上进行 WOR 演示的资源。

    您之前已经编写了"您在执行异或运算时  

    "非常感谢、更改 TX 函数后、我每次都可以使用 WOR 来发送和接收数据包。"

    这和1个月前,所以如果 WOR 模式突然不工作,我建议你采取一个步骤回到你已经工作,然后从那里开始:-)

    Siri

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

    你好、Siri、

    void WS_SendData(char *txBuffer,char size)
    {
    	volatile uint8_t temp = 0;
    	SpiStrobe(CC1101_SIDLE);
     	SpiWriteReg(CC1101_TXFIFO,size);
    	//--CC1101_AddressCheck();
    	SpiWriteBurstReg(CC1101_TXFIFO,txBuffer,size);			//write data to send
    		SpiStrobe(CC1101_SFSTXON);	
    	temp = SpiReadStatus(CC1101_MARCSTATE);
    	temp = 0;
    	
    	SpiStrobe(CC1101_STX);	
    	temp = SpiReadStatus(CC1101_MARCSTATE);
    	temp = 0;
    	while(!(PIND & (1<<GDO2 )))							// Wait for GDO0 to be set -> sync transmitted	
    	{
    		temp = SpiReadStatus(CC1101_MARCSTATE);
    	}
    	while((PIND & (1 << GDO2)));							// Wait for GDO0 to be cleared -> end of packet
    
    	SpiStrobe(CC1101_SFTX);									//flush TXfifo
    	SpiStrobe(CC1101_SIDLE);
    	SpiStrobe(CC1101_SWOR);
    }

    1)我们在传输日期时监控机器状态,因此我们的观察如下:-

    -发送 SFSTXON 选通后,设备进入机器状态7.
    发送 STX 选通脉冲后,设备进入机器状态13.

    设备进入机器状态01后。

    那么、我的问题是、如果我  发送 STX 选通后机器状态将为19以发送数据。  

    在检查 GDO0的 PIN 状态时器件卡住。  

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

    当您首次选通 SFSTXON 时、对讲机将退出空闲状态并正在校准同步。

    之后选通 STX 时、它几乎立即进入 TX 状态。

    我不知道您正在使用的 MCU、因此我不知道您是否配置了正在读取的输入等。

    此外、我对您的 SPI 接口一无所知、因此、我不知道您在从时序角度读取寄存器时

    请使用逻辑分析仪开始对此进行调试、并通过监视您的 SPI 线路和 GDO2线路来了解正在发生什么情况。

    Siri

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

    你好、Siri、

    因此、 我的器件目前没有卡住、但在 WOR 模式下没有接收到数据包。 您能帮助我吗?  

    供参考:-寄存器设置与上述发送器的设置相同。

    等待你的回应……

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

    我不知道该怎么办才好。" 正如我之前所说的、您之前运行了 WOR、现在您的 TX 似乎是固定的、由于您以前已经管理过 WOR、因此您应该能够启动 WOR 并再次运行。

    我不知道您对代码所做的更改、从有效的解决方案变为不再有效的状态、因此您只需尝试后退一步、回到原来运行的代码。

    Br

    Siri