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.

[参考译文] CC2650:I2C_transfer 不起作用

Guru**** 2589280 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/602458/cc2650-i2c_transfer-not-working

器件型号:CC2650

您好!  

我´m 通过 I2C 连接到 LSM6DS33器件、但这给了我一些问题。 我的目的是制作蓝牙信标并广播设备为我提供的值的一种解释。

问题是、当我尝试使用周期性任务读取这些值时、LSM6DS33配置值会发生差异、有时传感器值为零、有时是正确的值。  

静态空 SimpleBLEBroadcaster _init (空)

//
//在调用 iCall_registerApp 之前可能会发生 N0栈 API 调用
//
//将当前线程注册为 iCall 调度应用程序
//以便应用程序可以发送和接收消息。
iCall_registerApp (自实体、SEM);

//I2C 驱动程序初始化
I2C_init();
I2C_PARAMS_INIT (params);

I2C_Transaction i2cTrans;
uint8_t txBuf[32]={0};//发送缓冲器
uint8_t rxBuf[32]={0};//读取缓冲区  
句柄= I2C_open (Board_I2C、params);
if (!handle){
//错误

/////////////////////////////////////////////////////////////////// LSM6DS33///////////////////////////////////

//配置 gyro y acelerometro

//确认
//地址= 0x10 ctrl1
//// 0x80
TxBuf[0]= 0x10;
txBuf[1]= 0x80;
i2cTrans.writeCount = 2;
i2cTrans.writeBuf = txBuf;
i2cTrans.ReadCount = 0;
i2cTrans.readBuf =空;
i2cTrans.slaveAddress = 0x6B;

静态空 SimpleBLEPeripheral_performPeriodicTask (空)


#if 1.
//******* I2C 代码*******
结构选择

uint16_t x;
uint16_t y;
uint16_t z;
};

结构陀螺仪

uint16_t x;
uint16_t y;
uint16_t z;


};

I2C_Transaction i2cTrans;
uint8_t rxBuf[32]={0};//接收缓冲区
uint8_t txBuf[32]={0};//发送缓冲器

结构 A;

结构陀螺仪 g;

