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.

[参考译文] CC1200:读取标准数据包或加密数据包时遇到问题

Guru**** 2535380 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1009992/cc1200-trouble-reading-standard-packet-or-encrypted-packet

器件型号:CC1200
主题中讨论的其他器件:MSP430FR5994

尊敬的 Sirs:

   接收标准数据包时遇到问题、接收编码标准数据包时遇到同样的问题。

IOCONFIG0被设定为06。  它的正边沿中断并运行接收器。  当接收到 SYNC 时会发生这种情况。  

其负边沿也会中断并将 packetSemaphore 设置为01。  这应该是数据包全部被接收的时候。   上升和下降中断确实会发生,我已经用示波器查看了 GPIO0,它的脉冲持续21ms (高电平、低电平),包装长度大约为10个字符,因此波形看起来是

工作。  但是、下面的接收例程每次都显示为0的 rxBytes。  加密接收例程也存在同样的问题。  我可以输入延迟、它将能够读取字节、但这应该正常工作。

感谢你的帮助。  

     非编码数据包的接收例程:

          //等待数据包接收中断

           while (!packetSemaphore)

               A=a+1;

 

 

               //读取 RX FIFO 中的字节数

               cc120xSpiReadReg (CC120X_NUM_RXBYTES、&rxBytes、1);

 

               //检查 FIFO 中是否有字节

               if (rxBytes!= 0)

               {

 

                   //读取 MARCSTATE 以检查 RX FIFO 错误

                   cc120xSpiReadReg (CC120X_MARCSTATE、&marcState、1);

 

                   //屏蔽 MARCSTATE 位并检查是否具有 RX FIFO ERR

                   if ((marcState & 0x1F)== 0x11)   //RX_FIFO_ERROR

                   {

                       //刷新 RX FIFO

                       TrxSpiCmdStrobe (CC120X_SFRX);

                   }否则

                   {

                       //从 RX FIFO 读取 n 个字节

                       cc120xSpiReadRxFifo (rxBuffer、rxBytes);

 

                       //检查 CRC OK (CRC_OK:第二个状态字节中的位7)

                       //假设状态字节附加在 RX_FIFO 中

                       //(PKT_CFG1.append_status = 1)

                       //如果禁用 CRC,CRC_OK 字段将读为1

                       if (rxBuffer[rxBytes-1]和0x80)

                       {

                           //更新数据包计数器

                           PacketCounter++;

                       }

                   }

 

               //重置数据包信标

               packetSemaphore = ISR_IDLE;

 

               //将无线电设置回 RX

               TrxSpiCmdStrobe (CC120X_SRX);

 

       }                            //未加密接收的结束

 

 

 

 

 

 

 

                                            配置:

 

