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.

[参考译文] CC2650:IRQ 和 TRF7960A 问题

Guru**** 2391215 points
Other Parts Discussed in Thread: TRF7960A, CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/727822/cc2650-issues-with-irq-and-trf7960a

器件型号:CC2650
主题中讨论的其他器件:TRF7960A

团队、

我有一位客户正在根据 SLOC297握手 CC2650和 TRF7960A。 我从 NFC 团队开始、但他们现在将我推到了您的身边、以解决以下问题。 最初的论坛帖子从 这里开始

  • 客户已从端口进行以下重新实现:

    他们现在正在成功获得 SLOC297固件以完全初始化 TRF7960A 并针对 ISO15693标签首次调用 NFC_findTag()。 这在发送的逻辑分析仪迹线中很明显。
    2、在防碰撞序列被发送(0x8F、0x91、0x3D、0x00、0x30、 0x26、0x01、0x00)、IRQ 线路变为高电平、但代码从不处理 IRQ。
    3.在将代码移植到 CC2650的过程中,他们使用以下代码片段设置 IRQ 处理,如下所示。 本质上、它们将 Board_NFC_IRQ 引脚设置为输入、我为引脚驱动的中断(即 IRQ 变为高电平)注册回调函数、被调用的函数应该是从高电平清除 IRQ 的内容。

    PIN_Config BoardNFCPinTable[]=

    Board_NFC_EN | PIN_GPIO_OUTP_EN | PIN_GPIO_LOW | PIN_PushPull | PIN_DRVSTR_MAX、/* NFC 最初关闭*/
    Board_SPI_NFC_CS | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、
    Board_NFC_IRQ | PIN_INPUT_EN | PIN_PULLUGDOWN | PIN_IRQ_DIS | PIN_迟滞、/* NFC_IRQ 为高电平有效*/
    PIN_TERMINATE
    };

    //此函数设置 TRF7960A 引脚
    void TRF79xxA_communicationSetup (void)

    hNFCPin = PIN_OPEN (&pinNFCState、BoardNFCPinTable);
    PIN_registerIntCb (hNFCPin、TRF796x_Callback);
    MCU_initCounter();


    //#pragma vector = port2_vector
    //__interrupt void
    //TRF79xxA_irqHandler (void)//中断处理程序
    void TRF796x_Callback (PIN_Handle handle、PIN_ID pinId)

    uint8_t ui8IrqStatus;

    STOP_COUNTER;//停止计时器模式

    G_ui8IrqFlag = 0x01;

    操作

    IRQ_CLR;//端口2中断标志清零

    //必须读取 IRQ 状态寄存器
    ui8IrqStatus = TRF79xxA_readIrqStatus ();

    if (ui8IrqStatus = 0xA0)// TX 有效且 FIFO 中只剩下3个字节

    G_sTrfStatus = TX_WAIT;
    中断;

    其他

    TRF79xxA_processIRQ (&ui8IrqStatus);



    } while (IRQ_PIN_STATUS);//(IRQ_PORT & IRQ_PIN)== IRQ_PIN);
    //_BIC_SR_REGISTER_ON_EXIT (LPM0_Bits);


    您能看一下并提出任何想法吗? 客户在请求中包含了逻辑分析仪跟踪、如果有任何帮助。 如果需要、我可以通过电子邮件将其发送给您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Carolus、

    我看到在 PIN 表中、IRQ 引脚被配置为 PIN_IRQ_DIS、这意味着它正在禁用该引脚上的 IRQ。

    请改用此选项并查看它是否有用。
    Board_NFC_IRQ | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_POedge | PIN_迟滞、


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

    AB、

    感谢您的回复。 这当然有助于这种情况、但我们又遇到了另一个问题。 正确执行初始化后、您在下面看到的是、IRQ 一次变为高电平、并由 TRF7960A 的相应寄存器读取(IRQ 状态返回0x80、这意味着 TX 完成)提供服务、但在 that....nothing 之后。 似乎不会执行任何其他命令、也不会进行其他标签读取尝试。 这不应该是这样的、因为对 NFC_FINDTag()的调用是2Hz while 循环的一部分、代码如下所示。 LED 不再闪烁、因此代码现在必须在某个位置挂起...

     while (1){

       //轮询 NFC 标签

       NFC_findTag();

       //闪烁 LED

       SensorTagIO_BLinkLed (IOID_GREEN LED、1);

       SensorTagIO_BLinkLed (IOID_RED_LED、1);

       //循环延迟

       DELAY_MS (500);

     }

    有什么建议吗?

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

    从客户那里获得了更多信息。 当在 ISO15693.c 中的 ISO15693_sendSingleSlotInventory (void)函数内调用下面的行时、代码看起来会冻结:

    G_sTrfStatus = TRF79xxA_waitRxData (5、15);// 5毫秒 TX 超时、15毫秒 RX 超时

    因此、问题现在与用于 Tx 和 Rx 超时的计时器/计数器的配置和使用方式有关。 我们在这里的某个位置卡住了。 下面是他们在 CC2650上设置计数器的方式:

    void CC2650F128RHBR_Counter_Init (void){
    //为内部周期事件创建一次性时钟。 最初设置为30ms。
    Util_constructClock (周期 NFCCLOCK、CC2650F128RHBR_Timer_Handler、
    30、0、false、0);


    然后、他们修改了作为 SLOC297一部分的 mcu.c 中的 MCU_setCounter 函数作为函数包装程序:

    void MCU_setCounter (uint16_t ui16mSecTimeout)

    CC2650F128RHBR_Counter_Set (ui16mSecTimeout);


    其中定义了以下函数:

    空 CC2650F128RHBR_Counter_Set (uint16_t ui16mSecTimeout)

    Util_elitationuleClock (periodicNFCClock、ui16mSecTimeout);
    ////最大延迟= 3.2秒(以覆盖20kHz 的最大 VLO 速度)
    //if (ui16mSecTimeout > 3200)
    //{
    //ui16mSecTimeout = 3200;
    //}
    //
    //TA0CTL |= TACLR;//清除计数器
    //TA0CTL &=~tassel_3;//清除源时钟设置
    //
    // TA0CCTL0 = CCIE;//比较中断使能
    // counter_value =(((ui16VLOConst+1)* ui16mSecTimeout)>1);//由于 ACLK 分频器,Div 为2
    // TA0CTL |= MC_1 + tassel_1;//来自 ACLK 的源,向上计数模式


    它们将计时器处理程序映射到 CC2650计数器处理程序、如下所示:

    静态空 CC2650F128RHBR_Timer_Handler (UARg 参数)

    TRF79xxA_timerHandler();


    然后、他们针对这个新设置修改了以下#defines:

    #define START_COUNTERUtil_startClock (&periodicNFCClock)//在向上计数模式下启动计数器
    #define STOP_COUNTERUtil_stopClock (周期 NFCClock)//停止计数器
    #define RESET_COUNTER STOP_COUNTER

    我们认为问题是他们如何在此处修改的#define 中处理 reset_counter。 在 Tx 和 Rx 超时函数中调用 RESET_COUNTER、其中一个函数正在挂起。 有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我建议通过回调布置信标/事件、而不是从 CB 停止时钟、看看这是否有助于缓解问题。

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

    这是否有帮助? 如果没有、您能描述您使用的硬件吗? 是 launchpad 还是定制板?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    由于不活动、我将关闭此主题、如果您对此问题有其他疑问、请随时回复此评论以重新打开。

    此致、
    AB