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.

[参考译文] TM4C I2C 问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/671636/tm4c-i2c-problem

主题中讨论的其他器件:TM4C123

大家好、

我遇到了无法在 TM4C 上初始化 I2C 的问题。 这是我的代码。 我想 i2c send 函数是可以的、但我认为我的问题是要初始化 i2c3_base。 我搜索了一些其他代码(示例或其他代码)、但无法使其为真。 请提供帮助。


#include
#include
#include
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"


typedef 枚举 I2CResultTypes

ACK_Received、
ACK_ERROR
}I2CResultType;

typedef 枚举 I2CTypes

I2C0、
I2C1、
I2C2、
I2C3
}I2CType;

typedef 枚举 I2cRegisters

VREG_A = 0x11、
VREG_B、
NVREG_A = 0x21、
NVREG_B、
}I2c 注册;

typedef 枚举 I2cAddes

ADDRESS0 = 0x28、
地址1 = 0x29、
地址2 = 0x2A、
地址3 = 0x2B、
地址4 = 0x2C、
地址5 = 0x2D、
地址6 = 0x2E、
地址7 = 0x2F
}I2c 地址;

I2CResultType I2C_Send (I2CType i2cPort、unsigned char slaveAddress、unsigned char regAddress、unsigned char 数据)

INT 结果;
I2CMasterIntClear (i2cPort);
I2CMasterSlaveAddrSet (i2cPort、slaveAddress、0);
I2CMasterDataPut (i2cPort、regAddress);
I2CMasterControl (i2cPort、I2C_MASTER_CMD_BURST_SEND_FINISH);
while (I2CMasterBusy (i2cPort));
结果= I2CMasterErr (i2cPort);

if (结果!= I2C_MASTER_ERR_NONE)

返回 ACK_ERROR;

I2CMasterDataPut (i2cPort、data);
I2CMasterControl (i2cPort、I2C_MASTER_CMD_BURST_SEND_FINISH);
while (I2CMasterBusy (i2cPort));
结果= I2CMasterErr (i2cPort);

if (结果!= I2C_MASTER_ERR_NONE)

返回 ACK_ERROR;

返回 ACK_received;

void MAX5479_SetValue2 (无符号字符值)

I2CResultType 结果= ACK_ERROR;
I2CType I2C = I2C3;
I2cAddress 地址= 0x29;
I2c 寄存器 regAddress =0x11;

结果= I2C_Send (I2C3、0x29、0x11、值);

如果(结果= ACK_received)

asm ("NOP");

其他

asm ("NOP");

空 I2CInit (空)


SysCtlPeripheralEnable (SYSCTL_Periph_I2C3);

SysCtlPeripheralReset (SYSCTL_Periph_I2C3);

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
//SysCtlPeripheralReset (SYSCTL_Periph_GPIOG);


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


GPIOPinConfigure (GPIO_PG0_I2C3SCL);
GPIOPinConfigure (GPIO_PG1_I2C3SDA);


I2CMasterInitExpClk (I2C3_base、SysCtlClockGet ()、false);

内部
main (空)

volatile uint32_t ui32Loop;

SysCtlClockSet (SYSCTL_SYSDIV_3 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_25MHz);
I2CInit();
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOK);

//
//检查是否启用了外设访问。
//
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOK))


GPIOPinTypeGPIOOutput (GPIO_PORTK_base、GPIO_PIN_3);

while (1)

