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.

[参考译文] CC2652RB:如何从空示例中实现I2C从属设备

Guru**** 2540720 points
Other Parts Discussed in Thread: CC2652RB

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1088655/cc2652rb-how-to-realize-i2c-slave-from-empty-example

部件号:CC2652RB

您好:

我使用 的是带LP_CC2652RB的simplelink_cc13x2_26x2_SDK_4_30_00_54

我想实现一个I2C从属项目,但是SDK中没有例子。 所以我试着用dreverlib来做。

下面是我的代码部分,我在empty's mainThread()中调用init_i2c()

#include <i2c.h>
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26XX.h>
#include <ti/drivers/PIN.h>
#include <ti/drivers/pin/PINCC26XX.h>

#define I2C0_SCL0          IOID_4
#define I2C0_SDA0          IOID_5

void init_i2c(void)
{
    //PRCMPowerDomainOn(PRCM_DOMAIN_PERIPH);
    
    Power_setDependency(PowerCC26XX_PERIPH_I2C0);
    
    //PRCMLoadSet();
    //PRCMPeripheralRunEnable(PRCM_PERIPH_I2C0); // Enable I2C module
    //PRCMPeripheralRunEnable(PRCM_PERIPH_GPIO);
    //PRCMLoadSet();

    I2CSlaveInit(I2C0_BASE, 0x53);
    I2CIntRegister(I2C0_BASE, i2c_callback);
    I2CSlaveIntEnable(I2C0_BASE, I2C_SLAVE_INT_START | I2C_SLAVE_INT_STOP | I2C_SLAVE_INT_DATA);
}

void i2c_callback(void)
{
    uint32_t val;
    uint32_t status = I2CSlaveIntStatus(I2C0_BASE, true);
    I2CSlaveIntClear(I2C0_BASE, status);

    if(status & I2C_SLAVE_INT_DATA)
    {
        status = I2CSlaveStatus(I2C0_BASE);

        if(status & I2C_SLAVE_ACT_RREQ)
        {
            val = I2CSlaveDataGet(I2C0_BASE);
            GPIO_toggle(CONFIG_GPIO_LED_0);
        }
    }
}

但是,当我运行i2copt3001示例测试I2C从属项目时,red_led剂量不闪烁(隐式I2C获取一些数据),但green_led工作正常(隐式mainThread()工作正常)。

因此,我在此寻求您的帮助:

1.如何通过CC2652RB实现I2C从属设备,是否可以参考一些文档?

2.在我上面的代码中,有一些注释行,如PRCMxxx(),我找不到它们的定义,它们在哪里?

3.实际上从我的代码来看,我不是将GPIO连接到I2C,因为我不知道如何操作。 能否向我展示如何映射SCL和SDA函数的特定GPIO?

