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.

[参考译文] RTOS/LAUNCHXL-CC2650:cc2650主器件 SPI0和主器件 SPI 1存在 DMA 控制问题

Guru**** 2551110 points
Other Parts Discussed in Thread: CC2650, ADS1292

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/565618/rtos-launchxl-cc2650-cc2650-master-spi0-and-master-spi-1-with-dma-control-problem

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

工具/软件:TI-RTOS

具有 DMA 控制的 cc2650 SPI0 mater 和 SPI1主器件、当我使用 SPI0与 STM32通信时、我发现两个 SPI 缺少一些消息、我希望发送20字节数据、但我发现 SPI SCLK 输出小于 

20 * 8 CLKS、什么问题? 当我屏蔽其中的一个,另一个正常!但当它们一起工作,错误!帮助!附件是我的代码!
//来自 yam_application.c
static void StmComM_taskFxn (UArg a0、UArg A1)
{
//SPI 相关变量
SPI_Handle handle;
SPI_Params params;
SPI_Transaction;
uint8_t Butxf[DS_central_LEN];//传输缓冲区
uint8_t Buf[0xFF];rxmembuket_eBuf]

;0xmembuket_eBuf (0xFF]、0xmembr>)、0xtxbuff_set
sizeof (rxBuf));

//Init STM 通信任务
StmComM_init();
//初始化 SPI 并指定非默认参数
SPI_PARAMS_INIT (params);
params.bitrate = 80000;
params.frameFormat = SPI_POL1_PHA1;
params.mode = SPI_MASTER;
针对 STM32响应、/SPI 传输超时为5ms。
//params.transferTimeout = 10 *(1000/Clock_tickPeriod);
params.transferMode = SPI_MODE_BLOCKING;
//配置事务
transaction.count = sizeof (txBuf);
transaction.txBuf = txBuf;
transaction.rxBuf = rxBuf;

//打开 SPI 并执行到第一个从器件的传输
句柄= SPI_OPEN (CC2650_LAUNCHXL_SPI0、&params);
//SPI_transfer (handle、&transaction);

for (;;){
ProcessStmCommQueryEvt();
ProcessStmCommMsg (句柄、事务);
Task_sleep (10 *(1000/Clock_tickPeriod));
//SPI_transfer (handle、&transaction);
}
} 