句柄= I2C_open (Board_I2C、params);
if (!handle){
//错误

/////////////////////////////////////////////////////////////////// LSM6DS33///////////////////////////////////

//读取陀螺仪
//Address = 0x22
TxBuf[0]= 0x22;
i2cTrans.writeCount = 1;
i2cTrans.writeBuf = txBuf;
i2cTrans.ReadCount = 6;
i2cTrans.readBuf = rxBuf;
i2cTrans.slaveAddress = 0x6B;

I2C_transfer (handle、&i2cTrans);

G.x=(rxBuf[1]<<8| rxBuf[0]);
G.y=(rxBuf[3]<<8| rxBuf[2]);
G.z=(rxBuf[5]<<8| rxBuf[4]);

 我认为主要问题是 I2C_transfer 函数。 当我´m 步调试它时、它会完全阻止、但我完全不确定。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    校准 I2C_TRANfer 时、您是否在 CLK 引脚上看到时钟信号?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我确实这么做、我在 SDA 中也有信号。 当我运行周期性任务时、有时它会读取传感器的值、但当它到达周期性任务时、配置值会消失。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、alex22、
    您应该在初始化中只调用一次 I2C_open。 然后、您可以使用具有 i2c 句柄的 I2C_transfer 进行传输。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我´ve 用示波器´ve SDA 通道、我看到 ACK 位为1。 如果已完成正确的传输、则应为0
    cdn.sparkfun.com/.../51ae0000ce395f645d000000.png
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="alex22"]

    静态空 SimpleBLEPeripheral_performPeriodicTask (空)


    #if 1.
    //******* I2C 代码*******
    结构选择

    uint16_t x;
    uint16_t y;
    uint16_t z;
    };

    结构陀螺仪

    uint16_t x;
    uint16_t y;
    uint16_t z;


    };

    I2C_Transaction i2cTrans;
    uint8_t rxBuf[32]={0};//接收缓冲区
    uint8_t txBuf[32]={0};//发送缓冲器

    结构 A;

    结构陀螺仪 g;

    句柄= I2C_open (Board_I2C、params);
    if (!handle){
    //错误

    /////////////////////////////////////////////////////////////////// LSM6DS33///////////////////////////////////

    //读取陀螺仪
    //Address = 0x22
    TxBuf[0]= 0x22;
    i2cTrans.writeCount = 1;
    i2cTrans.writeBuf = txBuf;
    i2cTrans.ReadCount = 6;
    i2cTrans.readBuf = rxBuf;
    i2cTrans.slaveAddress = 0x6B;

    I2C_transfer (handle、&i2cTrans);

    G.x=(rxBuf[1]<<8| rxBuf[0]);
    G.y=(rxBuf[3]<<8| rxBuf[2]);
    G.z=(rxBuf[5]<<8| rxBuf[4]);

    [/报价]
    您好、Alex22、
    尝试删除 SimpleBLEPeripheral_performPeriodicTask 中的"handle = I2C_open (Board_I2C、&params);"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它不n´t。 我不n´t´s 发生了什么。 起初、它可以毫无问题地读取传感器的值、但每天运行得更糟。 现在、使用相同的程序、它无法读取配置值。
    I2C_init();
    I2C_PARAMS_INIT (params);

    I2C_Transaction i2cTrans;
    uint8_t txBuf[32]={0};//发送缓冲器
    uint8_t rxBuf[32]={0};//读取缓冲区 没有什么好的地方,没有什么好的地方,没有任何贵的东西,有单独的评论
    句柄= I2C_open (Board_I2C、params);
    if (!handle){
    //错误

    /////////////////////////////////////////////////////////////////// LSM6DS33///////////////////////////////////

    //配置 gyro y acelerometro



    //确认
    //地址= 0x10 ctrl1
    //// 0x80
    TxBuf[0]= 0x10;
    txBuf[1]= 0x80;
    i2cTrans.writeCount = 2;
    i2cTrans.writeBuf = txBuf;
    i2cTrans.ReadCount = 0;
    i2cTrans.readBuf =空;
    i2cTrans.slaveAddress = 0x6B;

    I2C_transfer (handle、&i2cTrans);



    //陀螺仪
    //地址= 0x11 Ctrl2_G
    // 0x80 = 0b10000000
    // ODR = 1000 (1.66kHz (高性能));FS_XL = 00 (245 DPS)
    TxBuf[0]= 0x11;
    txBuf[1]= 0x80;
    i2cTrans.writeCount = 2;
    i2cTrans.writeBuf = txBuf;
    i2cTrans.ReadCount = 0;
    i2cTrans.readBuf =空;
    i2cTrans.slaveAddress = 0x6B;

    I2C_transfer (handle、&i2cTrans);



    //控件3.

    TxBuf[0]= 0x12;
    txBuf[1]= 0x04;// 0b00000100
    i2cTrans.writeCount = 2;
    i2cTrans.writeBuf = txBuf;
    i2cTrans.ReadCount = 0;
    i2cTrans.readBuf =空;
    i2cTrans.slaveAddress = 0x6B;

    I2C_transfer (handle、&i2cTrans);

    //´ve 我n´t 读写的内容,起初它工作正常,但现在它工作正常


    TxBuf[0]= 0x10;
    i2cTrans.writeCount = 1;
    i2cTrans.writeBuf = txBuf;
    i2cTrans.ReadCount = 1;
    i2cTrans.readBuf = rxBuf;
    i2cTrans.slaveAddress = 0x6B;

    I2C_transfer (handle、&i2cTrans);






    I2C_Close (handle);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、alex22、
    我在您的代码中找不到任何问题。 您必须尝试检查
    1/检查原理图和 PCB,如 I2C 的上拉电阻器、电源引脚....
    2更换其它传感器检查,确保您的传感器没有任何问题.
    3在 i2c 总线上捕获信号以分析波形、以确保其波形正常工作
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它可以正常工作、但需要时间来实现它。 n´tn´t 并执行应用程序后、它会正确读取值、但我不知道为什么它无法从开始执行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我´ve 了传输´s 返回值、有时为零、这意味着出错了。 我在´m 传输函数的语句中添加了 DO、但这可能会干扰应用程序的正确性能
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还有一些传输永远不会返回任何内容、程序总是在等待某些内容。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、alex22、
    器件可以读取您的传感器、但有时它永远不会返回。 这意味着您的 i2c 总线会挂起、因为 i2c 的脉冲可能会丢失。 您必须重置设备或尝试发送脉冲以修复丢失的脉冲。
    有时会出现 i2c 总线的问题。 您可以研究如何在论坛上修复它。
    但是、您应该再次仔细检查代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    实际上、我实现了使其正常工作。 我将传输语句放在 DO { while conditions 内,并且在配置之后也缺少了 I2C 关闭语句。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    很好:)