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.

[参考译文] CC2745R10-Q1:CC2745R10-Q1:将 SPI 通信方法从轮询更改为 DMA 时、将无法发送数据。

Guru**** 2535150 points
Other Parts Discussed in Thread: CC2745R10-Q1, SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1532415/cc2745r10-q1-cc2745r10-q1-when-the-spi-communication-method-is-changed-from-polling-to-dma-data-cannot-be-sent

器件型号:CC2745R10-Q1
主题: SysConfig 中讨论的其他器件

工具/软件:

TI、您好

当 SPI 通信方法从轮询更改为 DMA 时、无法发送数据。

(环境)
软件产品:SimpleLink 低功耗 F3 SDK (8.30.00.11_ea)
板:CC2745R10-Q1 开发平台

在上述环境中、SPI 通信方法从轮询更改为 DMA。

(更改 (SysConfig))
串行接口-> SPI ->
最小 DMA 传输大小:977→0
DMA 中断优先级:7→6

在进行上述更改和调试之后、
更改(轮询)之前:尝试发送 51 字节数据时、发送 51 字节数据。 (数据传输成功)
更改后 (DMA):尝试发送 51 字节数据时、会发送 35 字节的数据。 (数据传输失败)

为什么会这样呢?

此致、

Sho

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

    当电路板单独运行(片上)时、会出现上述问题(发送 35 字节的数据)。
    使用 IAR 进行调试时、可以发送 51 字节的数据。

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

    您好:

    感谢您联系我们! 我们将查看您的问题、尽快回复您!  

    此致、

    Tarek D

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

    您好:

    感谢您联系我们、很抱歉耽误您的时间! 调用 spi_transfer() 后、您将收到什么状态代码?

    此致、

    Tarek

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

    您好、Tarek、

    谢谢你。
    关于 spi_transfer()、我没有调用它。
    状态代码返回 true。

    此致、

    Sho

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

    >上述问题(发送 35 字节的数据)发生在电路板单独运行(片上)。
    >使用 IAR 进行调试时,可以发送 51 字节的数据。

    关于上述现象、
    发送 14 个字节时、在调试执行期间:仅板(片上)运行时发送 14 个字节:不发送
    发送 51 个字节时、在调试执行期间:仅板(片上)运行时发送 51 个字节:发送 35 个字节
    发送 99 字节时、在调试执行期间:仅板(片上)运行时发送 99 字节:发送 83 字节
    在每种情况下、所发送数据的长度都缩短 16 个字节、16 个字节的时钟未运行。

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

    您好 Sho、

    这当然是奇怪的行为。 您将 SPI 帧格式设置为什么? 您能否尝试将其设置为  SPI_POL0_PHA1 并查看问题是否仍然存在?

    此致、

    Tarek D

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

    您好、Tarek、

    SPI 帧格式已设置为 SPI_POL0_PHA1。
    我曾尝试将其更改为 SPI_POL0_PHA0、但结果似乎几乎相同。
    (发送 35 字节的数据)

    此致、

    Sho

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

    您好 Sho、

    您能分享所有要通过的 SPI 参数吗? 还可能包含一个有关如何使用 SPI 的代码片段?

    此致、

    Tarek

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

    首先、传递的 SPI 参数如下:

    传输模式:SPI_MODE_BLOCKING
    比特率:1000000
    数据大小:8.
    帧格式:SPI_POL0_PHA1

    此致、

    Sho

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

    下面是一个展示如何使用 SPI 的代码片段:

    static SPI_Params sts_SPI_DRV_spiParams;
    static SPI_Handle sts_SPI_DRV_spiHandle;
    static SPI_Transaction sts_SPI_DRV_transaction;
    
    #define D_NULL_                         ( NULL )
    #define mcS4_SPI_DRV_SPI_SPI_MASTER     (SPI_CONTROLLER)
    #define mcU4_SPI_DRV_SPI_TIMEOUT        ((uint32_t)1000U)
    #define mcU4_SPI_DRV_SPI_BAUDRATE       ((uint32_t)1000000U)
    #define mcU4_SPI_DRV_SPI_DATASIZE       ((uint32_t)8U)   
    
    
    
    uint8_t u1g_SPI_DRV_init( void )
    {
        uint8_t u1t_initRslt = 0x01;
        util_memset( &pu1s_SPI_DRV_txBuf[0], 0x00, ( 1027 ) );
        util_memset( &pu1s_SPI_DRV_rxBuf[0], 0x00, ( 1027 ) );
        sts_SPI_DRV_transaction.rxBuf = (void*)pu1s_SPI_DRV_rxBuf;
        
        SPI_init();
        SPI_Params_init( &sts_SPI_DRV_spiParams );
        
        vos_SPI_DRV_spiParams_set();
        sts_SPI_DRV_spiHandle = SPI_open( CONFIG_SPI_INDEX_COUNT, &sts_SPI_DRV_spiParams);
        
        if( ( SPI_Handle )D_NULL_ != sts_SPI_DRV_spiHandle ){
            SPI_close( sts_SPI_DRV_spiHandle );
        }
        else
        {
            u1t_initRslt = 0x02;
        }
    
        return ( u1t_initRslt );
    }
    
    static void vos_SPI_DRV_spiParams_set( void )
    {
    	sts_SPI_DRV_spiParams.transferMode        = SPI_MODE_BLOCKING;
    /*	sts_SPI_DRV_spiParams.transferTimeout     = mcU4_SPI_DRV_SPI_TIMEOUT; */
    	sts_SPI_DRV_spiParams.transferCallbackFxn = D_NULL_;
    	sts_SPI_DRV_spiParams.mode                = mcS4_SPI_DRV_SPI_SPI_MASTER;
    	sts_SPI_DRV_spiParams.bitRate             = mcU4_SPI_DRV_SPI_BAUDRATE;
    	sts_SPI_DRV_spiParams.dataSize            = mcU4_SPI_DRV_SPI_DATASIZE;
    	sts_SPI_DRV_spiParams.frameFormat         = SPI_POL0_PHA1;
    
    	return;
    	}
    
    bool bog_SPI_DRV_transferFrame( void )
    {
       bool bot_result = false;
    
        vos_SPI_DRV_spiParams_set();
        sts_SPI_DRV_spiHandle = SPI_open(0, &sts_SPI_DRV_spiParams);
        
        if( ( SPI_Handle )D_NULL_ != sts_SPI_DRV_spiHandle ){
            bot_result = SPI_transfer( sts_SPI_DRV_spiHandle, &sts_SPI_DRV_transaction );
            SPI_close( sts_SPI_DRV_spiHandle );
        }
        
        return ( bot_result );
    }

    此致、

    Sho

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

    您好、Tarek、

    调查是否正在进行?
    如果您知道任何信息、请告诉我。

    相比、使用 IAR 进行调试时、
    当电路板单独运行(片上)时、
    发送的数据少 16 个字节(时钟在中间停止)、
    我认为初始化有一些可疑之处。

    此致、

    Sho

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

    您好:

    我为延误道歉! 是否可以尝试将电源策略从 standbyPolicy 更改为 doWFI? 为此、请执行以下操作:

    1 — 转到工程内的 syscfg 文件

    2-转到 TI 驱动程序的“电源“部分

    3-将电源策略从 standbyPolicy 更改为 doWFI

    这可能不是永久性修复、但有助于我们进一步诊断此问题。

    此致、

    Tarek D

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

    您好、Tarek、

    电源策略已从 PowerCC27XX_standbyPolicy 更改为 PowerCC27XX_doWFI。

    结果相同:
    IAR 调试: 51 字节
    独立(片上):35 字节

    ----------------------------------------------------------------------------------------------------

    IAR 调试

      

    ----------------------------------------------------------------------------------------------------

    独立(片上)

      

    如果您想了解更多信息、敬请告知。

    此致、

    Sho

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

    您好 Sho、

    感谢您提供此信息! 这确实是非常奇怪的行为。 作为测试、您能否测试 SDK 中的开箱即用 SPI 示例? 此外、您能否提供更多代码片段、以便我们进一步分析正在发生的情况?

    此致、

    Tarek D

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

    您好、Tarek、

    我们将使用 SDK 中包含的 SPI 示例执行测试。
    需要哪种类型的代码片段?
    用于初始化、参数设置和传输的代码片段是否足够了?

    此致、

    Sho

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

    您好 Sho、

     LP-EM-CC2745R10-Q1 上将 SimpleLink F3 SDK v9.11.00.18 与 spiconcontroller 示例与 IAR ARM v9.60.3 一起使用、因此没有发现您要报告的问题。  请注意、根据 SDK 版本说明、直到 v8.40、SimpleLink F3 SDK 才完全支持 CC2745R10-Q1。  我将提供 spiconController.c 和 spiconController.syscfg 供您参考。  如果我的示例未充分配置来演示该问题、请考虑升级您的 SimpleLink F3 SDK、并提供额外注释

    /*
     * Copyright (c) 2018-2024, Texas Instruments Incorporated
     * All rights reserved.
     *
     * Redistribution and use in source and binary forms, with or without
     * modification, are permitted provided that the following conditions
     * are met:
     *
     * *  Redistributions of source code must retain the above copyright
     *     notice, this list of conditions and the following disclaimer.
     *
     * *  Redistributions in binary form must reproduce the above copyright
     *     notice, this list of conditions and the following disclaimer in the
     *     documentation and/or other materials provided with the distribution.
     *
     * *  Neither the name of Texas Instruments Incorporated nor the names of
     *     its contributors may be used to endorse or promote products derived
     *     from this software without specific prior written permission.
     *
     * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
     * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
     * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
     * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     */
    
    /*
     *  ======== 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 (32)
    #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
    
    static Display_Handle display;
    
    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;
    
    /*
     *  ======== controllerThread ========
     *  Controller SPI sends a message to peripheral while simultaneously receiving a
     *  message from the peripheral.
     */
    void *controllerThread(void *arg0)
    {
        SPI_Handle controllerSpi;
        SPI_Params spiParams;
        SPI_Transaction transaction;
        uint32_t i;
        bool transferOK;
        int32_t status;
    
        /*
         * Create synchronization semaphore; the controller will wait on this semaphore
         * until the peripheral is ready.
         */
        status = sem_init(&controllerSem, 0, 0);
        if (status != 0)
        {
            Display_printf(display, 0, 0, "Error creating controllerSem\n");
    
            while (1) {}
        }
    
        /* Open SPI as controller (default) */
        SPI_Params_init(&spiParams);
        spiParams.frameFormat = SPI_POL0_PHA1;
        /* See device-specific technical reference manual for supported speeds */
        spiParams.bitRate     = 1000000;
        controllerSpi         = SPI_open(CONFIG_SPI_CONTROLLER, &spiParams);
        if (controllerSpi == NULL)
        {
            Display_printf(display, 0, 0, "Error initializing controller SPI\n");
            while (1) {}
        }
        else
        {
            Display_printf(display, 0, 0, "Controller SPI initialized\n");
        }
    
        /* Copy message to transmit buffer */
        strncpy((char *)controllerTxBuffer, CONTROLLER_MSG, SPI_MSG_LENGTH);
    
        for (i = 0; i < MAX_LOOP; i++)
        {
    
            /* Initialize controller SPI transaction structure */
            controllerTxBuffer[sizeof(CONTROLLER_MSG) - 1] = (i % 10) + '0';
            memset((void *)controllerRxBuffer, 0, SPI_MSG_LENGTH);
            transaction.count = SPI_MSG_LENGTH;
            transaction.txBuf = (void *)controllerTxBuffer;
            transaction.rxBuf = (void *)controllerRxBuffer;
    
            /* Toggle user LED, indicating a SPI transfer is in progress */
            GPIO_toggle(CONFIG_GPIO_LED_1);
    
            /* Perform SPI transfer */
            transferOK = SPI_transfer(controllerSpi, &transaction);
            if (transferOK)
            {
                Display_printf(display, 0, 0, "Controller received: %s", controllerRxBuffer);
            }
            else
            {
                Display_printf(display, 0, 0, "Unsuccessful controller SPI transfer");
            }
    
            /* Sleep for a bit before starting the next SPI transfer  */
            sleep(3);
        }
    
        SPI_close(controllerSpi);
    
        Display_printf(display, 0, 0, "\nDone");
    
        return (NULL);
    }
    
    /*
     *  ======== mainThread ========
     */
    void *mainThread(void *arg0)
    {
        pthread_t thread0;
        pthread_attr_t attrs;
        struct sched_param priParam;
        int retc;
        int detachState;
    
        /* Call driver init functions. */
        Display_init();
        GPIO_init();
        SPI_init();
    
        /* Configure the LED pins */
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
        GPIO_setConfig(CONFIG_GPIO_LED_1, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    
        /* Open the display for output */
        display = Display_open(Display_Type_UART, NULL);
        if (display == NULL)
        {
            /* Failed to open display driver */
            while (1) {}
        }
    
        /* Turn on user LED */
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
    
        Display_printf(display, 0, 0, "Starting the SPI controller example");
        Display_printf(display,
                       0,
                       0,
                       "This example requires external wires to be "
                       "connected to the header pins. Please see the Readme.html and Board.html for details.\n");
    
        /* Create application threads */
        pthread_attr_init(&attrs);
    
        detachState = PTHREAD_CREATE_DETACHED;
        /* Set priority and stack size attributes */
        retc        = pthread_attr_setdetachstate(&attrs, detachState);
        if (retc != 0)
        {
            /* pthread_attr_setdetachstate() failed */
            while (1) {}
        }
    
        retc |= pthread_attr_setstacksize(&attrs, THREADSTACKSIZE);
        if (retc != 0)
        {
            /* pthread_attr_setstacksize() failed */
            while (1) {}
        }
    
        /* Create controller thread */
        priParam.sched_priority = 1;
        pthread_attr_setschedparam(&attrs, &priParam);
    
        retc = pthread_create(&thread0, &attrs, controllerThread, NULL);
        if (retc != 0)
        {
            /* pthread_create() failed */
            while (1) {}
        }
    
        return (NULL);
    }
    

    e2e.ti.com/.../spicontroller.syscfg

    此致、
    Ryan

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

    977 不是 SysConfig 中的默认值、因此我假设这是针对您的应用程序定制的。

    您之前的代码片段无害、但我现在注意到 SPI_TRANSFER 之后立即显示了 SPI_CLOSE。  您能在这两个 API 之间插入一个延迟吗?

    是否有任何迹象表明在 SysConfig 中启用并必须在工程中使用的其他功能(例如 BLE 或 CAN)会干扰 SPI 传输?  或者、您是否认为仅提供的 SPI 代码足以产生该错误?

    [报价 userid=“660032" url="“ url="~“~/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1532415/cc2745r10-q1-cc2745r10-q1-when-the-spi-communication-method-is-changed-from-polling-to-dma-data-cannot-be-sent/5943881 ]#include
    #include [/报价]

    这些内容不需要包含在应用程序中、但您可以尝试同时复制这两个内容 /source/ti/drivers/spi/SPILPF3DMA.c 和  /source/ti/drivers/dma/UDMALPF3.c 导入您的工程中、以进一步调试 API 并确定是否观察到任何错误。

    此致、
    Ryan

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

    您好、Ryan

    我在 SPI_TRANSFER 和 SPI_CLOSE 之间插入了 100ms 睡眠时间、
    但结果与之前相同、从 51 个字节更改为 35 个字节。

    由于我不使用 CAN、因此没有中断空间。

    由于我使用的是 FreeRTOS、其优先于 BLE 任务处理而不是 SPI 任务、
    BLE 任务可能会在 SPI 任务期间中断。
    (但是,虽然我这次查看任务的切换情况,但另一个任务没有中断 SPI 任务(通信)。)

    此致、

    Sho

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

    您好 Sho、

    感谢您的测试。  您还可以仅测试一次打开 SPI、而不重复打开/关闭 SPI。

    由于 TI 无法复制这种行为、因此可以选择以下方案:

    • 通过 向 BLE 示例添加 spiconController 来重现问题、其中包含导致问题存在的任何变化、然后发送给我们工程以供进一步审查
    • 发送演示行为的最小特征应用程序项目
    • 调试  SPILPF3DMA.c/UDMALPF3.c 并报告发现结果
    • 在工程中使用 SPI 轮询
    • 使用具有 16 字节填充的 SPI DMA

    此致、
    Ryan

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

    我对您的  SPILPF3DMA.c 文件感到惊讶、因为它未指示 包含 UDMA_01 勘误表的 SimpleLink F3 SDK v9.10 权变措施。  您能否使用 F3 SDK v9.10 或 v9.11 中的 SPILPF3DMA.c 源确认您的发现?

    此致、
    Ryan

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

    您好、Ryan

    我将分享使用 F3 SDK v9.10 中的 SPILPF3DMA.c 源代码进行研究的结果。

    当我使用 SDK v9.10 检查 SPILPF3DMA 的运行时、
    SPILPF3DMA_hwiFxn 在 IAR Debug 中执行了两到三次、
    但第二次在独立(片上)模式下未执行 SPILPF3DMA_hwiFxn。

    当我使用 SDK v8.30 检查 SPILPF3DMA 的运行情况时、
    即使在独立(片上)模式下、也第二次执行 SPILPF3DMA_hwiFxn。

    此致、

    Sho

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

    嗨、Sho、

    您能否提供一个项目、我可以从中复制该项目?  如果您担心可访问性,我们可以使用私人信使。

    此致、
    Ryan

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

    您好、Ryan

    现在、我将分享我的其他调查的结果。
    使用具有 16 字节填充的 SPI_DMA
    将数据传输大小从 51 字节更改为 64 字节→64 字节在调试模式下发送、在片上发送 48 字节
    我还在片上执行期间检查了寄存器值
    我确认在 DMACH0 (1) SEL(不是 uart1txtrg)中使用了 spi0rxtrg。

    请等待项目的片刻

    此致、

    Sho

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

    我目前正在准备发送我的项目。
    发送整个项目会很困难、因此我想只发送其中的一部分。
    (我考虑删除 BLE 功能并仅发送 SPI 功能。)
    “那有什么问题吗?

    此致、

    Sho

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

    最好使用轻量级且仍能证明问题的工程。

    谢谢、
    Ryan