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.

[参考译文] PCF8574:数据写入不正确。

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1039145/pcf8574-data-is-not-being-written-properly

部件号:PCF8574
主题中讨论的其他器件: MSP430F5438A

您好!

我将 I2C3 (USCI)模块用作主器件、将 PCF8574用作从器件。 我使用的是 MSP430F5438A 微控制器。

我想写入0x08、0x04、0x00的值、以便根据我的应用使用运行时来切换(P2、P3)端口引脚。

因此、当我给出命令0x08 (P2 = 0、P3 = 1)时、引脚配置正确、但当我写入0x04 (P2 = 1、P3 = 0)或时

0x00 (P2 = 0、P3 = 0)它显示 P2和 P3始终为1。

因此0x08正常工作、但0x04和0x00我的器件有问题。

因此、我想知道我为什么面临这些问题。 我已正确参考数据表、但未找到器件是否正在复位。

我还在示波器上获得0x04和0x08的适当波形、以确保数据传输正确与否。   

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

    "显示"是什么意思? 您是读取 I²C、还是测量某些东西?

    请显示这些波形。

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

    实际上、我们使用万用表测量的那些(P2、P3)引脚。

    如果 IO 引脚为1、则为3.3V

    如果 IO 引脚为0、则为0v

    因此、如果写入0x08、我们将得到 P2 = 0v 且 P3 = 3.3V

    但对于0x04和0x00、我们得到 P2 = 3.3V 和 P3 = 3.3V

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

    请显示 thosw 波形。

    您是否读回相同的值?

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

    马德哈夫

    感谢您的支持! 除了上面的 Clemens 问题之外、您能否澄清一下:您是否尝试过0x08、0x04和0x00以外的任何其他命令来查看您是否遇到了其他问题? 如果启动后的第一个命令是0x04、您是否发现了相同的问题?

    寻址此器件时、请注意它不支持重复的 START 命令。 要解决此器件的问题、您必须先发出 STOP 命令、然后发出单独的 START 命令。 此外、仅将地址之后的第一个数据字节应用于输出。 确保在每次寻址器件时发送0x08、0x04和0x00设置为完全不同的命令。

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

    你好、Danny

    感谢您的回复。

    在启动后、我为其提供的任何值都可以正常工作。

    这是 I2C 写入代码、通常我用于写入任何从器件。

    PCF8574也是如此

    U8Slave = 0x20

    u8RegOffset = 0x00

     u8TxData = 0x08 (用户的任意值)

    ********* I2C 写入代码*****

    UCB3I2CSA = u8从器件;

    while (UCB3CTL1 & UCTXSTP);
    UCB3CTL1 |= UCTR + UCTXSTT;

    while (!(UCB3IFG & UCTXIFG));
    UCB3TXBUF = u8RegOffset;

    while (!(UCB3IFG & UCTXIFG));
    UCB3TXBUF = u8TxData;  

    while (!(UCB3IFG & UCTXIFG));
    UCB3CTL1 |= UCTXSTP;
    UCB3IFG &=~UCTXIFG;

    (三

    因此、每次我发出不同 的命令时、我的上代码都将被执行。

    那么、我可以在每次生成 START 和 STOP 条件时说什么吗??

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

    我还发现、板载启动时的一切工作正常。

    但是、当我发出命令时、不会生成 START、这意味着我在 SDA 线上看不到任何从高电平到低电平的转换  

    高电平。

    如果我继续操作、我能够看到数据波形和停止条件。

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

    马德哈夫

    感谢您分享您的代码。 我将与与与 MSP430密切合作的同事联系、看看他们能否在这里提供一些有关不生成启动条件的其他见解。

    [引用 userid="488602" URL"~/support/interface-group/interface/f/interface-forum/1039145/pcf8574-data-is-not-being-written-properly/3844375 #3844375"]

    当我发出命令时、不会生成 START、这意味着我在 SDA 线上看不到任何从高电平到低电平的转换  

    高电平。

    [/报价]

    如果 PCF8574 (或任何其他 I2C 目标器件)没有看到启动条件、则不会确认发送的任何数据。

    如果您能够分享您在示波器上看到的成功且有问题的 I2C 波形的图像、我们将更容易帮助您进行诊断。 要包含图像、请在文本框中单击"插入">"图像/视频/文件"、如下所示:

    最棒的

    Danny

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

    您好、Madhav、

    本应用手册可能也很有用、它介绍了在使用 MSP430 USCI :www.ti.com/lit/pdf/slaa734时需要检查 I2C 的内容 这些波形也很有用。

    此致、

    Katie 码头

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

    你(们)好

    下面是观察开始、停止时我采取的一些快照。 寄存器偏移和数据波形。

    1.起动条件

    2.从机地址(0x20)

    3)数据1 - 0x08

    4)数据2 - 0x04

    5)停止条件

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

    您好、Madhav、

    您能否共享其余代码? 您的设置可能会出现问题。

    谢谢、

    王国新

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

    你(们)好、Urica

    以下是我的代码。

    /* I2C3引脚 P10.1、P10.2选项选择*/
    P10SEL |= BIT1 + BIT2;

    /* UBC3模块配置*/

    UCB3CTL1 |= UCSWRST;

    UCB3CTL0 = UCMST + UCMODE_3 + UCSYNC;  
    UCB3CTL1 = UCSSEL_2 + UCSWRST;
    UCB3BR0 = 12;
    UCB3BR1 = 0;
    UCB3CTL1 &=~UCSWRST;

    /* I2C 写入驱动程序*/

    UCB3I2CSA = u8从器件;

    while (UCB3CTL1 & UCTXSTP);
    UCB3CTL1 |= UCTR + UCTXSTT;

    while (!(UCB3IFG & UCTXIFG));
    UCB3TXBUF = u8RegOffset;

    while (!(UCB3IFG & UCTXIFG));
    UCB3TXBUF = u8TxData;  

    while (!(UCB3IFG & UCTXIFG));
    UCB3CTL1 |= UCTXSTP;
    UCB3IFG &=~UCTXIFG

    这与我在启动代码中使用的代码相同。

    因此、我启动每个值都是有效的、但当我希望在运行时更改时、我遇到了一个问题。

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

    如果我在引导时写入多个值、那么它也可以正常工作。

    另一个观察结果是、我还尝试了通过命令运行时的值、然后一些值正常工作、有些值不工作。

    例如、20、28、24、2C 值起作用

    00、04、40、0C 不工作。

    如果在电路板启动时工作、则意味着我的 I2C 配置和写入代码工作正常。 不是吗?

    我仅在运行时面临的问题。

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

    此代码似乎向器件写入2个字节、其中第一个字节始终为0x00。 正如 Danny 所指出的、第二个字节(有趣的字节)被忽略[参考数据表(SCPS068J)第8.3.1节]。

    我不确定我是否能解释您的所有症状、但如果您删除了 u8RegOffset 的写操作、会发生什么情况?