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:SLOC297的 SPI 回调问题

Guru**** 2625255 points

Other Parts Discussed in Thread: TRF7960A, CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/730716/cc2650-spi-callback-issues-with-sloc297

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

团队、  

我有一位客户正在使用 CC2650和 TRF7960A 扫描 RFID 标签。 凭借 CC2650上的 SLOC297代码准工作模式、他们可以扫描标签、但代码最终因未知原因而被欺骗、并且需要重启电源。 下面是他们的关键代码片段的摘要、他们不清楚应该如何配置这些代码片段。

这就是它们在 transferMode=SPI_MODE_Blocking 中打开 SPI 驱动器的方式。 您可以看到他们已经注释出了替代的 transferMode=spi_mode_callback、他们不知道如何实现。 也许在阅读此处的注释后、建议帮助他们设置 SPI_MODE_CALLACK?

静态 botool SPI_open (uint32_t bitrate、spi_FrameFormat frameFormat)//更改是静态
的{
//将 SPI 配置为主控方*/
spi_Params_init (&spiNFCParams);
spiNFCParams.transferMode = SPI_MODE_BLOCKING;//spi_MODE_callback;
NFCparams.pitimmaster/spiCalls
= NFCtransferrackn.pid.transferrack_params.pirtid/SPI = SPI_Calls/sime.pirt_transferrackn.spi_params.pit.

spiNFCParams.bitrate =比特率;
spiNFCParams.dataSize = 8;
spiNFCParams.frameFormat =帧格式;

//尝试打开 SPI。 //
spiNFCHandle = SPI_OPEN (Board_SPI0、&spiNFCParams);

返回 spiNFCHandle!= NULL;
}

此外、它们已经设置了 PIN_Handle 和 PIN_Config 表、然后在 IRQ 线路变为高电平时为 GPIO 中断注册了一个回调函数:

静态 PIN_STATE 引脚 NFCSTATE;
静态 PIN_Handle hNFCPin;
静态 PIN_Config BoardNFCPinTable[]=
{
Board_NFC_EN | PIN_GPIO_OUTP_EN | PIN_GPIO_PUTLOW | PIN_PushPull | PIN_DRVSTR_MAX、/* NFC PLUG_IN_PIN_INPUT_IN_IN_ING_INPUT_ING_INPUT_HRESHOT

| PIN_PIN_INP| ING_INPUT_ING_INPUT_ING_INPUT_INPUT_ERR_PIN_INPUT_HREST_IN_IN_INP| PIN_INPUT_INPUT_INP_INP /* NFC_IRQ 为高电平有效*/
Board_LED1 | PIN_GPIO_OUTP_EN | PIN_GPIO_HIGH | PIN_PushPull | PIN_DRVSTR_MAX、// LED 最初关闭*/
Board_LED2 | PIN_GPIO_OUTPUT EN | PIN_GPIO_HIGH | PIN_PushPushPull | PIN_DRVSTR_MAX * PIN_NFCPNFC96x、NFCPINTH_OFF

*

(PIN_NFCQ_INPUT);PIN_NFC9_PIN_PIN_NOT_NFCQ_INTRF_IN);PIN_PIN_PIN_PIN_NFC96*引脚在初始关闭*、NFCP_INSTR_INPUT

在不起作用的回调函数的以下实现中、它们从 SLOC297移植 TRF796x_Callback、如下所示。 在这种情况下、他们面临着从 GPIO 中断回调函数进行 SPI_MODE_BLOCK 调用的挑战、这会导致他们在没有异常处理程序的无限 while 循环中卡在 Hwi.c 中。 我们发现一些关于这一点的弱在线讨论不是一个很好的组合(即阻止 GPIO 中断回调函数内的函数调用)。

静态空 TRF796x_Callback (PIN_Handle handle、PIN_ID pinId)
{
uint8_t ui8IrqStatus;

stop_counter;//停止计时器模式

g_ui8IrqFlag = 0x01;

do
{
read_CLR;// port2中断标志清除

// IRQ 状态寄存器必须被读取
ui8IrqStatus (TRF79xxA);读入 TRF79_CLR

if (ui8IrqStatus = 0xA0)// TX 有效且只有3个字节保留在 FIFO
中{
g_sTrfStatus = TX_WAIT;
break;
}
否则
{
TRF79xxA_processIRQ (&ui8IrqStatus);

}
while (IRQ_PIN_STATUS);//(IRQ_PORT & IRQ_PIN)== TRF79xxA_PROCESS_
(&ui8IrqStatus);}}}while (IRQ_PIN_PIN_PIN_PIN_EXIT)=/PMIC_BIT_BIT_BIT_BIT_BIT_BI

因此、解决方法是简化 TRF796x_Callback 函数、使其仅设置一个标志、然后他们编写了一个应用程序回调函数、该函数经过轮询以查看是否设置了该标志、但它们在这方面存在问题。 最后、他们想知道是否应该将 SPI 驱动程序配置为传输模式=SPI_MODE_CALLBACK、这样他们就可以将 TRF796x_Callback 保持在上面、并从例程内部进行 SPI 调用、而不会卡在 Hwi.c while 循环中无限。

有什么想法吗?

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

    是否可以使用"插入代码"格式器格式化代码片段?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Edvard、

    很抱歉。 修正了它。 有什么想法吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这里的一个大问题是 TRF796x_Callback()函数的"阻塞"性质。 阻止 HWI 回调绝不是件好事。 阻止 SPI 回调也是不好的。

    由于 TRF796x_Callback()函数的内容是“阻塞”和/或处理繁重的,因此它应该位于不同的上下文中,而不是回调。 大概是在 SWI 或任务中。 然后、来自 HWI 或 SPI 的回调函数将信号布置到 SWI 或任务上下文中、然后在以下上下文中开始处理。

    您可以通过简单的 POST 向 SWI 发送信号、也可以使用 TI-RTOS 事件对象来向任务上下文发送信号。