//从 yam_application.c 静态 void EmbgTask_taskFxn (UArg0、UArg1){SPI_Handle handle;SPI_Params params;SPI_Transaction transaction;uint8_t sizeBuf[20];//传输缓冲区 uint8_t rxBuf[mem20];//接收缓冲区集(0xtxFF)、0xtxef (set); sizeof (rxBuf));//初始化 SPI 并指定非默认参数 SPI_Params_init (&params);params.bitrate = 1000000;params.frameFormat = SPI_POL1_PHA1;params.mode = SPI_master;params.transferMode = SPI_MODE_BLOCKING; //配置事务处理。count = sizeof (txBuf);transaction.txBuf = txBuf;transaction.rxBuf = rxBuf;//打开 SPI 并启动第一个传输句柄= SPI_open (CC2650_LAUNCHXL_SPI1、&params);//SPI_transfer (handle、transaction);// while (transaction)(perk_handle);/1000 (pertask_handle);//任务(perk1);//任务(pertick1)

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

    我看不到您发布的内容有明显的问题。

    显然、您可以单独使用 SPI0或 SPI1、但当您尝试同时使用 SPI0或 SPI1时、是否会出现问题?

    您使用的是 TI-RTOS 的哪个版本?

    您是否以任何方式修改了板级配置文件(CC2650_LAUNCHXL*)?

    您是否曾尝试使用 ROV (RTOS 对象查看器)查看内核状态、以查看堆栈大小是否正常、并且没有报告其他错误?

    谢谢、
    Scott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉!  tirtos 版本为 tirtos_cc13xx_cc26xx_2_21_00_06。  我已经将 spi0任务堆栈增加到1024字节、但这是无用的、我肯定不是堆栈问题。
    SPI0作为主器件与 STM 32通信、SSP1作为主器件与 ads1292通信。
    当我使用 SPI0作为主器件、 使用 SPI1作为具有传输回调函数的从器件时、 为了测试 spi0与 SPI1之间的通信、它们是可以的!
    2.当我尝试使用 spi0作为主器件、使用 SPI1作为主器件来控制器件 ads1292和 STM32时、spi0损坏。
      我确信、该函数在 SPICC26XXDMA.c 中永远处于等待状态  
      bool SPICC26XXDMA_transfer (SPI_Handle handle、SPI_Transaction *事务){
       if (!semaphore_pend (semaphore_handle (&(object->transferComplete)))、object->transferTimeout){}
      }
      因此 SCLK 引脚中没有 clk 输出、因为它会永久断开并等待。
      当我添加 params.transferTimeout = 10 *(1000/Clock_tickPeriod)时; spi0可以正常工作、但这是错误的、缺少 SCLK、我想输出160个 CLKS、但它只输出  
      120时钟。  当我屏蔽 SPI1代码时、 spi0正常。
    那么、两个 SPI 主器件 在 DMA 控制 同时工作时有什么问题呢?  
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    //#define __STM_COM_TEST__
    #ifdef __STM_COM_TEST___
    //发送缓冲区
    uint8_t TestBuf[DS_CENTRAL_LEN]={0x84、0x00、0x62、0xB0};
    uint8_t tx1Buf[DS_CENTRAL_LEN];// transmit tractice
    
    
    
    
    
    = 0x20_translate_u20/ tractu20/ u20uelt 1u20/ u20u20u20uelt translate=u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u20u
    
    
    
    
    memcpy (tx1Buf、TestBuf、DS_central _LEN);
    }
    transaction->count = sizeof (tx1Buf);
    //开始另一个传输
    spi_transfer (handle、transaction);
    }
    //来自 yo_application.c
    静态 void EmgTask_taskFxn (UArg0、UArg1)
    {
    SPI_Handle 句柄;
    SPI_Params 参数;
    SPI_Transaction 事务;
    //uint8_t txBuf[20];//发送缓冲器
    //uint8_t rxBuf[20];//接收缓冲区
    memset (tx1Buf、0xFF、DS_CENTRAL_LEN);
    
    //初始化 SPI 并指定非默认参数
    SPI_PARAMS_INIT (params);
    params.bitrate = 1000000;
    params.frameFormat = SPI_POL1_PHA1;
    params.mode = SPI_SLAVE;
    Params.transferMode = SPI_MODE_CALLACK;
    params.transferCallbackFxn = transferCallback;
    
    //配置事务
    
    transaction.count = sizeof (tx1Buf);
    transaction.txBuf = tx1Buf;
    transaction.rxBuf = rx1Buf;
    
    //打开 SPI 并启动第一个传输
    句柄= SPI_OPEN (CC2650_LAUNCHXL_SPI1、&params);
    //SPI_CONTROL (handle、SPICC26XXDMA_return_party_enable、NULL);
    SPI_TRANSFCTION (句柄、事务);
    while (true);
    
    //while (1){
    //Task_sleep (50 *(1000/Clock_tickPeriod));
    // spi_transfer (handle、&transaction);
    //}
    #else
    
    // from yam_application.c
    static void EmgTask_taskFxn (UArg0、UArg1)
    {
    SPI_Handle 句柄;
    SPI_Params 参数;
    SPI_Transaction 事务;
    uint8_t txBuf[20];//发送缓冲器
    uint8_t rxBuf[20];//接收缓冲
    
    区 memset (txBuf、0xFF、sizeof (txBuf));
    memset (rxBuf、0xFF、 sizeof (rxBuf));
    
    //初始化 SPI 并指定非默认参数
    SPI_PARAMS_INIT (params);
    params.bitrate = 1000000;
    params.frameFormat = SPI_POL1_PHA1;
    params.mode = SPI_MASTER;
    params.transferMode = SPI_MODE_BLOCKING;
    
    //配置事务
    transaction.count = sizeof (txBuf);
    transaction.txBuf = txBuf;
    transaction.rxBuf = rxBuf;
    
    //打开 SPI 并启动第一个传输
    句柄= SPI_OPEN (CC2650_LAUNCHXL_SPI1、&params);
    //SPI_transfer (handle、&transaction);
    while (1){
    Task_sleep (50 *(1000/Clock_tickPeriod));
    //SPI_transfer (handle、&transaction);
    }
    }
    #endif
    

    SPI1的代码、我使用了宏定义。  

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

    好的、谢谢。

    您能否澄清一下:如果您将 SPI0主器件注释为 STM 传输、并且只运行 SPI1主器件至 ADS1292传输、那么这是否起作用?  

    我知道您已经使用回调模式测试了 SPI0-SPI1回送(非常好)。  以及 SPI0至 STM 本身。  但不清楚的是、与 ADS1292一起传输的 SPI1主器件在单独运行时是否正常工作。  (但很明显,一旦您尝试同时使用 SPI1,SPI0将不再按预期工作。)

    我无法解释您发布的代码,因为已注释掉了许多行,并且混合使用了回调和阻塞模式。  您能否单独发布失败的代码、该代码仅显示 SPI0至 STM 代码、然后仅显示 SPI1至 ADS 代码。  我认为、如果您发布.c 文件、而不是将其与您的消息内联发布、那会更好。

    请澄清您在何处调用这些传输、它是否来自两个单独的任务?  

    谢谢、
    Scott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢!SPI、没关系、因为我只向 ads1292发送数据、但我没有从它接收数据。 SPI0和 SPI1是两个独立的任务。 

    SPI1主代码 //来自您的_application.c 静态空 EmbgTask_taskFxn (UARg a0、UARg A1) { SPI_Handle 句柄; SPI_Params 参数; SPI_Transaction 事务; uint8_t txBuf[20];//发送缓冲器 uint8_t rxBuf[20];//接收缓冲区 memset (txBuf、0xFF、sizeof (txBuf)); memset (rxBuf、0xFF、sizeof (rxBuf)); //初始化 SPI 并指定非默认参数 SPI_PARAMS_INIT (params); params.bitrate = 1000000; params.frameFormat = SPI_POL1_PHA1; params.mode = SPI_MASTER; //配置事务 transaction.count = sizeof (txBuf); transaction.txBuf = txBuf; transaction.rxBuf = rxBuf; //打开 SPI 并启动第一个传输 句柄= SPI_OPEN (CC2650_LAUNCHXL_SPI1、&params); while (1){ Task_sleep (50 *(1000/Clock_tickPeriod)); SPI_TRANSFCTION (句柄、事务); } }

    附件是 SPI0主代码!  谢谢!

    e2e.ti.com/.../5228.StmSPIComm.c

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

    尊敬的用户4793539:

    感谢您附加该文件。  我需要与一些同事讨论这个问题,一旦我有一些建议,我就会马上回来…

    此致、
    Scott

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

    大家好、ScottG。  谢谢!  是否可以再次出现问题?

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

    尊敬的用户4793539:

    很抱歉、我现在不在办公室了、我现在就回到这里了。  我询问过、并向驾驶员提交人发送了一些想法的请求。  我没有可以尝试类似您的测试的硬件设置,在两个 SPI 主端口上同时进行活动。  我希望能尽快向您提出一些建议…

    此致、
    Scott

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

    尊敬的用户4793539:

    您能否说明您是如何将 Launchpad 上的 STM32连接到 SPI0的?  在 CC2650 Launchpad 上、SPI0已连接到 Launchpad 上的外部闪存芯片。

    您能否附加您正在使用的板级配置文件(CC2650_LAUNCHXL*)?

    ‘s、您能否从 SPI_TRANSF()调用以及 SPI_Transaction 结构中的“状态”字段读取并报告返回值?  这将指示 SPI 驱动程序是否认为传输已成功完成。

    谢谢、
    Scott

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

    大家好 、ScottG!   

    SPI_Status 为 SPI_TRANSFER_Started,μ s、但 SCLK 引脚中没有 clk 输出。   

    SPI_TRANSFT()调用的返回值为 bool true (十六进制0x01)。

    我已将 STM32正确连接到 cc2650、因为我已使用 SPI0和通信协议测试了通信数据。  工作正常!

    SPI 闪存芯片选择为 DIO_20。 它与 STM32 SPI 芯片选择和我使用硬件 spi0不同。 SPI0引脚是  

    /* STM32 SPI 板通信*
    #define Board_SPI0_MISO IOID_9 /* MISO */
    #define Board_SPI0_MOSI IOID_8 // MOSI *
    #define Board_SPI0_CLK IOID_10 // CLK */
    #define Board_SPI0_CSn IOID_11 /*/CS *

    谢谢!

    e2e.ti.com/.../0081.CC2650_5F00_LAUNCHXL.he2e.ti.com/.../7853.CC2650_5F00_LAUNCHXL.c

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

    尊敬的用户4793539:

    感谢您附加文件。  

    我将这些与您之前提到的 tirtos_cc13xx_cc26xx_2_21_00_06中的板级配置文件进行了比较、并且有很多差异。  看起来这些文件已经过重大修改、以便使用2015年旧版本中的 TI-RTOS 内核和驱动程序。  例如、如果您的在右侧:



    电源模块在2015年年底从内核中移出、现在作为驱动程序存在(如左侧所示)。  和:

    这表明您正在使用旧的 SPI 驱动器。

    2015年底发现了两个 SPI 驱动程序实例同时运行的问题。  此问题作为错误 ID LPRFMW-161提交、并于2015年12月3日修复。  如果您从2015年开始使用较旧的驱动程序、则可能会受到该旧错误的影响。

    我想、如果您在没有进行大量修改的情况下使用完整的 tirtos_cc13xx_cc26xx_2_21_00_06版本、则可以解决这个问题…

    此致、
    Scott

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

    大家好 、Scott!我从 TI 网站下载的 TI CC2650 LaunchPad 项目0的预测基数。  

    我很困惑!  但我会尝试这种方法! 谢谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有一个建议的答案、由于此主题在一周内未激活、建议的答案被标记为验证。 请随意选择"拒绝回答"按钮、并回复更多详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现了一个非常奇怪的问题、在使用 TI driverlib 操作两个 SPI 时、这是坏的。
    我使用中断编写了 SPI 的驱动程序,操作1 SPI 正常,操作两个 SPI 时,它们会损坏。
    但是当我用1个中断模式操作两个 SPI 时,另一个是回送模式,它们都可以。

    在此过程中、我发现编译器问题! 真的很无聊! websire 地址是编译器问题。
    e2e.ti.com/.../585473

    谢谢!