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.

[参考译文] Compiler/LAUNCHCC3220MODASF:I2C 初始化失败

Guru**** 2589280 points
Other Parts Discussed in Thread: TMP006

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/707577/compiler-launchcc3220modasf-i2c-initialization-failed

器件型号:LAUNCHCC3220MODASF

工具/软件:TI C/C++编译器

您好!

我已将 timerled 和 i2cttemp 示例组合在一起,以获得每秒的温度值,但它给了我错误:I2C 总线故障。

我已尝试解决此问题,但我无法理解为什么会发生,请建议我如何解决此问题?

以下是调试页面的代码和屏幕截图:

#include
#include
#include
#include

#include
#include
#include
#include

#include "Board.h"

#define TMP006_DIE_TEMP 0x0001
uint16_t 温度;
uint8_t txBuffer[1];
uint8_t rxBuffer[2];
I2C_Transaction i2cTransaction;
I2C_Handle i2c;

I2C_Params i2cParams;

INT 标志;

void timerCallback();


void * mainThread (void * arg0)

Timer_handle timer0;
Timer_Params 参数;


GPIO_init();
timer_init();

I2C_init();

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

GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_OFF);

Timer_Params_init (&params);
params.period = 1000000;
Params.periodUnits = Timer_Period_US;
params.timerMode = Timer_Continuous_callback;
params.timerCallback = timerCallback;

timer0 = Timer_open (Board_TIMER0、params);

if (timer0 == NULL){

while (1);

如果(Timer_start (timer0)= Timer_STATUS_ERROR){

while (1);

返回(空);


空 timerCallback()

I2C = I2C_open (Board_I2C_TMP、&i2cParams);
if (i2c == NULL){
printf ("初始化 I2C\n"时出错);
while (1);

否则{
printf ("I2C 已初始化!\n"\});

txBuffer[0]= TMP006_DIE_TEMP;
i2cTransaction.slaveAddress = Board_TMP_ADDR;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 2;
flag = I2C_transfer (i2c、&i2cTransaction);

if (flag){

温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);

if (rxBuffer[0]& 0x80){
温度|= 0xF000;

温度/= 32;

printf ("采样%d (C)\n"、温度);

否则{
printf ("I2C 总线故障");

I2C_Close (i2c);
printf ("I2C 已关闭!\n"\});

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

    您好 Sagar、

    我查看了您的代码、这里是您的 I2C 传输参数处于阻塞模式而不是回调模式的原因、因此您的 I2C 传输调用都被阻止、因此请切换传输模式、 但是、这并不能完全解决问题您还需要向 I2C 添加回调函数来调用您的传递函数、否则您的值将为零。 我附加了下面的修复程序;此外、还有一种更简单的方法可以在不回调的情况下复制此代码、只需在 tempature 示例中添加一个睡眠调用(如果尚未添加)和一个无限 while 循环(其中 for 循环为)。

    代码:
    #include
    #include
    #include
    #include

    /*驱动程序头文件*/
    #include
    #include
    #include
    #include

    /*示例/板头文件*/
    #include "Board.h"

    #define TMP006_DIE_TEMP 0x0001 /*裸片温度结果寄存器*/

    unsigned int i = NULL;
    uint16_t 温度;
    uint8_t txBuffer[1];
    uint8_t rxBuffer[2];
    I2C_Handle i2c;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;
    Timer_handle timer0;
    Timer_Params 参数;


    void timerCallback();

    void * mainThread (void * arg0){

    GPIO_init();
    timer_init();
    I2C_init();

    GPIO_setConfig (Board_GPIO_LED0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    GPIO_WRITE (Board_GPIO_LED0、Board_GPIO_LED_OFF);

    txBuffer[0]= TMP006_DIE_TEMP;
    i2cTransaction.slaveAddress = Board_TMP_ADDR;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 2;



    Timer_Params_init (&params);
    Params.period = 1500000;
    Params.periodUnits = Timer_Period_US;
    params.timerMode = Timer_Continuous_callback;
    params.timerCallback = timerCallback;

    timer0 = Timer_open (Board_TIMER0、params);

    if (timer0 ==空)


    while (1)



    如果(Timer_start (timer0)= Timer_STATUS_ERROR)


    while (1)



    返回(0);

    void transferCallbackFxn (I2C_Handle handle、I2C_Transaction *事务、bool transferStatus){//用于 I2C 回调



    if (transferStatus){

    温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);

    if (rxBuffer[0]& 0x80)

    温度|= 0xF000;


    温度/= 32;

    printf ("采样%d (C)\n"、温度);


    其他

    printf ("I2C 总线故障");


    I2C_Close (i2c);
    printf ("I2C 已关闭!\n"\});

    空 timerCallback()


    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    i2cParams.transferMode = I2C_MODE_CALLACK;//已切换
    i2cParams.transferCallbackFxn = transferCallbackFxn;//添加此项
    I2C = I2C_open (Board_I2C_TMP、&i2cParams);

    if (i2c == NULL)

    printf ("初始化 I2C"时出错);
    while (1)


    其他

    printf ("I2C 已初始化!\n"\});


    I2C_transfer (i2c、&i2cTransaction);


     
     
    祝你度过美好的一天!

    此致、
    Tyisheam J.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Tyisheam、
    因为它已经解决了问题、我点击了"解决我的问题"。