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.

[参考译文] CC2745P10-Q1:SPI 传输问题

Guru**** 2551110 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1564494/cc2745p10-q1-spi-transmit-issue

器件型号:CC2745P10-Q1


工具/软件:

我已为 CC2745 安装最新的 SDK (simplelink_lowpower_f3_SDK_9_11_00_18)。 并使用 SPI 与其他外设通信。 发送 SPI 信号时、没有正确获得时钟。 但 1MHz 比特率下的 MOSI 信号似乎正常。

在 SPI 中 、我将 CC2745 视为控制器。 比特率 1MHz。

也会在一个发送代码卡滞后发生 硬故障处理程序、  

Exception_handlerSpin() 函数。  
请告诉我、在 SPI 传输之前、必须调用参数来更新哪些函数。

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

    您好、Anto、

    我能否获得更多有关您尝试实现的内容和当前代码的信息? 它可能与 SPI 通信初始化有所不同、因此我想了解如何设置。 谢谢。

    Eshaan

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

    您好、

    /*
     *  ======== spicontroller.c ========
     */
    #include <stddef.h>
    #include <stdint.h>
    #include <string.h>
    
    /* POSIX Header files */
    #include <pthread.h>
    #include <semaphore.h>
    #include <unistd.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/SPI.h>
    #include <ti/display/Display.h>
    
    /* Driver configuration */
    #include "ti_drivers_config.h"
    
    #define THREADSTACKSIZE (1024)
    
    #define SPI_MSG_LENGTH (256)
    #define CONTROLLER_MSG ("Hello from controller, msg#: ")
    
    #define MAX_LOOP (10)
    
    #ifdef DeviceFamily_CC35XX
        #define CONFIG_GPIO_LED_0 GPIO_INVALID_INDEX
        #define CONFIG_GPIO_LED_1 GPIO_INVALID_INDEX
    #endif
    
    uint8_t example_string[270]={0xAA,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
                                  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
                                  3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
                                  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
                                  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                                  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
                                  3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
                                  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0xFF    };
    
    unsigned char controllerRxBuffer[SPI_MSG_LENGTH];
    unsigned char controllerTxBuffer[SPI_MSG_LENGTH];
    
    /* Semaphore to block controller until peripheral is ready for transfer */
    sem_t controllerSem;
    
    void spiCallbackFxn(SPI_Handle controllerSpi, SPI_Transaction *tran);
    
    /* Default SPI parameters structure */
    const SPI_Params NFC_SPI = {
        SPI_MODE_CALLBACK, /* transferMode */
        1000,  /* transferTimeout */
        spiCallbackFxn,    /* transferCallbackFxn */
        SPI_CONTROLLER,    /* mode */
        1000000,           /* bitRate */
        8,                 /* dataSize */
        SPI_POL0_PHA0,     /* frameFormat */
        NULL               /* custom */
    };
    
    /*
     *  ======== peripheralReadyFxn ========
     *  Callback function for the GPIO interrupt on CONFIG_SPI_PERIPHERAL_READY.
     */
    void peripheralReadyFxn(uint_least8_t index)
    {
        sem_post(&controllerSem);
        
    }
      SPI_Handle controllerSpi ; //controllerSpi;    //SPI_config
        SPI_Params spiParams;
        SPI_Transaction transaction;
        SPI_Mode Controller = SPI_CONTROLLER;
        uint32_t i;
        bool transferOK;
        int32_t status;
    /*
     *  ======== controllerThread ========
     *  Controller SPI sends a message to peripheral while simultaneously receiving a
     *  message from the peripheral.
     */
    void SPI_Init(void )
    {
      
        SPI_init();
        /* Open SPI as controller (default) */
      //  SPI_Params_init(&NFC_SPI);
        controllerSpi  = SPI_open(Controller, &NFC_SPI);
        /*
         * Controller has opened CONFIG_SPI_CONTROLLER; set
         * CONFIG_SPI_CONTROLLER_READY low to inform the peripheral.
         */
        // GPIO_write(CONFIG_GPIO_SPI_0_CSN, 1);
            /* Initialize controller SPI transaction structure */
          //  controllerTxBuffer[sizeof(CONTROLLER_MSG) - 1] = (i % 10) + '0';
            transaction.count = 8;
            transaction.txBuf = (void *)controllerTxBuffer;
            transaction.rxBuf = (void *)controllerRxBuffer;
    
    }
    
    void spiCallbackFxn(SPI_Handle controllerSpi, SPI_Transaction *tran)
    {
           sem_t *semPtr = (sem_t *)(tran->arg);
         // Post the semaphore if our transaction was more than LIMIT
           if (tran->status == SPI_STATUS_SUCCESS ){//&& tran->count > LIMIT) {
               sem_post(semPtr);
          }
      }
    _Bool SPI_Sts_Info=0;
    void SPI_Tx_test(void){
          /* Perform SPI transfer */
          // GPIO_write(CONFIG_GPIO_SPI_0_CSN, 0);
            transaction.txBuf = (void *)example_string;
            transferOK = SPI_transfer(controllerSpi, &transaction);
            if (transferOK)
            {
                SPI_Sts_Info=1;
            }
            else
            {
                 SPI_Sts_Info=0;
            }
    
        SPI_close(controllerSpi);
    }

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

    您好、

    您将哪个器件用作外设、在开始传输之前、您是否能够建立握手或至少初始连接? 另外、您能否发送输出/错误的图片、以便我准确地看到您收到了什么消息?

    但是、在对代码进行初始审阅时、我建议使用库 SPI_Params_init ()、然后手动更改参数。 这将根据堆栈默认值初始化参数、因此它将确保结构遵循 spi_open () 所需的格式。 另外,我注意到你有 spi_Init () 和 spi_tx_test () 作为单独的函数,但我看不到主函数显示了你如何调用这两个函数。 如果您有一个函数、查看该函数会有所帮助、以便我可以按照什么顺序调用这些函数。

    谢谢

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

    您好、

    我用逻辑分析仪捕捉

    目前我只测试传输,在上面的屏幕短时钟不正确,但 MOSI 信号是完美的传输。

      传输成功后、我无法在 spiCallbackFxn 获取回调、

    在 “ transferOK = SPI_transfer (controllerSpi、&transfertion);“中、此处返回状态显示为 1 (transferOK)。  

    我  以 1ms 计时器回调在 1 秒的时间间隔内调用“SPI_Tx_test ()“函数。

    在第一次传输后、我能够得到一次计时器回调。  

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

    我在 SPI 时钟中修改了代码、但响应几乎相同

    /*
     *  ======== spicontroller.c ========
     */
    #include <stddef.h>
    #include <stdint.h>
    #include <string.h>
    
    /* POSIX Header files */
    #include <pthread.h>
    #include <semaphore.h>
    #include <unistd.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/SPI.h>
    #include <ti/display/Display.h>
    
    /* Driver configuration */
    #include "ti_drivers_config.h"
    
    #define THREADSTACKSIZE (1024)
    
    #define SPI_MSG_LENGTH (256)
    #define CONTROLLER_MSG ("Hello from controller, msg#: ")
    
    #define MAX_LOOP (10)
    
    #ifdef DeviceFamily_CC35XX
        #define CONFIG_GPIO_LED_0 GPIO_INVALID_INDEX
        #define CONFIG_GPIO_LED_1 GPIO_INVALID_INDEX
    #endif
    
    uint8_t example_string[270]={0xAA,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,
                                  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
                                  3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
                                  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
                                  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,
                                  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
                                  3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,
                                  4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,0xFF    };
    
    unsigned char controllerRxBuffer[SPI_MSG_LENGTH];
    unsigned char controllerTxBuffer[SPI_MSG_LENGTH];
    
    /* Semaphore to block controller until peripheral is ready for transfer */
    sem_t controllerSem;
    
    void spiCallbackFxn(SPI_Handle controllerSpi, SPI_Transaction *tran);
    
    /* Default SPI parameters structure */
    // const SPI_Params NFC_SPI = {
    //     SPI_MODE_CALLBACK, /* transferMode */
    //     100,  /* transferTimeout */
    //     spiCallbackFxn,    /* transferCallbackFxn */
    //     SPI_CONTROLLER,    /* mode */
    //     1000000,           /* bitRate */
    //     8,                 /* dataSize */
    //     SPI_POL0_PHA0,     /* frameFormat */
    //     NULL               /* custom */
    // };
    
    /*
     *  ======== peripheralReadyFxn ========
     *  Callback function for the GPIO interrupt on CONFIG_SPI_PERIPHERAL_READY.
     */
    void peripheralReadyFxn(uint_least8_t index)
    {
        sem_post(&controllerSem);
        
    }
      SPI_Handle controllerSpi ; //controllerSpi;    //SPI_config
        SPI_Params NFC_SPI;
        SPI_Transaction transaction;
        SPI_Mode Controller = SPI_CONTROLLER;
        uint32_t i;
        bool transferOK;
        int32_t status;
    /*
     *  ======== controllerThread ========
     *  Controller SPI sends a message to peripheral while simultaneously receiving a
     *  message from the peripheral.
     */
    void SPI_Init(void )
    {
      
        SPI_init();
        /* Open SPI as controller (default) */
        SPI_Params_init(&NFC_SPI);
        NFC_SPI.transferMode = SPI_MODE_CALLBACK, /* transferMode */
       // NFC_SPI.transferTimeout=      100,  /* transferTimeout */
        NFC_SPI.transferCallbackFxn=    spiCallbackFxn,    /* transferCallbackFxn */
        NFC_SPI.mode  =   SPI_CONTROLLER,    /* mode */
        NFC_SPI.bitRate =     1000000,           /* bitRate */
        NFC_SPI.dataSize =     8,                 /* dataSize */
        NFC_SPI.frameFormat =      SPI_POL0_PHA0,     /* frameFormat */
    
        controllerSpi  = SPI_open(Controller, &NFC_SPI);
        /*
         * Controller has opened CONFIG_SPI_CONTROLLER; set
         * CONFIG_SPI_CONTROLLER_READY low to inform the peripheral.
         */
        // GPIO_write(CONFIG_GPIO_SPI_0_CSN, 1);
            /* Initialize controller SPI transaction structure */
          //  controllerTxBuffer[sizeof(CONTROLLER_MSG) - 1] = (i % 10) + '0';
            transaction.count = 8;
            transaction.txBuf = (void *)controllerTxBuffer;
            transaction.rxBuf = (void *)controllerRxBuffer;
    
    }
    
    void spiCallbackFxn(SPI_Handle controllerSpi, SPI_Transaction *tran)
    {
           sem_t *semPtr = (sem_t *)(tran->arg);
         // Post the semaphore if our transaction was more than LIMIT
           if (tran->status == SPI_STATUS_SUCCESS ){//&& tran->count > LIMIT) {
               sem_post(semPtr);
          }
      }
    _Bool SPI_Sts_Info=0;
    void SPI_Tx_test(void){
          /* Perform SPI transfer */
          // GPIO_write(CONFIG_GPIO_SPI_0_CSN, 0);
            transaction.txBuf = (void *)example_string;
            transferOK = SPI_transfer(controllerSpi, &transaction);
            if (transferOK)
            {
                SPI_Sts_Info=1;
            }
            else
            {
                 SPI_Sts_Info=0;
            }
      //  SPI_close(controllerSpi);
    }

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

    尊敬的 Anto:

    根据您提供的代码、我看到您没有任何条件检查外设是否实际可以进行传输。 如果您在不断传输信号而没有持续检查外围设备是否也已就绪、您将看到您当前正在观察的行为、并且 callbackFxn 将只在第一次工作。 因此,我建议,除了计时器回调/中断之外,你还初始化与 GPIO 或其他信号相关联的信标,该信号向 SPI 协议发出信号,即设备已准备好在实际调用 spi_transfer() 之前传输。

     Eshaan

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

    尊敬的 Eshaan:

    我的外设有 OUT 就绪引脚、我不必检查预置条件。 当我 从片选引脚发送数据时、外设将能够准备就绪并接收信号。

    请提供下面所示的时钟信号信息、  

    这是预期的时钟信号。 (来自其他芯片)

    这是我从 CC2745 获得的

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

    您好、Anto、

    我很抱歉延迟回复;我正在调查此问题、并将在星期一或星期二上回复您。

    Eshaan

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

    您好、Anto、

    我曾尝试使用两个 CC2745 和基本 SPI 演示重新创建问题、但我没有看到相同的时钟同步问题。 您的外设也是 TI 器件吗?