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.

[参考译文] TM4C123GH6PM:TM4C123

Guru**** 2482225 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/722622/tm4c123gh6pm-tm4c123

器件型号:TM4C123GH6PM

大家好、我在从 Lounchpad TM4C123gxl 到接近传感器 ADPS9960的 I2C 通信方面遇到了问题。 我初始化 MCU、外设、当尝试 从传感器寄存器读取时、我获得0xFF、当我尝试从 Arduino 板读取到同一传感器时、代码工作正常。 因此、我显然做了一些错误、我不知道是什么。 我在 SCL 和 SDA 线路中连接了上拉电阻器(10k)。以下是我的 I2C 代码:  

void main (void){

SysCtlClockSet (SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL | SYSCTL_INT | SYSCTL_XTAL_16MHz);
Configuration ();

while (1)
{
Read_Inputs ();
}


void I2C_Configuration ()
{
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);


C0SDA PeripheralEnable (SYSCTL_Periph_GPIOB);GPIOPinConfigure (GPIO_PB2_I2C0);C0C0SDA PeripheralEnable (SYSCTL_PERIPH_GPIO3);GPIOPinConfigure)
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);
I2CMasterInitExpClk (I2C0_BASE、 SysCtlClockGet ()、false);
HWREG (I2C0_BASE + I2C_O_FIFOCTL)= 80008000;
}

uint8_t I2CWriteDataByte (uint8_t SLAVE_addr、uint8_t DEV_reg、uint8_t DATA)
{I2CMasterSlaveAddr


(I2CM0_Idr、I2CMaster0_Idr)

I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);

while (I2CMasterBusy (I2C0_BASE));

I2CMasterDataPut (I2C0_BASE、DATA);

I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_BURST_SEND_FINISH);

while (I2CMasterBusy (I2C0_BASE));

return 1;
}

uint8_t I2CReadDataByte (uint8_t SLAVE_addr、uint8_t SLAVE_reg)
{
I2CMaster0

、I2CMReadDataSet (I2CMaster0_SLAVE_ADAS);I2CMaster0_SLAVESD_BASE (I2CM0)

I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);

while (I2CMasterBusy (I2C0_BASE));

I2CMasterSlaveAddrSet (I2C0_BASE、SLAVE_ADDR、 TRUE);

I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_Receive);

while (I2CMasterBusy (I2C0_BASE));

return (I2CMasterDataGet (I2C0_BASE)));
} 

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

    我在您提供的代码片段中看不到错误。 您为 SysCtlClockSet()选择的参数似乎是奇数。 您尝试实现的频率是多少? 您是否看过具有示波器的 I2C 信号? 我附加了一个示例、该示例使用 I2C0作为主器件、并将环路连接到 I2C2作为从器件。 您必须连接两个端口并在外部添加上拉电阻器。 使用"文件"、"导入"、"Code Composer Studio -> CCS 项目"、然后使用"选择存档文件"导入所附的项目。

    /cfs-file/__key/communityserver-discussions-components-files/908/0131.I2C_5F00_master2slave.zip

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

    正如供应商的'BOB'所指出的-'SysCtlClockSet ()'是(超出)奇数-这是完全错误的!
    这就是为什么 :海报的'SYSCTL_SYSDIV_1 | SYSCTL_USE_PLL'被证明是非法的!   它将系统时钟设置为全 PLL 频率-当然、这是不正确的!

    首先纠正该误差、然后才纠正、因为(长)此处应 显示每个 I2C 线路的"工作监控"。   I2C 故障排除-减去这些清晰的图像-非常费力、不必要地降低了效率。    ((可能)考虑对无电帮助器的"工作/时间需求"是合理的 crüe -当此类(适当的)范围上限被抑制时...)

    注意-海报以"不可检查"的形式( 即"slave_addr")向 此处的学员展示了"保存地址"。   当从器件地址进入"左移"状态(以容纳 I2C 的 R/W 位)时、错误的"保存地址"会在用户错误列表中上升"高电平"...   这里没有人可以检测和/或评论-如果用户选择了"保存地址"-当它被隐藏了!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢大家的快速回答、在我搜索一个错误时、我的代码中的很多问题似乎都是错误的、我要创建一个新错误。 系统时钟就是这种情况。
    实际上、除了我使用了错误的地址之外、我还使用了器件 ID 而不是供应商提供的地址。 我的错误是未能全面读取传感器数据表。 很抱歉耽误你的时间。 很棒!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢您-请注意、"早已观察到"、我们的 MCU 领域中的"仓促行事会浪费"、这种做法在绝大多数情况下都是真实的。

    足够智能、"阅读、理解和遵守" MCU I2C 数据部分以及传感器数据提供的指令。   确保使用外部上拉 Rs -并尽可能将"传感器和 MCU"之间的距离保持为"短距离和直接" (即低于0.5米)。    (I2C 不用作"双稳态"串行总线。)

    如果示波器"不可用"-可以使用(高效-低电流) LED监控(每个)两条 I2C 信号线。   (您必须(极大地)电流限制这些 LED、同时防止它们出现在 I2C 信号线上"过载和/或侵入"。)   (采用电压比较器或运算放大来监控每条信号线、并使用其(缓冲)输出来驱动 LED、这是最安全的!)

    一如既往-启动时建议使用最慢(串行器件)的通信速度。   (为您的实施提供成功的"最佳机会"!)

    您的传感器很复杂-如果您遇到(持续)困难-您对基于 I2C 的最小容量 EEPROM 的使用长期以来已证明一种卓越的方法-"最快速、最轻松"-构建通向"I2C 成功之路。"    (这只是纯粹的"亲吻"-在"基本知识"得到验证后、始终规定"植入性"(仅在稍后))-介绍复杂的系统!   (您的高级传感器)