TI中文支持网
TI专业的中文技术问题搜集分享网站

CC1310的IO口用PIN_open()方式驱动时,能否在程序运行时单独配置IO口的输入输出方向?????

专家您好:

     因项目需求,要控制一个I2C接口时钟芯片,I2C驱动是模似的,之前在stm32下用的功能是OK的,现在想用cc1310的IO模似使用。

1.用IO04 配置成普通IO模似SCL,IO05配置成普通IO模似SDA,

2.IO04配置的是推挽输出,IO05配置的是开漏输出,用示波器看IO05的波形有毛刺,换了其它多个IO都有毛刺(幅值0.5V)通信失败没有收到从机应答。

因此,得出cc1310的开漏输出不可行。

3.把IO05配置成推挽输出,用示波器查看,没有毛刺

4.*****IO05如果配置成推挽输出,就需要在驱动中配置成输入,问题:::怎么使一个IO口,单独配置成输入或输出模式呢???????求解答,用的是pin驱动。

     

Kevin Qiu1:

CC1310有I2C,可以直接使用

配置输入输出模式用PIN_INPUT_EN 、PIN_GPIO_OUTPUT_EN

/**=============================== PIN ===============================*/
#include <ti/drivers/PIN.h>
#include <ti/drivers/pin/PINCC26XX.h>const PIN_Config BoardGpioInitTable[] = {CC1310_LAUNCHXL_PIN_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,/* LED initially off*/CC1310_LAUNCHXL_PIN_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,/* LED initially off*/CC1310_LAUNCHXL_PIN_BTN1 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,/* Button is active low*/CC1310_LAUNCHXL_PIN_BTN2 | PIN_INPUT_EN | PIN_PULLUP | PIN_IRQ_BOTHEDGES | PIN_HYSTERESIS,/* Button is active low*/CC1310_LAUNCHXL_SPI_FLASH_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MIN,/* External flash chip select */CC1310_LAUNCHXL_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN,/* UART RX via debugger back channel */CC1310_LAUNCHXL_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,/* UART TX via debugger back channel */CC1310_LAUNCHXL_SPI0_MOSI | PIN_INPUT_EN | PIN_PULLDOWN,/* SPI master out - slave in */CC1310_LAUNCHXL_SPI0_MISO | PIN_INPUT_EN | PIN_PULLDOWN,/* SPI master in - slave out */CC1310_LAUNCHXL_SPI0_CLK | PIN_INPUT_EN | PIN_PULLDOWN,/* SPI clock */PIN_TERMINATE
};

fghj dfghjk:

回复 Kevin Qiu1:

在I2C读写过程中写的时候,SDA需要输出,读的时候需要把IO改成输入。在读写过程中怎么独立配置IO的方向。

就像stm32这样://IO
#define SDA_IN(){GPIOC->MODER&=~(3<<(5*2));GPIOC->MODER|=0<<5*2;} //
#define SDA_OUT() {GPIOC->MODER&=~(3<<(5*2));GPIOC->MODER|=1<<5*2;} //

fghj dfghjk:

回复 Kevin Qiu1:

另外I2C自带硬件驱动,需要在研究研究。后续也会遇到多个I2C器件,也需要IO模似

fghj dfghjk:

回复 Kevin Qiu1:

//IO方向设置mod lhj 200629这样也不正确
#define SDA_IN()PIN_setOutputEnable(ledPinHandle,Board_SDA_DIO5,0)//{GPIOC->MODER&=~(3<<(5*2));GPIOC->MODER|=0<<5*2;} //PB9输入模式
#define SDA_OUT()PIN_setOutputEnable(ledPinHandle,Board_SDA_DIO5,1) //{GPIOC->MODER&=~(3<<(5*2));GPIOC->MODER|=1<<5*2;} //PB9输出模式

Kevin Qiu1:

回复 fghj dfghjk:

可以用Sensor Controller Studio模拟I2C,看下help中的serial interfaces I2C部分
另外可以参考下面帖子中I2C的实现方法
e2e.ti.com/…/3347120

e2e.ti.com/…/934110

fghj dfghjk:

回复 Kevin Qiu1:

那就是用M3核控制IO来模似I2C,CC1310是没法实现了嘛???

Kevin Qiu1:

回复 fghj dfghjk:

