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.

[参考译文] CC1312R:自SDK 5.30 以来,SPI和UART TI驱动程序不再配置GPIO

Guru**** 2546020 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1102531/cc1312r-spi-and-uart-ti-driver-does-not-configure-gpios-any-more-since-sdk-5-30

部件号:CC1312R
Thread:sysconfig中讨论的其它部件

您好,

升级到SDK 6.10 时,我们注意到某些TI驱动程序不再像以前那样配置GPIO。 因此,为了使其正常工作,我们的应用程序必须首先使用GPIO _setConfig配置所需的GPIO,然后才能调用TI驱动程序打开功能,否则将无法正常工作。

这至少适用于以下驱动程序

  • /source/ti/drivers/SPI/SPICC26X2DMA.c
  • /source/ti/drivers/UART/UARTCC26XX.c
  • /source/ti/drivers/NVS/NVSSPI25X.c   (因为它使用SPI驱动程序)

SDK 6.10 中的其他TI驱动程序确实使用GPIO _setConfig本身来处理GPIO配置,如I2C,PWM,因此不同驱动程序之间似乎有点不一致。 在较早的SDK (在SDK 5.30 之前)中,SPI和UART驱动程序还负责GPIO配置,因此此更改已在SDK 5.30 中引入。

这是否是TI驱动器行为的有意更改?

巴西,

