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.

[参考译文] RTOS/MSP430F5659:使用 TI RTOS 处理2条不同的 I2C 总线

Guru**** 2609895 points
Other Parts Discussed in Thread: TMP112, MSP430F5659, TCA6424

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/584152/rtos-msp430f5659-handling-2-different-i2c-bus-using-ti-rtos

器件型号:MSP430F5659
主题中讨论的其他器件:TMP112TCA6424

工具/软件:TI-RTOS

您好!

我在处理2条不同的 I2C 总线时遇到问题、只有一条 I2C 总线在工作、另一条 I2C 总线不工作。

我的代码如下所示。

#define Board_I2C_AT24_TMP112  MSP_MSP430F5659_I2CB1 -- >I2C 总线1
#define Board_I2C_swicth         MSP_MSP430F5659_I2CB2 ---- >I2C 总线2

1 ->.cfg 文件我已声明2条总线。

TIRTOS.useI2C = true;
var hwi5Params = new hwi.Params();
hwi5Params.instance.name ="hwi5";
hwi5Params.arg = 0;
program.global.hwi5 = Hwi.create (45、"&I2CUSCIB_hwiIntFxn"、hwi5Params);
var hwi6Params = new hwi.Params();
hwi6Params.instance.name ="hwi6";
hwi6Params.arg = 1;
program.global.hwi6 = Hwi.create (35、"&I2CUSCIB_hwiIntFxn"、hwi6Params);

2 ->在 board_gpio.c 和 board_gpio.h 声明中、如下所示

#define Board_TCA6424_ADDR      (0x22)//(0x44)

typedef 枚举 MSP_MSP430F5659_I2CName{
   MSP_MSP430F5659_I2CB1 = 0、
   MSP_MSP430F5659_I2CB2 = 1、
MSP_MSP430F5659_I2CCOUNT
}MSP_MSP430F5659_I2CName;

#if defined (__TI_Compiler_version__)
#pragma DATA_SECTION (I2C_CONFIG、".CONST:I2C_CONFIG")
#pragma DATA_SECTION (i2cUSCIBHWAttrs、".const:i2cUSCIBHWAttrs")
#endif

#include
#include

I2CUSCIB_Object i2cUSCIBObjects[MSP_MSP430F5659_I2CCOUNT;

CONST I2CUSCIB_HWAttrs i2cUSCIIBHWAttrs[MSP_MSP430F5659_I2CCOUNT ={

       baseAddr =  USCI_B1_base、
       时钟源= USCI_B_I2C_CLOCKSOURCE_SMCLK
}、

      baseAddr =  USCI_B2_base、
      时钟源= USCI_B_I2C_CLOCKSOURCE_SMCLK

};

const I2C_Config I2C_CONFIG[]={

     .fxnTablePtr =&I2CUSCIB_fxnTable、
      .object =&i2cUSCIBObjects[0]、
     hwAttrs =&i2cUSCIBHWAttrs[0]
}、

     .fxnTablePtr =&I2CUSCIB_fxnTable、
     .object =&i2cUSCIBObjects[1]、
     hwAttrs =&i2cUSCIBHWAttrs[1]
}、

      空、空、空}
};

