由于国庆节假期,帖子审批以及工程师回复将会有所延迟,敬请谅解

CC2640R2F: 2640r2 sdk example “adcsinglechannel ”初始化代码

Part Number: CC2640R2F
Other Parts Discussed in Thread: CC2642R, LAUNCHXL-CC2640R2, CC2640, CC2640R2L

导入工程“adcsinglechannel ”编译,DEBUG都没有问题,但是代码没有看太明白。

从板载资源来看,ADC0是从DIO23脚输入,ADC1是从DIO24脚输入.

进入main()以后首先执行Board_init();

Board_init()又调用CC2640R2_LAUNCHXL_initGeneral();

CC2640R2_LAUNCHXL_initGeneral();中先执行Power_init();再执行PIN_init();

问题1:Power_init()起什么作用?初始化跟电源相关的资源?但其中似乎又有对时钟的处理。如果在应用程序中没有涉及到电源管理是否可以直接调用不用修改内容?

 *  ======== Power_init ========
 */
int_fast16_t Power_init()
{
    ClockP_Params clockParams;
    uint32_t ccfgLfClkSrc;
    uint32_t timeout;

    /* if this function has already been called, just return */
    if (PowerCC26XX_module.initialized) {
        return (Power_SOK);
    }

#if defined(DeviceFamily_CC26X0R2)
    /* check to see if the JTAG_PD is on, meaning the emulator was attached during boot and */
    /* that the user is in an active debug session */
    PowerCC26XX_module.emulatorAttached = (HWREG(AON_WUC_BASE + AON_WUC_O_PWRSTAT) & AON_WUC_PWRSTAT_JTAG_PD_ON) == AON_WUC_PWRSTAT_JTAG_PD_ON;
#endif

    /* set module state field 'initialized' to true */
    PowerCC26XX_module.initialized = true;

    /* set the module state enablePolicy field */
    PowerCC26XX_module.enablePolicy = PowerCC26XX_config.enablePolicy;

    /* copy the Power policy function to module state */
    PowerCC26XX_module.policyFxn = PowerCC26XX_config.policyFxn;

    /* construct the Clock object for scheduling of wakeups */
    /* initiated and started by the power policy */
    ClockP_Params_init(&clockParams);
    clockParams.period = 0;
    clockParams.startFlag = false;
    clockParams.arg = 0;
    ClockP_construct(&PowerCC26XX_module.clockObj, &emptyClockFunc,
        0, &clockParams);

    /* construct the Clock object for XOSC_HF switching */
    /* initiated and started by Power module when activating XOSC_HF */
    ClockP_construct(&PowerCC26XX_module.xoscClockObj, &switchXOSCHFclockFunc,
        0, &clockParams);

    /* construct the Clock object for disabling LF clock quailifiers */
    /* one shot, auto start, first expires at 100 msec */
    ClockP_construct(&PowerCC26XX_module.lfClockObj, &lfClockReadyCallback,
        0, &clockParams);

    (*(PowerCC26XX_config.calibrateFxn))(PowerCC26XX_SETUP_CALIBRATE);

    DRIVERLIB_ASSERT_CURR_RELEASE();

问题2:PIN_init()中的BoardGpioInitTable没有提及ADC0(DIO23)和ADC1(DIO24),它们的初始化代码在哪里?

const PIN_Config BoardGpioInitTable[] = {

    CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
    CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
    CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
    CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
    CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select */
    CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,                                              /* UART RX via debugger back channel */
    CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,                         /* UART TX via debugger back channel */
    CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
    CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master in - slave out */
    CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */

    PIN_TERMINATE
};

问题3:

这里定义了SPI0使用的管脚

这里将这几个管脚初始化

但IOID_8~IOID_11是如何映射到SPI0外设的?

问题4:看资料介绍同一PIN引脚是可以映射多种功能的,如数字IO、模拟输入等,有没有如何映射的说明?

  • 您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!

  • 您好,

    1)POWER_INIT 是一个需要在启动时调用的函数,用于初始化Power Manager状态。不应修改。https://dev.ti.com/tirex/explore/node?node=ABuWLDmlwjp5FCIoK75nTA__BSEc4rl__LATEST

    2)Board.h 内的 Board_ADCx 被定义为 CC2640R2_LAUNCHXL_ADCx,存在于 CC2640R2_LAUNCHXL.c/h 文件中的 CC2640R2_LAUNCHXL_ADCName 和 ADC_CONFIG 表中,最后映射到 CC2640R2_LAUNCHXL_DIO2x_ANALOG IN ADC26xxHWATTRH。

    3)spiCC26XXDMAHWAttrs来自 CC2640R2_LAUNCHXL.c

    4)不建议在运行时对引脚进行多路复用以实现模拟和数字功能。提供的文件中支持引脚配置。

  • 非常感谢您的帮助,大致流程搞清楚了,程序中很多初始化代码都要用户自己编写,有没有可以自行配置初始化代码的软件?类似于ST的CUBEMX,让用户把精力集中在自己的应用中而不是花大量的时间来写初始化代码,效率太低了。TI是非常优秀的公司,如何能够在这方面有改进,相信有更多的工程师愿意使用TI的MCU。

  • 程序中很多初始化代码都要用户自己编写,有没有可以自行配置初始化代码的软件?

    我们向工程师确认下哈。

  • 您好,

    您可以 migrate到 CC2642R 并使用 SysConfig。 

  • 如何把一个IO配置为输出?SDK提供的示例代码有两个函数PIN_Config 和GPIO_PinConfig,配置了半天,不起作用,根本无法操作引脚。这两个函数到底怎么用?能否提供一个示例代码将DIO0配置为GPIO输出?

  • 我们跟进给工程师看下吧。

  • BoardGpioInitTable 在 CC2640R2_LAUNCHXL.c 中,请确保 IOID_0尚未在 CC2640R2_LAUNCHXL.h 中的其他位置保留。

  • 我是在SDK提供的DEMO项目“empty”中来配置DIO0的:

    BoardGpioInitTable的配置如下:

    const PIN_Config BoardGpioInitTable[] = {
    
        CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select */
        CC2640R2_LAUNCHXL_DIO0 |PIN_GPIO_OUTPUT_EN | PIN_PUSHPULL ,
        CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,                                              /* UART RX via debugger back channel */
        CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,                         /* UART TX via debugger back channel */
        CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
        CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master in - slave out */
        CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */
    
        PIN_TERMINATE
    };

    其中增加了DIO0的初始化:

        CC2640R2_LAUNCHXL_DIO0 |PIN_GPIO_OUTPUT_EN | PIN_PUSHPULL ,

    在empty.c中增加下列代码:

    GPIO_setConfig(Board_DIO0 , GPIO_CFG_OUT_STD );
    GPIO_write(Board_DIO0, 0);
    GPIO_write(Board_DIO0, 1);
    GPIO_write(Board_DIO0, 0);

    但用逻辑分析仪测试DIO0并没有发生电平变化。

  • 请确保 IOID_0尚未在 CC2640R2_LAUNCHXL.h 中的其他位置保留。

    至于IOID_0是否在其他地方保留我不能确认,但看代码似乎没有使用。

  • 总的说来,是对GPIO的初始化流程不清楚,SDK虽然提供了代码,但是仿照SDK提供的代码编写的程序没有正常运行:DIO0的初始化和操作是仿照Board_GPIO_LED0来编写的,但Board_GPIO_LED0可以正常工作,而DIO0不行。

  • 我们向工程师确认下。

  • 您好,

    您有没有在其他 GPIO 函数之前调用GPIO_init? 可能也是忽略了添加正确的 gpioPinConfigs 条目。 您应该考虑将 PIN_GPIO_LOW 添加到 BoardGpioInitTable 的 CC2640R2_LAUNCHXL_DIO0条目,并在 GPIO_setConfig 参数中设置 GPIO_CFG_OUT_LOW。 还应尝试在 GPIO_Writes 之间延迟,尝试其他未保留的 Dios 以查看行为是否有任何更改,并确认硬件不会短接。 

  • void *mainThread(void *arg0)
    {
        /* 1 second delay */
        uint32_t time = 1;
    
        /* Call driver init functions */
        GPIO_init();
        // I2C_init();
        SPI_init();
         UART_init();

    首先,GPIO_init肯定是调用了。

    const PIN_Config BoardGpioInitTable[] = {
    
        CC2640R2_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,       /* LED initially off */
        CC2640R2_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        CC2640R2_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,          /* Button is active low */
        CC2640R2_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,  /* External flash chip select */
        CC2640R2_LAUNCHXL_DIO0 |PIN_GPIO_OUTPUT_EN | PIN_PUSHPULL| PIN_GPIO_LOW ,
        CC2640R2_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,                                              /* UART RX via debugger back channel */
        CC2640R2_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,                         /* UART TX via debugger back channel */
        CC2640R2_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master out - slave in */
        CC2640R2_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,                                            /* SPI master in - slave out */
        CC2640R2_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,                                             /* SPI clock */
    
        PIN_TERMINATE
    };

    将 PIN_GPIO_LOW 添加到 BoardGpioInitTable 的 CC2640R2_LAUNCHXL_DIO0条目。

        GPIO_setConfig(Board_GPIO_LED0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    在 GPIO_setConfig 参数中设置 GPIO_CFG_OUT_LOW。

    硬件肯定没有问题,使用的LAUNCHXL-CC2640R2。

  • 仍然无法控制DIO0

  • 非常感谢您提供的回复,但似乎不能解决我的问题,这个IO配置的问题应该是一个非常简单的问题,10多天过去了,还在困扰我,在其他公司的MCU使用中似乎没有遇到过这样的问题,从来没有问过这些公司的工程师。他们的IO配置非常简单明了,一看就懂,CC2640的IO配置到底要操作哪些函数?在前面的帖子中我已经说了提供一个简单的DEMO将IO0配置为输出,但您给的回复没有确定性,试试这个、试试那个...

  • 我们目前没有可以支持该器件的工程师,是升级到英文论坛让国外工程师帮忙查看的哈,您可以看下升级的帖子,或者您也可以直接在英文帖子中跟进,这样方便解决您的问题:

    e2e.ti.com/.../cc2640r2f-sdk-example-echosinglechannel-initialization-code

  • 您好,

    不知道英文论坛的答复是否对您有帮助?我们会先将该贴关闭,如您之后需要其他技术支持请随时联系我们。

  • Cherry Zhou

    您好

    非常感谢您的帮助

    问题已经得到解决,但是解决问题的方法是我没想到的,超出了一般工程师的思路,如果没有FAE的帮助,很多工程师估计都会遇到这个问题,后面有时间我会整理发在论坛里,让其他的工程师可以借鉴。

    CC2640R2L是性价比非常高的产品,TI 应该在代码的易用性上再提高一些,这样会有更多的工程师来使用它。

  • 感谢您对TI的关注和支持!如您后续需要其他技术支持,欢迎您随时来论坛参与讨论!