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.

[参考译文] EK-TM4C1294XL:I2C 从器件 ACK

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/987454/ek-tm4c1294xl-i2c-slave-ack

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:PCF8574A

我向 I2C 线路添加了10 K 上拉电阻器。 昨天、CLK 和数据线在示波器中清晰可见。 我昨天使用的评估板爆炸了、我今天带来了一个新的评估板。 我连接了它、并且正在运行 I2C 环回示例(未连接从器件、注释掉了 UART printf)、并且 I2C 时钟不会显示在示波器上。 上拉电阻仍然为10 K。评估板正常、运行时呈闪烁。 我不是很好。

谢谢、

Priya

CLK 回来了。 我进行了一些万用表测量

时钟问题已解决。 但是、我需要了解从器件 ACK 的工作原理。 器件为 PCF8574A、这是一款无寄存器的8位 I2C I/O 扩展器芯片。 如果我写入地址并等待、我在示波器上看不到任何 I2C CLK 触发器。 I2C 活动仅在 I2CMasterControl ( I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND)之后可见;

您是否有任何关于如何处理 ACK 信号的指针?

谢谢  

Priya

uint32_t g_ui32SysClock;
int main (空)

volatile uint32_t ui32Loop;

//
//使用前必须启用 I2C0外设。
//
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);

//
//对于本示例,I2C0与 PortB[3:2]一起使用。 实际端口和
//使用的引脚可能与您的器件不同、请参阅的数据表
//更多信息。 GPIO 端口 B 需要启用、因此这些引脚可以
//使用。
// TODO:将其更改为您正在使用的 GPIO 端口。
//
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

//
//为端口 B2和 B3上的 I2C0功能配置引脚复用。
//如果您的器件不支持引脚复用、则无需执行此步骤。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinConfigure (GPIO_PB2_I2C0SCL);
GPIOPinConfigure (GPIO_PB3_I2C0SDA);

//
//为这些引脚选择 I2C 功能。 此函数也会
//为 I2C 操作配置 GPIO 引脚,将其设置为
//开漏操作,弱上拉。 请参阅数据表
//查看每个引脚分配了哪些功能。
// TODO:更改此选项以选择您正在使用的端口/引脚。
//
GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);

//初始化相关的外设和端口

while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));


SysCtlPeripheralDisable (SYSCTL_Periph_I2C0);
SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);


//初始化400kbps 的主站和从站//extern uint32_t g_ui32SysClock;
I2CMasterInitExpClk (I2C0_BASE、g_ui32SysClock、false);//快速模式= true (400kB/s)
I2CMasterEnable (I2C0_BASE);

while (1)

I2CMasterSlaveAddrSet (I2C0_BASE、MOSFET_ADDRESS、1);
for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +)

I2CMasterDataPut (I2C0_BASE、红色);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +)