/*
*==== MSP_MSP430F5659_initI2C ===
*
void MSP_MSP430F5659_initI2C (void)

/*
*注意:TI-RTOS 示例将 USCIB0配置为 SPI 或 I2C。 因此、
*在中同时使用 I2C 和 SPI 驱动程序时会发生冲突
*应用程序。 修改此文件中的引脚多路复用设置并解析
*运行应用程序前发生冲突。
*
GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P8、
GPIO_PIN5 | GPIO_PIN6);

GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P9、
GPIO_PIN5 | GPIO_PIN6);


I2C_init();

3.->在 main.c 中

调用 MSP_MSP430F5659_initI2C ()、  也调用 InitSwictch ()和 Switch_Register_write (4、value)

4 ->在 switch handle.c InitSwictch ()和 Switch_Register_write()中、定义如下。 未找到错误  

空 InitSwitch (空)

     I2C_Params_init (&i2cparams);
    i2cparams.bitrate = I2C_400kHz;

     句柄= I2C_open (Board_I2C_swicth、&i2cparams);

    if (handle == NULL){
     断言(1);
     }

空 Switch_Register_write (TUSIGN8 REG_Len、TUSIGN8 * REG_DATA)

TUSIGN8 writeBuffer[4]、I=0;
I2C_Transaction i2c;

I2C.slaveAddress =  Board_TCA6424_ADDR

I2C.ReadCount = 0;
I2C.readBuf =空;
I2C.writeBuf = writeBuffer;
I2C.writeCount = reg_len;

操作

writeBuffer[i]=* reg_data++;
i++;
REG_Len--;
}while (reg_Len!= 0);

if (!I2C_transfer (handle、&i2c))

while (1);

}/* switch_Register_write()的末尾*/

最后,如果我在总线2 (USCI_B2_BASE,即 P9.5和 P9.6 )上看到示波器,我将看不到 CLK 和数据。 这里可能会有什么问题  

在 BUS1 (USCI_B1_BASE,即 P8.5和 P8.6 )上,我看到数据和 CLK,并且工作正常。

这可能是什么问题,我是否做了错误的初始化? 请指导我。

如果有人能快速帮助解决这一问题、我将不胜感激并表示感谢。  

提前感谢

Nitesh

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

    您是否为 F5659器件重建了 TI-RTOS? 您是否在 Switch_Register_write 函数中到达"while (1)"(您能否在其上设置断点)? 这些引脚上是否有上拉电阻器?

    上面的代码看起来不错;这让我相信问题在于硬件的配置方式。 查看端口9的引脚图(在数据表中)、似乎引脚5和6也可用于 LCD。 您能否检查并确保它们未在该模式下配置?

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

    您使用的是哪个版本的 TI-RTOS?

    当我查看示例 I2C 板文件内容时、我看到以下 pinmux:配置 I2C 引脚的内容:

    void MSP_EXP430FR5969_initI2C (void)
    {
    /*
    *注意:TI-RTOS 示例将 EUSCIB0配置为 SPI 或 I2C。 因此、
    *在中同时使用 I2C 和 SPI 驱动程序时会发生冲突
    *应用程序。 修改此文件中的引脚多路复用设置并解析
    *运行应用程序前发生冲突。
    /GPIO_setPeripheralModuleFunctionInputPin
    (GPIO_PORT_P1、
    GPIO_PIN6 | GPIO_PIN7、GPIO_secondary 模块_function);
    I2C_init ();
    } 

    您是否应该将"GPIO_secondary 模块_function"作为第三个参数传递给 GPIO_setPeripheralModuleFunctionInputPin()?

    Alan

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

    您好、Emmanuel、

    谢谢、

    是的、我调试了代码、它未达到 while (1)。

    是的、SDA 和 SCL 线路上都有一个上拉电阻器10K。

    在配置为 O/P 端口的代码端口9中、所有引脚都配置为高电平。

    I2C 总线初始化时、两个总线引脚均按如下所示进行配置。

    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P8、GPIO_PIN5 | GPIO_PIN6);

    GPIO_setPeripheralModuleFunctionInputPin (GPIO_PORT_P9、GPIO_PIN5 | GPIO_PIN6);

    现在、它看起来 I2C 正在工作、在示波器上、我们看到的是 SCL 上的时钟、但我们没有看到 SDA 上的数据。

    我们所缺少的任何东西

    是的  

    配置通过 8C 00 00完成设置,O/P 设置为高电平-> 84 FF FF FF FF ---观察所有端口高电平(5V)

    但 我写84 00 00 00 00、用于 将所有端口设置为低电平-->所有 O/P 端口显示(3.9v)

    我缺少的是配置吗?

    提前感谢。