在使用Ti CC1310
的硬件I2C
与外部设备进行通信的时候,无法长时间稳定运行,尤其是平时的测试开发板,使用杜邦线连接的情况下。
同等情况下的SPI
总线,一般不会发生此类问题,因此怀疑是GPIO
管脚的驱动能力不足导致的。
我的工程是通过简单修改Ti CC1310 SDK
自带的Code Composer Studio
的例子工程而创建的,因此存在已经进行过默认配置的CC1310_LAUNCHXL.c
,CC1310_LAUNCHXL.h
这两个文件。用Code Composer Studio
完全重新创建的工程,缺乏必要的默认配置。因此,我们还是建议根据Ti CC1310 SDK
自带的例子进行修改,而不是完全从头创建工程。
我们研究I2C
初始化GPIO
管脚的代码在simplelink_cc13x0_sdk_2_30_00_20/source/ti/drivers/i2c/I2CCC26XX.c
,相关的代码如下:
从上面的代码中,我们发现GPIO
管脚的驱动能力没有设置,根据CC13x0, CC26x0 SimpleLink ™ Wireless MCU Technical Reference Manual中的介绍,我们发现,如果不设置,默认情况下是PIN_DRVSTR_MIN(< (*) Lowest drive strength)
。这个驱动模式下,最省电,但是当有干扰存在的情况下,最容易导致出现错误。
查找Ti CC1310
提供的I2C
驱动程序,没有找到可以设置管脚驱动能力的接口。
网上有人通过直接修改Ti CC1310
提供的I2C
驱动程序,也就是simplelink_cc13x0_sdk_2_30_00_20/source/ti/drivers/i2c/I2CCC26XX.c
里的初始化代码(见上面的代码段)增加驱动能力属性来实现这个功能。
但是这种修改方式不推荐,修改的侵入太强。
从GPIO
的操作函数中,我们找到如下函数:
我们尝试从上层找到I2C
驱动使用的GPIO
管脚,然后调整其驱动能力。
从上面我们看到I2C
句柄的.object
指针指向了I2CCC26XX_Object
类型的结构体,这个结构体在simplelink_cc13x0_sdk_2_30_00_20/source/ti/drivers/i2c/I2CCC26XX.c
里的static int I2CCC26XX_initIO(I2C_Handle handle, void *pinCfg)
函数中被初始化,这个结构体记录了详细的GPIO
操作句柄。
因此我们可以使用如下的代码对GPIO
管脚的驱动能力进行调整: