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.

[参考译文] CCS/TMS570LC4357:I2C 问题

Guru**** 2473270 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/683248/ccs-tms570lc4357-i2c-issue

器件型号:TMS570LC4357

工具/软件:Code Composer Studio

您好!

我尝试使用 I2C 从传感器读取数据、但我没有成功。

这是我用于从传感器读取数据的函数:

空 I2CReceive (uint8_t slave_address、uint8_t reg、uint8 * buff)

while (i2cIsBusy (i2cREG2)=true);
i2cREG2->MDR = I2C_RESET_OUT;
i2cSetMode (i2cREG2、I2C_MASTER);
i2cSetSlaveAdd (i2cREG2、SLAVE_ADDRESS);
i2cSetDirection (i2cREG2、I2C_transmitter);
i2cSetCount (i2cREG2、1);
i2cSetStart (i2cREG2);
while ((i2cREG2->STR &(I2C_TX | I2C_ARDY))== false);//等待 TX 准备就绪和寄存器访问准备就绪
i2cSendByte (i2cREG2、reg);

//开始接收来自从设备的数据
//在开始事务的读取阶段之前等待 ARDY
while ((i2cREG2->STR & I2C_ARDY)== false);//被阻止------
i2cREG2->MDR = I2C_RESET_OUT;//设置带有"C 的 MDR 已超出复位范围

i2cSetMode (i2cREG2、I2C_MASTER);
i2cSetDirection (i2cREG2、I2C_RECEIVER);
i2cSetCount (i2cREG2、1);
i2cSetStop (i2cREG2);
i2cSetStart (i2cREG2);
//接收一个字节

while ((i2cREG2->STR &(I2C_RX | I2C_ARDY))== true);
buff [0]= i2cREG2->DRR;


while (i2cIsBusy (i2cREG2)=true);
/*等待直到检测到停止*/
while (i2cIsStopDetected (i2cREG2)== false);
/*清除停止条件*/
i2cClearSCD (i2cREG2);

它在以下行中仍然被阻止:

//开始接收来自从设备的数据
//在开始事务的读取阶段之前等待 ARDY
while ((i2cREG2->STR & I2C_ARDY)== false); //被阻止------

我犯了什么错误?

此致

PISC

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

    传感器是否有特殊的 I2C 通信要求? 例如、需要另一个寄存器地址来获取数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您可以访问、最好使用逻辑分析仪来监听 I2C 总线。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    QJ Wang、您好!

    是的,它需要发送从机地址和内部寄存器地址。 传感器为 GY-86 (IMU 10 DOF)。

    感谢您的回复、

    此致

    PISC

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我解决了这个问题
    使用以下函数:

    //写入寄存器
    空 I2CWrt (uint8_t slave_address、uint8_t reg、uint8 buff)

    //主传输功能//
    /*配置要与*/通话的从机地址
    i2cSetSlaveAdd (i2cREG2、SLAVE_ADDRESS);
    /*将方向设置为发送器*/
    /*注意:可选-在 Init 中完成*/
    i2cSetDirection (i2cREG2、I2C_transmitter);
    /*配置数据计数*/
    /*数据计数+ 1 (字地址)*/
    i2cSetCount (i2cREG2、1 + 1);
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG2、I2C_MASTER);
    /*设置编程计数后停止*/
    i2cSetStop (i2cREG2);
    /*发送开始条件*/
    i2cSetStart (i2cREG2);
    /*发送字地址*/
    i2cSendByte (i2cREG2、reg);
    /*轮询模式下的 Transmit data_count 数据数量*/
    i2cSend (i2cREG2、1、缓存);
    /*等待总线忙被清除*/
    while (i2cIsBusy (i2cREG2)=true);
    /*等待直到检测到停止*/
    while (i2cIsStopDetected (i2cREG2)=0);
    /*清除停止条件*/
    i2cClearSCD (i2cREG2);


    //从寄存器中读取
    空 I2CRec (uint8_t slave_address、uint8_t reg、uint8 *缓冲区)

    // 主机接收功能 //
    /********* /
    /********* /
    /*等待 MST 位被清零,这将进行
    * *清除总线忙后的几个周期*/
    while (i2cIsMasterReady (i2cREG2)!= true);
    /*配置要与*/通话的从机地址
    i2cSetSlaveAdd (i2cREG2、SLAVE_ADDRESS);
    /*将方向设置为发送器*/
    /*注意:可选-在 Init 中完成*/
    i2cSetDirection (i2cREG2、I2C_transmitter);
    /*配置数据计数*/
    /*读取之前从器件地址+字地址写入操作*/
    i2cSetCount (i2cREG2、1);
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG2、I2C_MASTER);
    /*设置编程计数后停止*/
    i2cSetStop (i2cREG2);
    /*发送开始条件*/
    i2cSetStart (i2cREG2);
    /*发送字地址*/
    i2cSendByte (i2cREG2、reg);
    /*等待总线忙被清除*/
    while (i2cIsBusy (i2cREG2)=true);
    /*等待直到检测到停止*/
    while (i2cIsStopDetected (i2cREG2)=0);
    /*清除停止条件*/
    i2cClearSCD (i2cREG2);
    /********* /
    /********* /
    /*等待 MST 位被清零,这将进行
    * *清除总线忙后的几个周期*/
    while (i2cIsMasterReady (i2cREG2)!= true);
    /*配置要与*/通话的从机地址
    i2cSetSlaveAdd (i2cREG2、SLAVE_ADDRESS);
    /*将方向设置为接收器*/
    i2cSetDirection (i2cREG2、I2C_RECEIVER);
    /*配置数据计数*/
    /*注:可选-在 Init 中完成,除非用户想要更改*/
    i2cSetCount (i2cREG2、1);
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG2、I2C_MASTER);
    /*设置编程计数后停止*/
    i2cSetStop (i2cREG2);
    /*发送开始条件*/
    i2cSetStart (i2cREG2);
    /*轮询模式下的 Transmit data_count 数据数量*/
    i2c 接收器(i2cREG2、1、缓冲器);
    /*等待总线忙被清除*/
    while (i2cIsBusy (i2cREG2)=true);
    /*等待直到检测到停止*/
    while (i2cIsStopDetected (i2cREG2)=0);
    /*清除停止条件*/
    i2cClearSCD (i2cREG2);