{CC120X_IOCFG0、           0x06}、    //PKT_SYNC_RxTx

 {CC120X_SYNC3、            0x55}、   //DualSync

 {CC120X_SYNC2、            0x59}、   //这2个同步仅用于 接收。  发送同步在 TX 之前设置

 {CC120X_SYNC1、            0x56}、   //

 {CC120X_SYNC0、            0xa6}、   //

 {CC120X_SYNC_CFG0、        0x03}、   //**是88。  添加了 PQT_EN=80 & PQT_Gating_en=0x08、B00=最严格。 b10=strict_sync_check=3

 {CC120X_SYNC_CFG1、        0x28}、   //** 28 = 11位和8阈值。  是48。  4x=16位、8x=24位、Ax=32位7-5 len 同步、4:0=SYNC 阈值

 {CC120X_EXTERING_M、      0x8D}、

 {CC120X_MODCFG_DEV_E、     0x08}、    //对于 GFSK、// 08对于4GFSK                                        GFSK/4FSK、28

 {CC120X_DCFILT_CFG、       0x5D}、

 {CC120X_PREAMING_CFG1、    0x14}、    //14=3字节、18=4b。 20=6B 10=2字节 e AA。  是24。  0x31=24字节。 0x25=7字节

 {CC120X_PREAMITY_CFG0、    b9}、    //**是8A PQT_EN=08

 {CC120X_IQIC、             0xCB}、

 {CC120X_CHAN_BW、          0xA6}、    //AC=9.46khz。  AA=10kHz

 {CC120X_MDMCFG1、          0x40}、    //was E0。 80=载波侦听门、40= FIFO手动模式=20、反转数据=10

 {CC120X_MDMCFG0、          0x05}、

 {CC120X_SYMBOL_Rate2、     0x5F}、    //4F、用于正常2400= 5F、4800= 6F 或9600 (不带曼彻斯特)

 {CC120X_symbol_rate1、     0x75}、

 {CC120X_symbol_RATE0、     0x10}、

 {CC120X_AGC_REF、          0x31}、

 {CC120X_AGC_CS_THR、       0x8B}、    //8B=-117、8C=-116、8d=-115 8A=-118、88=-120为8A、92=-110dBm。 8F=-113、A6=-90dBm

 {CC120X_AGC_CFG1、         0x40}、

 {CC120X_AGC_GAIN_ADJUST、  0x9C}、    //9C=-100、9D=-99。  当 AGC_GAIN_ADJUST.GAIN_ADJUST = 0x00时、这是 RSSI 偏移有效。

 {CC120X_AGC_CFG0、         0x8C}    、//8c=5计数。  RSSI 的计数为80=1

 {CC120X_FIFO_CFG、         0x00}、

 {CC120X_Setting_CFG、     0x03}、

 {CC120X_FS_CFG、           0x1B}、

 {CC120X_WOR_CFG0、         0x08}、    //相同

 {CC120X_WOR_CFG1、         0x08}、    //添加

 {CC120X_WOR_EVENT0_MSB、   0x01}、    //0035=.6PRE、010A=1PRE、018f=2PRE、 0214=2.5PRE、 029a=3PRE

 {CC120X_WOR_EVENT0_LSB、   0x8F}、    //

 {CC120X_PKT_CFG2、         0x00}、     //0c=CCA 模式。 CRC 被禁用、无状态字节

 //{CC120X_PKT_CFG1、         0x03}、     //def=3、0x01 =附加状态。 20、10=ADX钟 02 (init FFFF)和04 (init 0000)=CRC 被启用。

 {CC120X_PKT_CFG0、         0x20}、     //在位6:5中固定长度=00、在位4:2中固定长度=00

 //{CC120X_RFEND_CFG1、       0x30}、   // X30在复用后返回到 Rx

 {CC120X_RFEND_CFG0、       0x04}、     //04:基于 PQT 的 RX 端接。  0x1:基于 CS 的 RX 项。  复用后、0x30返回到 Rx

 {CC120X_PKT_LEN、          0x7d}、     //最大数据包长度

 {CC120X_IF_MIX _CFG、       0x1C}、

 {CC120X_FREQOFF_CFG、      0x22}、     //FOC_EN=x20、FOC_KI_Factor=02为20

 {CC120X_MDMCFG2、          0x00}、

 {CC120X_TOC_CFG、          0x4b}、    //**为40 TOC 限制2%

 

 {CC120X_Settling_CFG、     0x08}、    //Cal FS 从 IDLE 变为 Rec TX

 

 {CC120X_FREQ2、            0x5A}、

 {CC120X_FREQ1、            0x00}、

 {CC120X_FREQ0、            0x00}、

 

 {CC120X_IF_ADC1、          0xEE}、

 {CC120X_IF_ADC0、          0x10}、

 {CC120X_FS_DIG1、          0x07}、

 {CC120X_FS_DIG0、          0xAF}、

 {CC120X_FS_CAL1、          0x40}、

 {CC120X_FS_CAL0、          0x0E}、

 {CC120X_FS_DIVTWO、        0x03}、

 {CC120X_FS_DSM0、          0x33}、

 {CC120X_FS_DVC0、          0x17}、

 {CC120X_FS_PFD、           0x00}、

 {CC120X_FS_PRE、           0x6E}、

 {CC120X_FS_REG_DIV_CML、   0x1C}、

 {CC120X_FS_SPARE、         0xAC}、

 {CC120X_FS_VCO0、          0xB5}、

 //{CC120X_FS_CFG、           0x0B}、                    //136-160MHz

 {CC120X_XOSC5、            0x0E}、

 {CC120X_XOSC1、            0x03}、

};

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

    如果中断按预期发生、我将假定数据是在 FIFO 中接收的。

    从寄存器设置中、我看不到您正在使用任何 CRC 滤波、这意味着如果数据包首先被放入 FIFO 中、它应该保持在 FIFO 中、直到 FIFO 被读取或清空 FIFO。

    您是否在读取 NUM_RXBYTES 时监视过 SPI? 请记住、该寄存器位于扩展寄存器空间中。

    我无法验证您的设置、因为射频寄存器从默认值、WOR 设置、基于 PQT 的 RX 终端等发生了很多变化

    您是否曾尝试仅使用 SmartRF Studio 的默认设置(在 SmartRF Studio 中选择所需的频率和数据速率)、然后验证是否可以使用这些设置接收数据包? (请勿使用 WOR 等。只需简单的 RX 和 TX)

    验证了这项工作后、您可以逐个更改射频参数、以确保更改不会中断任何内容、然后您可以开始启用特殊功能。

    这样做将更容易找到您所看到问题的确切原因。

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

    谢谢、Siri:

       我使用 GPIO0进行无线电中断,但示例使用 GPIO2。 您是否介意查看我的中断?

     

     

    //GPIO0连接到 p1.2和 P7.1。  P1.2捕捉 GPIO0的上升沿,P7.1 //捕捉下降沿。

    #pragma vector=Port1_vector

    _interrupt void radioRxISR (void) //IRQ、用于 GPIO0上升沿 Rx 中断

     

     

       if (((P1IFG & BIT2)=BIT2)      //P1.2 IRQ

       {

           if ((uFixedMode = RxMode)&&(RxCald)&&(!RecIrqRunning)) //RxMode=2.  确保 Rx 已校准且 Rx 尚未运行!

           {

              RecIrqRunning=1;//设置 rec 数据包信标。 上升沿、SYNC 被发送。  

              RunRx();             //开始接收

           }

           P1IFG &=~BIT2;        //清除 P1.2 (GPIO0)的中断标志

     }

     

     

    //GPIO0也连接到 P7.1、可捕捉其负下降沿:

     

    #pragma vector=PORT7_vector     // P7.1上的下降沿 IRQ 以捕捉 GPIO0变为低电平

    _interrupt void radioTxISR (void) //IRQ、用于 GPIO0和 GPIO2 MISO、MOSI、SCLK 端口1

           P7IFG &=~BIT1;        //清除 P7.1的中断标志(连接到 GPIO0)

           如果(uFixedMode = TxMode)             //TxMode = 1

           {

               packetSemaphore = tisr_action_required;//设置发送信标(下降沿、发送数据包)

           }

     

     

     

       //无线电中断设置如下:

       //将 ISR 函数连接到 GPIO0 P1.2:

       P1SEL0 &=~BIT2;         //为 P1.2选择 GPIO

       P1SEL1 &=~BIT2;

       P1DIR &=~BIT2;         //set dir to input

       //P1REN |=(BIT2);      //PULLUP

       P1IES &=~BIT2;         //rising edge 0->1提供 SYNC rec'd IRQ (接收)

       P1IFG &=~BIT2;         //清除 P1.2的中断标志

       P1IE |=(BIT2);       //ie 使能标志

       P1IFG =0;              //清除 P1的所有 IRQ 标志

     

       //将 ISR 函数连接到 GPIO0 P7.1:

       P7SEL0 &=~BIT1;       //为 P7.1选择 GPIO

       P7SEL1 &=~BIT1;

       P7DIR &=~BIT1;        //set dir to input

       P7IES |= BIT1;         //下降沿

       P7IFG = 0;              //清除 P7的所有中断标志

       P7IE |= BIT1;          //ie TX IRQ 使能标志

     

     

     

    John

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

    我无法查看您的 MCU 实现是否有中断。 首先、我甚至不知道您在使用什么 MCU、 其次、如果您使用的是 TI 的 MCU、则需要在适当的论坛中提出此问题(如果您使用的是 MSP、则需要在 MSP 论坛中提出)、因为我只熟悉此论坛支持的射频器件

    除了监控 SPI 并执行我建议您在上一个帖子中执行的所有测试、您还可以执行一些简单的步骤来检查您的中断。

    首先需要验证的是、当 GPIO0上出现下降沿(接收到数据包)时、您进入 ISR。

    如果您不这样做、那么设置中断和/或连接到 GPIO0的引脚的方式会出现问题。

    如果在出现 CRC 错误时不使用长度过滤、地址过滤或自动刷新 FIFO、

    在 ISR 中读取 CC120X_NUM_RXBYTES 应该会显示 RX FIFO 中存在数据。

    Siri

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

    我已经完成了这些基本测试、但将尝试更好地完成这些测试。   使用 MSP430FR5994。  行为是、它似乎一直接收到 GPIO0的上升沿 IRQ。  我可以每次接收整个数据包、然后给我时间来接收所有字节。  但当 GPIO0的下降沿到达时、字节未就绪。

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

    如果 IOCFG0 = 0x06、当 GPIO0无效时、完整的数据包就会出现在 RX FIFO 中。

    之后没有任何东西添加到 FIFO 中。 如果在读取 NUM_RXRBYTES 之后、它将为0 (如果您使用某种类型的滤波、并且数据包已被滤除)、或者它将告诉您数据包中已接收到多少字节(包括长度字节和可选状态字节)。

    我不明白为什么您的代码在该信号的上升沿有中断? 为什么要知道何时发送和/或接收同步字

    Siri

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

    谢谢、Siri:

       GPIO0的上升沿用于告知发送器发送数据包的时间。  但我发现它也可用于在等待接收所有数据包后进行接收。  每次使用下降沿 GPIO 时、这都会起作用、但在我的系统中没有可用的数据。

    John

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

    我很抱歉,但我不确定你的意思。 在开始写入 TXFIFO 之前、不应等待发送器上的上升中断。 您应该先写入 TX FIFO、然后写入 Strobe STX、 之后您唯一需要注意的信号是 GPIO0上的下降沿、它告诉您数据包已发送、TX FIFO 为空、无线电返回空闲状态(如果您使用我建议的 Studio 设置进行测试)。

    在 RX 端、您唯一应该做的 就是等待 GPIO0上的下降沿、检查 FIFO 中是否有字节(除非您使用滤波)、然后读取这些字节。

    为了帮助您进一步、您需要执行我要求您进行的测试、然后向我提供结果:

    使用 SmartRF Studio 中的推荐设置

    确保 IOCFG0 = 0x06

    初始化 MCU 以及无线电和频闪灯 SRX

    传输数据包(为简单起见、您可以使用 SmartRF Studio)

    验证您是否在 GPIO0下降沿的代码中获得中断

    向我提供发生中断后读取 NUM_RXBYTES 寄存器的 SPI 图

    Siri

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

    谢谢、Siri:

      我生病了、但会尽快这样做。

    John