Sensor Contrller 是独立系统CPU 的一个16位控制器,不是CM3。
一个I2C上可以挂多个从机,可以用硬件I2C,也可以用Sensor Controller Studio模拟I2C
通过GPIO模拟I2C也可以,不过没有例程,需要自己实现
上面控制IO输入输出模式的可以通过宏定义实现
#define SDA_OUT (GPIO_setConfig(SDA_PIN, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW))
#define SDA_IN(GPIO_setConfig(SDA_PIN, GPIO_CFG_INPUT))

fghj dfghjk:

回复 Kevin Qiu1:

我现在用/** Initial LED pin configuration table*- LEDs Board_PIN_LED0 is on.*- LEDs Board_PIN_LED1 is off.*/
PIN_Config ledPinTable[] = {Board_PIN_LED0 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MAX,Board_PIN_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW| PIN_PUSHPULL | PIN_DRVSTR_MAX,Board_SCL_DIO4 | PIN_GPIO_OUTPUT_EN| PIN_GPIO_HIGH | PIN_PUSHPULL | PIN_DRVSTR_MED,//add lhjBoard_SDA_DIO5 | PIN_GPIO_OUTPUT_EN| PIN_GPIO_HIGH | PIN_OPENDRAIN | PIN_DRVSTR_MED, //PIN_OPENDRAINPIN_TERMINATE
};

驱动IO,

GPIO的话,是另一套驱去IO的底层驱动吧。这两种方法能一起用嘛??或是混合着用嘛???

fghj dfghjk:

回复 Kevin Qiu1:

您好:我用例程自带的TMP116,来驱动我的时钟芯片pcf8563,在例程中,没有看明白,I2C从机的地址,寄存器地址,寄存器值,是怎么读写的啊。这个流程没看明白。我贴一下带代码,能否帮我说明一下,万分感谢!!!!

1.读写是怎么区分的最,怎么向一个寄存器中写一个值,然后在读取出来啊。??????不明白

/* Create I2C for usage */I2C_Params_init(&i2cParams);i2cParams.bitRate = I2C_100kHz;i2c = I2C_open(Board_I2C_TMP, &i2cParams);if (i2c == NULL) {Display_printf(display, 0, 0, "Error Initializing I2C\n");while (1);}else {Display_printf(display, 0, 0, "I2C Initialized!\n");}
/* Common I2C transaction setup */i2cTransaction.writeBuf= txBuffer;i2cTransaction.writeCount = 1;i2cTransaction.readBuf= rxBuffer;i2cTransaction.readCount= 2;
/** Determine which I2C sensor is present.* We will prefer sensors in this order: TMP116 (on BoosterPacks),* TMP116 (on-board CC32XX LaunchPads), and last TMP006* (on older CC32XX LaunchPads).*//* Try TMP116 values */txBuffer[0] = TMP116_REG;//PCF8563_Address_Timer_VAL//txBuffer[1] = 0x44;//向对应的寄存器写一个值,读取出是否一至,来验证I2C通信是否OKi2cTransaction.slaveAddress = TMP116_BP_ADDR;//PCF8563_Write;//TMP116_BP_ADDR;//写地址if (!I2C_transfer(i2c, &i2cTransaction)) {/* Not BP TMP116, try LP TMP116 */i2cTransaction.slaveAddress = TMP116_LP_ADDR;//PCF8563_Read;//读地址if (!I2C_transfer(i2c, &i2cTransaction)) {/* Not a TMP116 try TMP006*/txBuffer[0] = TMP006_REG;i2cTransaction.slaveAddress = TMP006_ADDR;if (!I2C_transfer(i2c, &i2cTransaction)) {/* Could not resolve a sensor, error */Display_printf(display, 0, 0, "Error. No TMP sensor found!");while(1);}}}

Kevin Qiu1:

回复 fghj dfghjk:

看下C:/ti/simplelink_cc13x0_sdk_4_10_02_04/docs/tidrivers/doxygen/html/_i2_c_8h.html注释说明很详细
关于I2C原理、寄存器请看手册21章:www.ti.com.cn/…/swcu117i.pdf

赞(0)
未经允许不得转载:TI中文支持网 » CC1310的IO口用PIN_open()方式驱动时,能否在程序运行时单独配置IO口的输入输出方向?????
分享到: 更多 (0)