Johannes Kjällquist ñ o

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

    您是否仅在从以前的SDK移植时才会看到此问题,或者在最新的SDK中也会看到此问题?  

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

    我不确定具体的答案,但TI驱动器行为的这一变化是在SDK 5.30 中引入的,当时正在移除引脚驱动器。 而且,在6.10 与SDK 5.30 之间的TI驱动程序中,我看不到有关GPIO配置的任何更改。

    让我举一个例子,让大家更清楚地了解这一点。 以下代码来自SDK 5.30 中的TI驱动程序。

    驱动程序/source/ti/drivers/i2c/I2CCC26XX.c的初始化功能  调用gPIO_setConfig,从而配置引脚。

    static int I2CCC26XX_initIO(I2C_Handle handle, void *pinCfg) {
        I2CCC26XX_Object           *object;
        I2CCC26XX_HWAttrsV1 const  *hwAttrs;
    
        /* Get the pointer to the object and hwAttrs */
        object = handle->object;
        hwAttrs = handle->hwAttrs;
    
        /* If the pinCfg pointer is NULL, use hwAttrs pins */
        if (pinCfg == NULL) {
            object->sdaPin = hwAttrs->sdaPin;
            object->sclPin = hwAttrs->sclPin;
        } else {
            object->sdaPin = ((I2CCC26XX_I2CPinCfg *)pinCfg)->pinSDA;
            object->sclPin = ((I2CCC26XX_I2CPinCfg *)pinCfg)->pinSCL;
        }
    
        /* Configure I2C pins SDA and SCL and set their muxes */
        GPIO_setConfig(object->sdaPin, GPIO_CFG_OUT_OD_PU);
        GPIO_setMux(object->sdaPin, hwAttrs->sdaPinMux);
    
        GPIO_setConfig(object->sclPin, GPIO_CFG_OUT_OD_PU);
        GPIO_setMux(object->sclPin, hwAttrs->sclPinMux);
    
        return I2C_STATUS_SUCCESS;
    }
    

    TI SPI驱动程序/source/ti/drivers/SPI/SPICC26X2DMA.c中的相应函数不调用GPIO _setConfig,而只调用GPIO _setMux函数,因此不配置引脚。 这就是为什么我们需要在调用SPI驱动程序之前在应用程序中执行此操作的原因

    static void initIO(SPI_Handle handle)
    {
        SPICC26X2DMA_Object        *object = handle->object;
        SPICC26X2DMA_HWAttrs const *hwAttrs = handle->hwAttrs;
    
        if (object->mode == SPI_SLAVE) {
            GPIO_setMux(hwAttrs->mosiPin, hwAttrs->rxPinMux);
            GPIO_setMux(hwAttrs->misoPin, hwAttrs->txPinMux);
            GPIO_setMux(hwAttrs->clkPin, hwAttrs->clkPinMux);
    
            /* Configure CSN callback for optional RETURN_PARTIAL slave mode */
            if (object->csnPin != GPIO_INVALID_INDEX) {
                GPIO_setMux(object->csnPin, hwAttrs->csnPinMux);
                GPIO_setCallback(object->csnPin, csnCallback);
                GPIO_setUserArg(object->csnPin, handle);
            }
        }
        else {
            GPIO_setMux(hwAttrs->mosiPin, hwAttrs->txPinMux);
            GPIO_setMux(hwAttrs->misoPin, hwAttrs->rxPinMux);
            GPIO_setMux(hwAttrs->clkPin, hwAttrs->clkPinMux);
    
            /* Mux CS unless it is software-controlled */
            if (object->csnPin != GPIO_INVALID_INDEX) {
                GPIO_setMux(object->csnPin, hwAttrs->csnPinMux);
            }
        }
    }
    

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

    Hei Johannes,

    实际上,驱动程序特定的GPIO配置现在是通过我们的sysconfig工具生成的,自5.30 以来一直如此。 如果从最新的SDK加载SPI示例(例如spimaster),您将看到此引脚配置是在Board_init()-> gPIO_init()中完成的。 GPIO初始化随后会考虑通过sysconfig生成的GPIO配置表(gpioPinConfigs)。 (请参阅代码片段)。

    /*
     *  ======== gpioPinConfigs ========
     *  Array of Pin configurations
     */
    GPIO_PinConfig gpioPinConfigs[31] = {
        0, /* Pin is not available on this device */
        0, /* Pin is not available on this device */
        0, /* Pin is not available on this device */
        0, /* Pin is not available on this device */
        0, /* Pin is not available on this device */
        GPIO_CFG_NO_DIR, /* DIO_5 */
        GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_STR_MED | GPIO_CFG_OUT_LOW, /* CONFIG_GPIO_LED_0 */
        GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_STR_MED | GPIO_CFG_OUT_LOW, /* CONFIG_GPIO_LED_1 */
        /* Owned by CONFIG_SPI_SLAVE as MISO */
        GPIO_CFG_INPUT_INTERNAL | GPIO_CFG_IN_INT_NONE | GPIO_CFG_PULL_NONE_INTERNAL, /* CONFIG_GPIO_SPI_SLAVE_MISO */
        /* Owned by CONFIG_SPI_SLAVE as MOSI */
        GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_STR_MED | GPIO_CFG_OUT_LOW, /* CONFIG_GPIO_SPI_SLAVE_MOSI */
        /* Owned by CONFIG_SPI_SLAVE as SCLK */
        GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_STR_MED | GPIO_CFG_OUT_LOW, /* CONFIG_GPIO_SPI_SLAVE_SCLK */
        GPIO_CFG_NO_DIR, /* DIO_11 */
        /* Owned by CONFIG_UART2_0 as RX */
        GPIO_CFG_INPUT_INTERNAL | GPIO_CFG_IN_INT_NONE | GPIO_CFG_PULL_DOWN_INTERNAL, /* CONFIG_GPIO_UART2_0_RX */
        /* Owned by CONFIG_UART2_0 as TX */
        GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_STR_MED | GPIO_CFG_OUT_HIGH, /* CONFIG_GPIO_UART2_0_TX */
        GPIO_CFG_NO_DIR, /* DIO_14 */
        GPIO_CFG_INPUT_INTERNAL | GPIO_CFG_IN_INT_NONE | GPIO_CFG_PULL_NONE_INTERNAL, /* CONFIG_SPI_MASTER_READY */
        GPIO_CFG_NO_DIR, /* DIO_16 */
        GPIO_CFG_NO_DIR, /* DIO_17 */
        GPIO_CFG_NO_DIR, /* DIO_18 */
        GPIO_CFG_NO_DIR, /* DIO_19 */
        /* Owned by CONFIG_SPI_SLAVE as SS */
        GPIO_CFG_OUTPUT_INTERNAL | GPIO_CFG_OUT_STR_MED | GPIO_CFG_OUT_HIGH, /* CONFIG_GPIO_SPI_SLAVE_SS */
        GPIO_CFG_INPUT_INTERNAL | GPIO_CFG_IN_INT_NONE | GPIO_CFG_PULL_NONE_INTERNAL, /* CONFIG_SPI_SLAVE_READY */
        GPIO_CFG_NO_DIR, /* DIO_22 */
        GPIO_CFG_NO_DIR, /* DIO_23 */
        GPIO_CFG_NO_DIR, /* DIO_24 */
        GPIO_CFG_NO_DIR, /* DIO_25 */
        GPIO_CFG_NO_DIR, /* DIO_26 */
        GPIO_CFG_NO_DIR, /* DIO_27 */
        GPIO_CFG_NO_DIR, /* DIO_28 */
        GPIO_CFG_NO_DIR, /* DIO_29 */
        GPIO_CFG_NO_DIR, /* DIO_30 */
    };

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

    但是,我已经与研发团队进行了检查,SPI驱动程序(与输入缓冲区相关)存在一个错误,您必须使用gPIO_setConfig作为解决方法。 这也将在6.30 SDK中修复。 再次感谢您的报告。

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

    您好,Arthur:

    好的,我只是觉得有些驱动程序做gPIO_CONFIG而有些驱动程序不做有点奇怪。 这似乎有点不一致。

    在本例中,我们不能将sysconfig工具与预编译的gpioPinConfigs表一起使用,因为我们必须在运行时动态配置GPIO。 因此,根据外部环境,我们将在启动后初始化不同用途的GPIO。

    但我的理解是,TI驱动程序从现在起(SDK 5.30 )将不再配置GPIO。 它是通过sysconfig和gPIO_init分别完成的,如果不使用(或不能) sysconfig,则必须从应用程序处理GPIO配置。 是这样吗?

    巴西,

    Johannes

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

    您好,Johannes:

    你是对的。 到目前为止,根据驱动程序的不同,如果不使用sysconfig,您可能必须在应用程序中自行处理GPIO配置。 随着我们不断改进SDK,这种情况将来可能会发生变化。