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/TM4C1294NCPDT:在将 Tiva I2C1配置为主器件的情况下、从 I2C 从器件读取2个字节

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/684621/rtos-tm4c1294ncpdt-reading-2-bytes-from-i2c-slave-device-with-tiva-i2c1-configured-as-master

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

我已经在地址0xD0处设置了一个传感器 LTC4151、该地址连接到 Tiva 的 I2C1接口作为主器件。 我要附加一个简单的代码、在该代码中、我将希望从 LTC4151读取的寄存器的地址发送到从 LTC4151器件  

我看到我使用的代码已经被其他人尝试过、但我无法读取数据

#define SLAVE_ADDRESS 0xD0 //地址从位7:1 D0移位1向右移动1位置为68
#define NUM_OF_I2CBYTES 2.

//
//
//主程序以配置和使用 I2C 主器件 I2C1
//
//
内部
main (空)

//设置120MHz 的系统时钟
//
ui32SysClock = SysCtlClockFreqSet ((SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_XTAL_25MHz |
SYSCTL_CFG_VCO_480)、120000000);

//启用 GPIO 以配置 I2C 接口引脚
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);

//等待外设为编程做好准备
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOG));

//
//为 I2C1主接口配置引脚
//
GPIOPinConfigure (GPIO_PG0_I2C1SCL);
GPIOPinConfigure (GPIO_PG1_I2C1SDA);

GPIOPinTypeI2CSCL (GPIO_PORTG_BASE、GPIO_PIN_1);
GPIOPinTypeI2C (GPIO_PORTG_base、GPIO_PIN_0);

//
//停止时钟、复位和启用 I2C 模块
//在主函数中
//
SysCtlPeripheralDisable (SYSCTL_Periph_I2C1);
SysCtlPeripheralReset (SYSCTL_Periph_I2C1);
SysCtlPeripheralEnable (SYSCTL_Periph_I2C1);


//
//等待外设为编程做好准备
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C1));

//初始化和配置主模块
//
I2CMasterInitExpClk (I2C1_base、ui32SysClock、true);

//-------------------- 在读取前写入-------

I2CMasterSlaveAddrSet (I2C1_base、SLAVE_ADDRESS、false);//设置从器件地址并通过写操作启动

I2CMasterControl (I2C1_base、I2C_MASTER_CMD_SINGLE_SEND);//发送停止位

I2CMasterDataPut (I2C1_base、0x00);//put 0x00 -发送要从从从器件读取的寄存器地址

while (!(I2CMasterBusy (I2C1_base)));//等待事务结束
// while ((I2CMasterBusy (I2C1_base)));//等待事务结束

I2CMasterSlaveAddrSet (I2C1_base、SLAVE_ADDRESS、TRUE);//设置从器件地址并通过读取进行初始化

I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_Receive_start);//读取第一个字节

pui32DataRx[0]= I2CMasterDataGet (I2C1_base);

while (!(I2CMasterBusy (I2C1_base)));//等待事务结束
// while ((I2CMasterBusy (I2C1_base)));//等待事务结束


I2CMasterControl (I2C1_base、I2C_MASTER_CMD_BURST_Receive_finish);//读取第二个字节

pui32DataRx[1]= I2CMasterDataGet (I2C1_base);

while (!(I2CMasterBusy (I2C1_base)));//等待事务结束
// while ((I2CMasterBusy (I2C1_base)));//等待事务结束

while (1)


}//结束 main

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在有人尝试调试您的代码之前、您是否使用示波器查看过 I2C 线路? 您的代码有什么作用? 它是否会一直到达末尾的 while (1)循环
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在我发送要读取的从器件中寄存器的地址后、主总线卡滞。 I2C_MCS 为0x1!

    我有一个 TI RTOS 程序、该程序从寄存器0x00的设置从地址读取20个样本。 在这里、I2C) MCS 为0x20!

    我将在星期一提出范围并进行分析。

    在我附加这两个项目(TIRTOS 读取值、而我昨天在论坛中粘贴的非 TI RTOS 代码)以供您参考。

    此致

    帕维特拉

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

    这是 TI RTOS 程序的驱动程序文件、似乎从我的 LTC4151 devcice 中读取

    e2e.ti.com/.../i2ctmp006.c

    这是非 TI RTOS (Tivaware 程序)、它在 Tiva 主器件尝试发送寄存器(0x00)来访问信息后表现出总线忙状态。

    e2e.ti.com/.../4478.main.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在获得 I2C 总线的示波器图片后、您是否能够解决此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我一直无法完成这项任务。

    它看起来确实是一个时序问题、并且类似的 TI RTOS 程序正在工作、但实际上不是这样。

    将在下周发布。

    谢谢

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

    实际上、在我的代码中进行配置时、SDA 和 SCL 线路发生翻转。 这就是它以前不起作用的原因。

    现在它已经开始工作了! 谢谢

    //
    GPIOPinConfigure (GPIO_PG0_I2C1SCL);
    GPIOPinConfigure (GPIO_PG1_I2C1SDA);

    GPIOPinTypeI2C (GPIO_PORTG_base、GPIO_PIN_1);//配置 SDA
    GPIOPinTypeI2CSCL (GPIO_PORTG_base、GPIO_PIN_0);//配置 SCL

    在最后两行中、引脚编号翻转了。