/*
I2CMasterSlaveAddrSet (I2C0_BASE、MOSFET_ADDRESS、0);
I2CMasterDataPut (I2C0_BASE、绿色);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +)


I2CMasterSlaveAddrSet (I2C0_BASE、MOSFET_ADDRESS、0);
I2CMasterDataPut (I2C0_BASE、琥珀色);
I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +)


*

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

    您好、Priya、

    [引用 userid="318358" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/987454/ek-tm4c1294xl-i2c-clk-vanished-from-scope ]CLK 回来。 我进行了一些万用表测量[/报价]

    此问题现在是否已解决?

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

    下面是 I2C 写入的图片。 在 ACK 来自从器件之前、数据被写入。

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

    您好、Priya、

    而不是在您设置的循环中等待、而是使用以下命令:

        //
        // Wait until the I2C transaction is complete.
        //
        while(MAP_I2CMasterBusy(I2C0_BASE))
        {
        }

    您也可以参考此示例 [Install Path]\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl-bootstxl-senshub\humid_sht21_simple

    以及我们的 I2C 应用手册: http://www.ti.com/lit/pdf/spma073

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

    Ralf、

    我更新了下面粘贴的代码。 从机地址为0x26。 我看到启动条件。 覆盖层中总共有9个可见时钟周期。 SDA 线路上的最后一个1是否为 ACK? 我看不到我尝试写入此器件的数据字节。 我想确保正确设置了 Tiva 传输。 我是否还会将其发布在接口论坛中?

    非常感谢您的帮助。

    数据字节绿色为0x02。

    谢谢、

    Priya

    uint32_t g_ui32SysClock;
    int main (空)

    volatile uint32_t ui32Loop;

    //
    //使用前必须启用 I2C0外设。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);

    //
    //对于本示例,I2C0与 PortB[3:2]一起使用。 实际端口和
    //使用的引脚可能与您的器件不同、请参阅的数据表
    //更多信息。 GPIO 端口 B 需要启用、因此这些引脚可以
    //使用。
    // TODO:将其更改为您正在使用的 GPIO 端口。
    //
    SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);

    //
    //为端口 B2和 B3上的 I2C0功能配置引脚复用。
    //如果您的器件不支持引脚复用、则无需执行此步骤。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    GPIOPinConfigure (GPIO_PB2_I2C0SCL);
    GPIOPinConfigure (GPIO_PB3_I2C0SDA);

    //
    //为这些引脚选择 I2C 功能。 此函数也会
    //为 I2C 操作配置 GPIO 引脚,将其设置为
    //开漏操作,弱上拉。 请参阅数据表
    //查看每个引脚分配了哪些功能。
    // TODO:更改此选项以选择您正在使用的端口/引脚。
    //
    GPIOPinTypeI2CSCL (GPIO_PORTB_BASE、GPIO_PIN_2);
    GPIOPinTypeI2C (GPIO_PORTB_BASE、GPIO_PIN_3);

    G_ui32SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);

    //初始化相关的外设和端口

    while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOB));


    SysCtlPeripheralDisable (SYSCTL_Periph_I2C0);
    SysCtlPeripheralReset (SYSCTL_Periph_I2C0);
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C0);


    //初始化400kbps 的主站和从站//extern uint32_t g_ui32SysClock;
    I2CMasterInitExpClk (I2C0_BASE、g_ui32SysClock、false);//快速模式= true (400kB/s)
    I2CMasterEnable (I2C0_BASE);


    while (1)

    I2CMasterSlaveAddrSet (I2C0_BASE、MOSFET_ADDRESS、0);

    I2CMasterDataPut (I2C0_BASE、绿色);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
    while (I2CMasterBusy (I2C0_BASE))

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

    /*
    I2CMasterSlaveAddrSet (I2C0_BASE、MOSFET_ADDRESS、0);
    I2CMasterDataPut (I2C0_BASE、绿色);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
    for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +)


    I2CMasterSlaveAddrSet (I2C0_BASE、MOSFET_ADDRESS、0);
    I2CMasterDataPut (I2C0_BASE、琥珀色);
    I2CMasterControl (I2C0_BASE、I2C_MASTER_CMD_SINGLE_SEND);
    for (ui32Loop = 0;ui32Loop < 200000;ui32Loop +)


    *

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

    您好、Priya、

    波形对我来说并不是很正确。 ACK 将是低电平、而不是高电平。 有关详细信息、请参阅此应用手册: https://www.ti.com/lit/an/slva704/slva704.pdf

    我今天可能无法运行您的代码进行测试、因此我希望我分享的资源能帮助您取得进展。 我不确定接口论坛是否有帮助、因为我认为这是当前 TM4C 问题。

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

    e2e.ti.com/.../MosfetI2C.zip

    我仍在使用 TivaWare_C_Series-2.1.4.178

    我已将导出的项目附加到该消息以及从 I2C 传出的单字节传输的示波器图片、如示波器中所示。  在可见的前8个 CLK 周期中、看到的地址为01001100。 MOSFET 地址为0x26、示波器显示为0x4C。 这是写入信号、0是否移入 LSB? 我需要确认并根据需要进行解释。  随附的示波器图片似乎显示了正确的起始条件、地址和 NACK。

    应用手册 slva704.pdf 的图8未显示启动条件。 它显示了8个数据位、后跟 ACK。

    期待您的回应。

    Priya

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

    您好、Priya、

    [引用 userid="318358" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/987454/ek-tm4c1294xl-i2c-slave-ack/3649027 #3649027")这是不是将0位的写入信号移入 LSB? 我需要确认并根据需要进行解释。[/引述]

    是的。 这就是7位从地址的工作方式。

    图8确实显示了启动条件、您可能是指图7。 但我认为、由于 R/W 位切换、图9使其更加清晰。

    在此图中、您会看到首先写入器件地址。 它显示了开始条件 A6到 A0、然后是 R/W 位的0位、接着是 Ack。  您看到的0x4C 实际上是0x26、写入位为0。 然后、您可以查看第三个数据包、它们在其中使用重复起始、这次发送器件地址时显示 A6-A0、然后显示 R/W 为1位、以指示读操作、然后是 ACK。