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.

[参考译文] LAUNCHXL-CC1310:CC1310 SPI 驱动器和射频可同时运行?

Guru**** 2482115 points
Other Parts Discussed in Thread: CC1310

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1242288/launchxl-cc1310-cc1310-spi-driver-and-rf-can-run-in-the-same-time

器件型号:LAUNCHXL-CC1310
主题中讨论的其他器件:CC1310

我想  在把 cmd 后再使用 cc1310 SPI 接收到的数据发送到 RFcore 后、但当我在把 postcmd 后使用 SPI 时、程序好像一直在 faultISR 中、如何解决?

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

    在不看到代码的情况下、要知道代码为什么不起作用以及必须更改什么内容有点困难。 但我建议查看如何在两种不同的任务中运行射频和 SPI。  

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

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

    当程序运行到 HwiP_RESTORE (KEY)中时、程序发生错误 ISR

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

    尊敬的 Tian:

    射频内核独立于 M3运行、因此射频和 SPI 完全可以同时运行。  

    如果不提供更多详细信息、就很难说明您的程序失败的原因。  

    正如 Ghost 建议您可以在高优先级任务中实现射频、在较低优先级任务中实现 SPI。

    谢谢、

    M·H

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

    为了能够帮助您、请提供一个小型演示代码(从空项目开始)、然后仅实施代码的射频部分和 SPI 部分、这样我们就可以在 LP 上运行代码并重现问题。

    很难在不访问软件并对其进行调试的情况下告知为什么软件失败、因此我们需要运行一些代码来进一步帮助您。

    Siri

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

    void RfSetupState_function()
    {
    RF_Params rfParams;
    rf_params_init (&rfParams);

    if (RFQueue_defineQueue (RFQueue_Rx、
    &dataQueue[RFQueue_Rx],
    rxDataEntryBuffer、
    sizeof (rxDataEntryBuffer)、
    num_data_entries、
    max_RX_length + num_added_bytes){
    /*无法为所有数据条目分配空间*/
    while (true);

    if (RFQueue_defineQueue (RFQueue_Tx、
    &dataQueue[RFQueue_Tx]、
    txDataEntryBuffer、
    sizeof (txDataEntryBuffer)、
    num_data_entries、
    max_tx_length + num_added_bytes){
    /*无法为所有数据条目分配空间*/
    while (true);

    //设置高速 Tx 命令
    rf_cmdTxHS.pQueue =&dataQueue[RFQueue_Tx];
    rf_cmdTxHS.startTrigg.triggerType = TRIG_ABSTIME;
    rf_cmdTxHS.startTrigger.pastTrig = 1;
    RF_cmdTxHS.StartTime = 0;
    rf_cmdTxHs.pktConf.bFsOff = false;
    rf_cmdTxHs.pktConf.bUseCrc = true;
    rf_cmdTxHs.pktConf.bVarLen = true;
    rf_cmdTxHs.pktConf.bCheckQAtEnd = false;

    //设置高速 Rx 命令
    rf_cmdRxHS.pOutput =&rxStatistic_hs;
    rf_cmdRxHS.pQueue =&dataQueue[RFQueue_rx];
    RF_cmdRxHS.maxPktLen = MAX_RX_LENGTH;
    rf_cmdRxHS.pktConf.bFsOff = false;//在执行命令后保持频率同步*/
    rf_cmdRxHS.pktConf.bUseCrc = true;/*接收和检查 CRC */
    rf_cmdRxHS.pktConf.bVarLen = true;/*可变长度*/
    RF_cmdRxHS.pktConf.bRepeatOk = false;//接收单个有效数据包后停止*/
    rf_cmdRxHS.pktConf.bRepeatNok = true;//接收到包含 CRC 错误的数据包后返回同步搜索*/
    rf_cmdRxHS.rxConf.bAutoFlushCrcErr = true;//从 Rx 队列中丢弃具有 CRC 错误的数据包*/
    rf_cmdRxHS.rxConf.bIncludeLen = true;/*在存储的数据包中包含接收到的长度字段*/
    rf_cmdRxHS.rxConf.bIncludeCrc = false;//在存储的数据包中排除接收到的 CRC 字段*/
    rf_cmdRxHS.rxConf.bAppendStatus = false;/* Rx 队列中的数据包没有附加的状态字*/
    rf_cmdRxHS.rxConf.bAppendTimestamp = true;/*将 RX 时间戳添加到数据包有效载荷中*/

    RF_cmdRadioSetup_hsm.config.frontEndMode = 0x00;
    /*请求访问对讲机。 这不会给射频内核上电、但只会初始化
    *驱动程序并缓存 setup 命令。 */
    rfHandle = rf_open (&rfObject、&rf_prop_HSM、(RF_RadioSetup*)&RF_cmdRadioSetup_HSM、&rfParams);
    if (rfHandle == NULL){
    while (true);

    /*设置频率。 现在射频驱动程序为射频内核供电并从上面运行设置命令。
    *当 RF 驱动程序进行自动执行时,会执行 FS 命令并缓存以供以后使用
    *加电。 */
    RF_EventMask 结果= RF_runCmd (rfHandle、(RF_Op*)和 RF_cmdFS、RF_PriorityNormal、NULL、0);
    if (((result != RF_EventLastCmdDone)||(volatile RF_Op*)&RF_cmdFS)->status != DONE_OK){
    while (true);

    if (pAppCallbacks!= NULL){
    // pA 信号设置
    if (pAppCallbacks->appOnPaSetup != NULL){
    pAppCallback->appOnPaSetup();

    // LNA 信号设置
    if (pAppCallbacks->appOnLnaSetup != NULL){
    pAppCallback->appOnLnaSetup();

    #if 已定义(APP_TX_ROLE)
    /*使用当前时间作为未来时间戳的锚点。 */
    RF_cmdNop.StartTime = RF_getCurrentTime ();
    StateMachine_setNextState (&stateMachine、BeaconRequestCcState);
    #Elif 已定义(APP_RX_ROLE)
    StateMachine_setNextState (&stateMachine、RxPacketState);
    #endif

    void RF_TEST_TX (void)
    {

    rf_cmdNop.startTrigger.triggerType = TRIG_ABSTIME;//Trigs (在绝对时间)
    rf_cmdNop.startTrigger.pastTrig = 1;
    /*设置命令链的下一个指针*/
    rf_cmdNop.pNextOp =(RFC_RADIOP_t*)&RF_cmdTxHS;

    // TODO:添加 CS

    // GPIO_WRITE (Board_GPIO_RLED、Board_GPIO_LED_OFF);//

    /*自定义 CMD_HS_TX 命令*/
    {
    uint16_t pktLength;
    uint8_t * pPacket;

    currentDataEntry[RFQueue_Tx]= RFQueue_getDataEntry (RFQueue_Tx);
    RFQueue_nextEntry (RFQueue_Tx);
    pPacket = currentDataEntry [RFQueue_Tx]->data;
    pktLength = sizeof (BeaconReqPkt_t);
    currentDataEntry[RFQueue_Tx]->length = pktLength;

    __attribute__((unused)) BeaconReqPkt_t * pBeaconReqPkt =(BeaconReqPkt_t *) pPacket;

    PktHeader_t *pPktHeader =(PktHeader_t *) pPacket;
    pPktHeader->length = pktLength;
    pPktHeader->destination = APP_DST_ADDR;
    pPktHeader->type = APP_packet_type_beacon_REQ;
    pPktHeader->PCB.b = 0;
    pPktHeader->PCB.b 需要= true;
    pPktHeader->pcb.seqNum = seqNumber;

    rf_cmdTxHS.pQueue =&dataQueue[RFQueue_Tx];
    rf_cmdTxHs.startTrigg.triggerType = trig_now;
    RF_cmdTxHS.condition.rule = COND_ALWAYS;
    rf_cmdTxHS.pNextOP =(RFC_RADIOP_t*)&RF_cmdRxHS;

    /*自定义 CMD_HS_RX 命令*/
    rf_cmdRxHS.pQueue =&dataQueue[RFQueue_rx];
    rf_cmdRxHs.startTrigg.triggerType = trig_now;
    RF_cmdRxHS.condition.rule = COND_STOP_ON_TRUE;
    RF_cmdRxHS.endTrigger.triggerType = TRIG_REL_START;
    RF_cmdRxHS.EndTime = APP_RX_TIMEOUT;
    rf_cmdRxHS.pNextOP =(RFC_radioOp_t*)与 RF_cmdCountBranch;

    /*未接收到应答、执行固定时间重试*//分支跳转tx
    /*自定义 CMD_COUNT_BRANCH 命令*/
    RF_cmdCountBranch.counter = 1+2;//总发送时间,必须设置为大于1
    rf_cmdCountBranch.pNextOp = 0;
    RF_cmdCountBranch.pNextOpIfOk =(RFC_RADIOP_t*)&RF_cmdTxHS;

    logInfo ("信标");
    // GPIO_WRITE (BOARD_GPIO_GLED、BOARD_GPIO_LED_ON);


    /*发送数据包*/
    RF_cmdNop.StartTime += RF_convertMsToRatTicks (1);//1s 间隔发送beacon
    RF_postCmd (rfHandle、(RF_Op*)和 RF_cmdNop、RF_PriorityNormal、
    &CcCallback、RF_EventTxDone |RF_EventTxEntryDone| RF_EventRxEntryDone);//注册RF _EventTxEntryDone

    uint8_t SPI_send_img (void)
    {
    uint8_t flag=0;
    uint8_t cnt=6;

    PIN_setOutputValue (pinHandle、CC1310_LAUNCHXL_DIO5、0);//µ 低电平拍照状态
    spiTransStatus =-1;
    InitAll_SPI (spiQueue、2900);// TODO:更改图像大小
    // spi_send (spiQueue、2900);
    PIN_setOutputValue (pinHandle、CC1310_LAUNCHXL_DIO5、1);//µ 低电平拍照状态
    usleep(6*1000);
    // CPUdelay(12000*6);
    PIN_setOutputValue (pinHandle、CC1310_LAUNCHXL_DIO5、0);//µ 低电平拍照状态
    if (spiTransStatus!=-1)
    // if (spiTransStatus ==SPI_TRANSMIT_completed)
    {
    //logHex ("SS Rx:"、6、spiQueue);
    标志=1;

    否则
    {
    SPI_transferCancel (spiHandle);

    // Power_releaseConstraint (PowerCC26XX_disallow _idle);
    SPI_Close (spiHandle);
    返回标志;

    静态 void InitAll_SPI (uint8_t * rxBuffer、size_t maxLength)
    {
    Bool transferOK;
    静态 uint8_t packtnum=0;

    SPI_INIT();
    SPI_PARAMS_INIT (&spiParams);

    spiParams.dataSize = 8;// 8位数据大小
    spiParams.bitrate = 4000000;
    spiParams.frameFormat = SPI_POL1_PHA1;
    spiParams.mode = SPI_SLAVE;
    spiParams.transferMode = SPI_MODE_CALLBACK;
    spiParams.transferCallbackFxn = transferCompleteFxn;
    //打开 SPI 并执行传输
    spiHandle = SPI_open (Board_SPI_SLAVE、&spiParams);
    if (spiHandle == NULL){
    while (1);// spi_open ()失败

    // SPI_CONTROL (spiHandle、SPICC26XXDMA_RETURN_PARTIAL_ENABLE、NULL);
    // SPI_CONTROL (spiHandle、SPICC26XXDMA_SET_CSN_PIN、NULL);

    //配置事务
    spiTransaction.count = maxLength;
    spiTransaction.txBuf = NULL;
    spiTransaction.rxBuf = rxBuffer;
    transferOK=SPI_TRANSMIT (spiHandle、&spiTransaction);

    //void mainthread ()

    //  RfSetupState_function();

    // while (1)
    //{
    // rf_test_tx ();
    // usleep(1000);
    // if (spi_send_img ())
    //{
    //// logInfo ("spi rx:%x|%x|%x|%x"、spiQueue[0]、spiQueue[1]、spiQueue[2]、spiQueue[3]);
    // logHex ("SS Rx:"、6、spiQueue);
    // logInfo ("s.k");
    //}
    //
    //}

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

    我尝试,但程序仍然停留在某处,并且可以,无法发送数据通过 RFcore

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

    您没有提供完整的示例供我们测试、因此我无法告诉您正在发生什么。

    我看不到您的代码中有任何错误处理、也不知道您的回调中会发生什么情况。

    你做了很多事情会把事情弄得一团糟:命令链、分支、命令的不同启动触发器等。

    您是否已验证如果未使用 SPI、无线电的一切功能是否按预期正常工作?

    您使用的是高速模式并在从模式下使用 SPI、因此您无法控制 SPI 上的情况何时发生。 当对讲机收到数据包时、如果您的应用被回调占用该怎么办。 您是否能够足够快地清空缓冲区以避免溢出?

    当代码被卡住以确定对讲机发生了什么情况时、您是否检查了所有对讲机命令的状态?

    您还应该尝试在运行代码以及 SPI 总线的同时从无线电输出 Pa 和 LNA 信号。 监控无线电和 SPI 上发生的情况可以帮助您确定何时/发生了什么故障。

    Siri