MAX5479_SetValue2 (20);


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

    TM4C 系列有两个版本(123和129)、它们需要不同的代码处理。
    编辑您的"主题/标题"(TM4C)以包含您的实际 MCU 版本(即 TM4C123)将证明您的优势。

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

    感谢您-感谢您-下面是问题/意见:

    问题:

    [引用 user="halo_rmz"]无法 TM4C123上初始化 I2C

    您是如何得出这一结论的?   (未显示支持/理由。   是否无法证明"init"是正确的-并且(其他)出现了问题?)

    [引用 user="halo_rmz"]我猜 i2c send 函数是可以的

    您如何移动(超出)"猜测"?   您是否可以使用测试装置-理想情况下是示波器?   和已部署(更合适)的外部上拉电阻器?   (MCU 的价值太高、无法证明其强大!)   正确的诊断取决于/要求、"事实"。

    注释:

    您的代码(非常明显)兼容并蓄-展现出极大的理解和良好的努力。    然而、"多条件"和"极大灵活性"的演示(正如您的代码所示)可能不会证明"理想"、从而"快速轻松"(即不会发生意外)项目成功!    详尽的多条件代码"kiss"相差很远(非常远)。   (kiss =简单、战略性、高度专注、仅基本要素-旨在创建"易于衡量、狭隘的目标!")   

    此类(kiss)为"项目成功"提供了"最佳和最短"的途径。   代码"邀请问题"的"范围"以及来自多个来源的代码、极大地使任何调试变得复杂!   通常-必须(选择性)禁用 (许多)"此类详尽代码"的部分、以便(任何)有机会 "检测故障"。    "以更有限的代码库开始"-使(该)正常工作-(仅此)添加(许多)额外的"位/段?"是否会简单得多?    另请注意-这些额外的"位/片段"可以(很少)帮助您进行初始调试...   

    重要的是,有这么多 (伪装/侵入) “非基本要素”...  何处(以及如何)...  您是否(甚至)开始?

    商号/我会"亲吻"-(根据多年的经验)我很相信、"亲吻" 会、"速度、轻松和提升"您的成功-也会。   

    您会注意到您的问题、即 "TM4C I2C 问题" - 但您的问题是否更有可能证明您的问题" 过于宽泛"的方法和/或方法?"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否使用示波器检查了 SCL 和 SDA?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [报价 USER="CB1_MOBIT)]您是否可以访问测试设备-理想情况下是一个范围?   和已部署(更合适)的外部上拉电阻器?[/quot]

    也许(合理的)伟大的头脑-做-(有时)想得一样。   忽视上拉经常会降低、但海报"跑得越多"却显得突出、至少对本记者来说...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、
    我试图使它成立。 这是我的代码。 我还使用示波器进行了检查。 但从器件地址存在问题。 当我发送(从地址0x52)时、我看到2xSLAVE_ADDRESS = 0xA4。 我每次都看到它。 我的问题在哪里? 我的代码如下:

    #include
    #include
    #include
    #include "inc/hw_i2c.h"
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "inc/hw_gpio.h"
    #include "driverlib/gpio.h"
    #include "driverlib/i2c.h"
    #include "driverlib/pin_map.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/uart.h"
    #include "utils/uartstdio.h"

    空 I2CInit (空)


    SysCtlPeripheralEnable (SYSCTL_Periph_I2C3);

    //SysCtlPeripheralReset (SYSCTL_Periph_I2C3);

    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
    //SysCtlPeripheralReset (SYSCTL_Periph_GPIOG);


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


    GPIOPinConfigure (GPIO_PG0_I2C3SCL);
    GPIOPinConfigure (GPIO_PG1_I2C3SDA);


    I2CMasterInitExpClk (I2C3_base、SysCtlClockGet ()、false);



    内部
    main (空)

    volatile uint32_t ui32Loop、data_Byte = 0;
    SysCtlClockSet (SYSCTL_SYSDIV_3 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_25MHz);
    I2CInit();


    while (1)

    if (data_Byte <= 255)


    I2CMasterSlaveAddrSet (I2C3_base、0x52、0);
    I2CMasterDataPut (I2C3_base、0x13);
    I2CMasterControl (I2C3_base、I2C_MASTER_CMD_BURST_SEND_START);
    while (I2CMasterBusy (I2C3_base));

    I2CMasterDataPut (I2C3_base、data_Byte);
    while (I2CMasterBusy (I2C3_base));
    I2CMasterControl (I2C3_base、I2C_MASTER_CMD_BURST_SEND_FINISH);
    data_Byte=data_Byte + 10;

    其他

    DATA_BYTE = 0;

    for (ui32Loop = 0;ui32Loop < 2000000;ui32Loop +)