非常感谢您的帮助!

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

    您好,

    我尝试了一些代码,如下所示,似乎效果很好。

    #include <i2c.h>
    #include <prcm.h>
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC26XX.h>
    #include <ti/drivers/PIN.h>
    #include <ti/drivers/pin/PINCC26XX.h>
    
    #define I2C0_SCL0          IOID_4
    #define I2C0_SDA0          IOID_5
    
    void init_i2c(void);
    void i2c_callback(void);
    
    PIN_State i2cPinState;      // Must reside in persistent memory
    
    void init_i2c(void)
    {
        PRCMPowerDomainOn(PRCM_DOMAIN_PERIPH);
    
        // Set Power dependecies & constraints
        Power_setDependency(PowerCC26XX_PERIPH_I2C0);
        Power_setDependency(PowerCC26XX_PERIPH_GPIO);
    
        // Set constraints for Standby, powerdown and idle mode
        Power_setConstraint(PowerCC26XX_SB_DISALLOW);
        Power_setConstraint(PowerCC26XX_IDLE_PD_DISALLOW);
    
        PRCMLoadSet();
        PRCMPeripheralRunEnable(PRCM_PERIPH_I2C0); // Enable I2C module
        PRCMPeripheralRunEnable(PRCM_PERIPH_GPIO);
        PRCMLoadSet();
    
        PIN_Config i2cPinTable[] = {
            I2C0_SDA0 | PIN_INPUT_EN | PIN_PULLUP | PIN_OPENDRAIN,
            I2C0_SCL0 | PIN_INPUT_EN | PIN_PULLUP | PIN_OPENDRAIN,
            PIN_TERMINATE
        };
    
        PIN_Handle i2cPinHandle = PIN_open(&i2cPinState, i2cPinTable);
        if (    (PIN_SUCCESS == PINCC26XX_setMux(i2cPinHandle, I2C0_SCL0, IOC_PORT_MCU_I2C_MSSCL)) &&
                (PIN_SUCCESS == PINCC26XX_setMux(i2cPinHandle, I2C0_SDA0, IOC_PORT_MCU_I2C_MSSDA))      )
        {
            DBG_INFO("I2C PIN set succ.");
        } else {
            DBG_INFO("I2C PIN set failed.");
        }
    
        I2CSlaveInit(I2C0_BASE, 0x53);
    
        I2CIntRegister(I2C0_BASE, i2c_callback);
        I2CSlaveIntEnable(I2C0_BASE, I2C_SLAVE_INT_START | I2C_SLAVE_INT_STOP | I2C_SLAVE_INT_DATA);
    }
    
    void i2c_callback(void)
    {
        uint32_t val;
        uint32_t status = I2CSlaveIntStatus(I2C0_BASE, true);
        I2CSlaveIntClear(I2C0_BASE, status);
    
        if(status & I2C_SLAVE_INT_DATA)
        {
            status = I2CSlaveStatus(I2C0_BASE);
    
            if(status & I2C_SLAVE_ACT_RREQ)
            {
                val = I2CSlaveDataGet(I2C0_BASE);
                GPIO_toggle(CONFIG_GPIO_LED_0);
            }
        }
    }

    顺便提一下,我还在属性中添加了以下包括路径:

    PRCMxxx() 位于 simplelink_cc13x2_26x2_SDK_4_30_00_54\sources\ti\devices\cc13x2_cc26x2\driverlib中

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

    您好junde,

    感谢您为您的问题提供详细的解决方案!

    此致,
    Ryan

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

    您好,Ryan:

    我遇到了另一个关于I2C从属项目的问题。

    我将上述代码修改为以下代码:

    #include <i2c.h>
    #include <prcm.h>
    #include <ti/drivers/Power.h>
    #include <ti/drivers/power/PowerCC26XX.h>
    #include <ti/drivers/PIN.h>
    #include <ti/drivers/pin/PINCC26XX.h>
    
    #define I2C0_SCL0          IOID_4
    #define I2C0_SDA0          IOID_5
    #define SLAVE_ADDR         0x11
    
    void init_i2c(void);
    void i2c_callback(void);
    
    PIN_State i2cPinState;      // Must reside in persistent memory
    volatile uint8_t i2c_read_cnt;
    volatile uint32_t i2c_read_buf[20];
    
    void *mainThread(void *arg0)
    {
        GPIO_init();
        DBG_INIT();
        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);
        GPIO_write(CONFIG_GPIO_LED_1, CONFIG_GPIO_LED_ON);
    
        DBG_INFO("/********** Program Start ***********/");
    
        init_i2c();
    
        while (1) {
            if(i2c_read_cnt != 0)
            {
                GPIO_toggle(CONFIG_GPIO_LED_1);
    
                DBG_INFO("I2C get data: [%d]", i2c_read_cnt);
    
                uint8_t i;
                for(i = 0; i < i2c_read_cnt; i++)
                {
                    DBG_INFO("test1");
    //                DBG_INFO("[%d] = 0x%08x", 0, 0);
    //                DBG_INFO("[%d] = 0x%08x", i, i2c_read_buf[i]);
                }
    
                DBG_INFO("test2");
                i2c_read_cnt = 0;
            }
        }
    }
    
    void init_i2c(void)
    {
        PRCMPowerDomainOn(PRCM_DOMAIN_PERIPH);
    
        // Set Power dependecies & constraints
        Power_setDependency(PowerCC26XX_PERIPH_I2C0);
        Power_setDependency(PowerCC26XX_PERIPH_GPIO);
    
        // Set constraints for Standby, powerdown and idle mode
        Power_setConstraint(PowerCC26XX_SB_DISALLOW);
        Power_setConstraint(PowerCC26XX_IDLE_PD_DISALLOW);
    
        PRCMLoadSet();
        PRCMPeripheralRunEnable(PRCM_PERIPH_I2C0); // Enable I2C module
        PRCMPeripheralRunEnable(PRCM_PERIPH_GPIO);
        PRCMLoadSet();
    
        PIN_Config i2cPinTable[] = {
            I2C0_SDA0 | PIN_INPUT_EN | PIN_PULLUP | PIN_OPENDRAIN,
            I2C0_SCL0 | PIN_INPUT_EN | PIN_PULLUP | PIN_OPENDRAIN,
            PIN_TERMINATE
        };
    
        PIN_Handle i2cPinHandle = PIN_open(&i2cPinState, i2cPinTable);
        if (    (PIN_SUCCESS == PINCC26XX_setMux(i2cPinHandle, I2C0_SCL0, IOC_PORT_MCU_I2C_MSSCL)) &&
                (PIN_SUCCESS == PINCC26XX_setMux(i2cPinHandle, I2C0_SDA0, IOC_PORT_MCU_I2C_MSSDA))      )
        {
            DBG_INFO("I2C PIN set succ.");
        } else {
            DBG_INFO("I2C PIN set failed.");
        }
    
        I2CSlaveInit(I2C0_BASE, SLAVE_ADDR);
        I2CIntRegister(I2C0_BASE, i2c_callback);
        I2CSlaveIntEnable(I2C0_BASE, I2C_SLAVE_INT_START | I2C_SLAVE_INT_STOP | I2C_SLAVE_INT_DATA);
    }
    
    void i2c_callback(void)
    {
        i2c_read_cnt = 0;
        uint32_t status = I2CSlaveIntStatus(I2C0_BASE, true);
        I2CSlaveIntClear(I2C0_BASE, status);
    
        if(status & I2C_SLAVE_INT_DATA)
        {
            //status = I2CSlaveStatus(I2C0_BASE);
    
            while( I2CSlaveStatus(I2C0_BASE) & I2C_SLAVE_ACT_RREQ)
            {
                i2c_read_buf[i2c_read_cnt++] = I2CSlaveDataGet(I2C0_BASE);
                GPIO_toggle(CONFIG_GPIO_LED_0);
            }
        }
    }

    当我运行i2copt3001示例测试I2C从属设备时,XDS110输出如下:

    /********** Program Start ***********/
    I2C PIN set succ.
    I2C get data: [1]
    test2

    是,没有test1输出... 我无法理解,请帮帮我。

    谢谢!

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

    您好,

    我发现 i2c_read_cnt已被i2c_callback()更改,我修复了该错误,并在此处发布您的信息: gitee.com/.../i2c-interactive.git