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.

[参考译文] TMS320F28379D:读取 PCF8574A I/O 扩展器的 P0-P7

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander

器件型号:TMS320F28379D
主题中讨论的其他器件:PCF8574AC2000WAREENERGIAPCF8574MSP430G2553TCA9534

您好!

我使用的是具有 PCF8574A 的 LaunchXL -F28379D。 对于我的应用、P0-P7引脚被上拉或下拉、我想将其读作二进制模式。 例如、0000 1000将读取为8。

我知道 PCF8574A 的从器件地址为0x38至0x3F。 在我的情况下、我的每个 LaunchPad 上只有一个 IO 扩展器、因此我将使用0x38 (即 A0、A1、A2全部接地)。

我尝试使用 i2c_ex4_EEPROM_POLLING 示例作为 I2C 通信的参考、因为我不使用中断线路。

您能否指导您如何继续读取引脚 P0-P7?  

此致、

Rashmitha

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

    您好 Rashmitha、

    我不确定我是否理解您要做的事情。 您是否正在尝试确定 F28379D 器件上的 P0-P7是否 启用了上拉电阻器? 有一个寄存器用于控制上拉禁用、但我不确定如何确定引脚是否配置为上拉或下拉、因为如果未使用上拉禁用寄存器、这将更多地取决于硬件设置。 如果我不理解 您要实现的目标、请告诉我。

    此致、

    Omer Amir

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

    您好 

    感谢您的回答。

    我的应用具有多个 LaunchPad、我使用 IO 扩展器获取每个 LaunchPad 的物理位置(位置)。 为此、我根据 launchpad 的物理位置永久焊接了上拉或下拉电阻器(外部;不使用您提到的寄存器)。  
    例如、第三个电路板将上拉 P0和 P1引脚、并下拉 P2至 P7。 我指的是 PCF8574A 上的 P0-P7。  我想通过 I2C 从 F28379D 读取这些引脚的值。

    此致、

    Rashmitha

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

    您好 Rashmitha、

    如果您将这些引脚读取为输入、您能否控制 每个引脚的状态(即、对于上拉/下拉电路、引脚是开路还是闭合)? 如果是、您可以将它们全部设置为开关处于打开状态、并读取传入值以确定它是否是上拉/下拉。 这是我唯一可以想到的确定引脚的方法是上拉/下拉条件。   如果另一个器件要检查 PCF8574A、则可能需要某种握手来使其发生。 请告诉我这是否有帮助。

    此致、

    Omer Amir

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

    您好 

    我不确定您对开关每个引脚的打开和关闭状态的理解。 请详述一下。

    是否有任何示例项目可用于读取使用 F28379D 作为 I2C 主设备的 PCF8574A 的输入? 我找不到任何与此芯片相关的编程文档。 请向我介绍可用于 PCF8574A 的示例或文档吗?

    此致、

    Rashmitha

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

    您好 Rashmitha、

    通过引脚的开路状态、我的意思是以下内容:

    但是、您已经配置 了您提到的引脚、将它们全部设置为开路状态(即物理开路开关)、并且您应该能够通过电压来判断它使用的电阻器类型(上拉与下拉)。  由于您提到过它们被永久焊接、这些位置是否始终处于已知位置? 如果这样、您只需在软件中对其进行硬编码、就无需读取引脚。

    关于  PCF8574A、我不确定由谁管理该器件的示例和文档。 现在、您可以在 TI 的网站上查看 数据表和其中提供的其他文档、我将看到我是否可以找到任何其他内容。 要将 F28379D 用作 I2C 控制 器、您可以查看 C2000Ware 中提供的示例:C2000Ware_4_XX_XX_XX\driverlib\f28372c\examples\CPU1\ixd。

    此致、

    Omer Amir

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

    您好 

    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4424177 #4424177"]如果您只需在软件中对其进行硬编码,则无需读取引脚。

    我们希望在生产阶段的所有器件上使用相同的软件、这就是为什么在设计中引入了此 IO 扩展器、以便我们可以配置/焊接电阻器、并让它们指示每个 Launchpad 的物理位置。 从属 LaunchPad 将读取其自己的 IO 扩展器芯片、读取其中配置的值并将其物理位置编号报告给主 LaunchPad。

     

    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4424177 #4424177"]现在、您可以在 TI 的网站上查看 数据表和其中提供的其他文档、我将看到我是否可以找到任何其他内容。

    我一直在浏览这个芯片的网站、除了有关引脚读取过程的理论解释之外、没有示例或编程相关的帮助。  

    [引用 userid="515979" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4424177 #4424177"]要将 F28379D 用作 I2C 控制器、可以查看 C2000Ware 中提供的示例: C2000Ware_4_XX_XX_XX\driverlib\f2837xd\examples\cpu1i2c.

    谢谢。 我指的是 C2000Ware 中的 I2C 示例。  

    如果有任何简单的演示项目可用于读取 PCF8574A 上的引脚、请务必告知我。

    此致、

    Rashmitha

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

    您好、Rashmitha、

    我们不为 PCF8574A 提供任何演示项目/代码。 在相当多的 TI 器件上使用 MSP430的在线材料具有相似的寄存器读/写操作。 此外、网络上还有一些使用诸如 Arduino/Energia 等高级程序的代码、用于与 PCF8574A 类似的多个 I2C 器件。  

    此致、

    Tyler

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

    尊敬的

    感谢你的答复。

    [引用 userid="450801" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4424943 #4424943"]在相当多的 TI 器件上使用 MSP430的在线资料与寄存器读取/写入类似。

    您能为我提供与  PCF8574A 相似的器件名称、并为其提供基于 MSP430的帮助吗?

     

    我知道 您没有适用于 PCF8574A 的任何演示代码。

    但我甚至看不到列出寄存器、寄存器地址、器件 编程步骤流程图或指导的文档。

    我在 TI 网站上唯一可以看到的文档是数据表、它不会为首次使用此芯片的用户提供大量信息。

    此致、

    Rashmitha

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

    您好、Rashmitha、

    这是一段时间前发布到在线 e2e 论坛的另一位客户的一些示例代码。 链接 此处

    此人开始使用 MSP430G2553和 PCF8574进行编码。 请注意、有很多设置可使 I2C 在 MSP430上工作、因此设置函数中的所有位都设置了。 您还必须创建自己的 I2C 写入/读取函数、因为这些函数不是内置的。 如果您需要已内置 I2C 命令的更高级别代码、请尝试使用 Arduino 或 Energia IDE。  

    这里是我找到的另一个链接、其中包含一些代码

    我不保证这些编码示例能够正常工作、但它们确实是正确对 MSP430进行编程的良好起点。  

    您还可以在线查找 TCA9534或通常包含 tcal、TCA 或 PCA 前缀的任何 I/O 扩展器系列的示例代码。 大多数器件都有类似的方法来读取/写入寄存器中的数据。  

    第8.4节来自 PCF8574A 的数据表。 这让您大致了解如何写入 I/O 扩展器。 首先发送地址、然后是要为每个 p 端口设置的数据。  

    此器件非常旧(从2001年起)。 我们的 PCA、TCA 和 tcal 器件提供了有关寄存器功能的更深入的说明、在对这些器件进行编码时非常方便。  

    如果我能进一步澄清、请告诉我、

    此致、

    Tyler

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

    尊敬的 

    非常感谢您的详细答复。

    [引用 userid="450801" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4426195 #4426195)]我不能保证这些编码示例能够正常工作,但它们无疑是正确对 MSP430进行编程的良好起点。  [/报价]

    我没有尝试使用 MSP430实现、我正在使用 F28379D Launchpad。 您是否对 C2000器件有任何了解?

    问题1:

    我指 的是 C2000ware 中的 I2C 示例 i2c_ex4_EEPROM_POLLING.c。 我无法映射的一件事是、在读取/写入 EEPROM 时、有一个通过地址传递的 ControlAddr 参数。 如果我尝试访问端口 P0-P7、该地址是什么?

    问题2:

      多次尝试检查总线是否占线之间的延迟(以微秒为单位,delay_us)是否为4.7 us? 我正在查找要在以下函数中使用的值

    问题3:

    在步骤流程中的哪个点(下面列出的列表)、此8.3.2表中提到的数据字节是从 PCF8574A 发送到 I2C 主设备的?

    问题4:

    以下哪一项应用于检测 PCF8574A 的确认?

    下面是我对读取操作步骤流程的理解(我只想读取 P0-07 (高电平或低电平)的状态)

    主器件发送起始条件

    2.主器件发送 R/W 位(LSB)为0x 38和0x01的从器件地址

    3.主机发送停止条件

    从器件发送确认信号

    从器件发送数据 P0-P7

    我不使用 INT 线路、它只是上拉而未连接到 launchpad。

    如果我没有执行任何步骤、请提出建议。

    此致、  

    Rashmitha

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

    您好、Rashmitha、

    今天(CST 时间)结束时、我将会再次与您讨论。

    此致、

    Tyler

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

    Rashmitha、

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4426598 #4426598"]我不想使用 MSP430实现、而是使用 F28379D Launchpad。 您是否有任何与 C2000器件相关的信息?

    我们的团队没有提供与 C2000相关的代码。  

    问题1:

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4426598 #4426598"]我指 的是 C2000ware 中的 I2C 示例 i2c_ex4_EEPROM_POLLING.c。 我无法映射的一件事是、在读取/写入 EEPROM 时、有一个通过地址传递的 ControlAddr 参数。 如果我尝试访问端口 P0-P7、该地址是什么?

    首先发送由控制器器件启动的启动条件。 然后、根据数据表第8.3.2节中的表定义发送器件地址字节+读取/写入位:

    如果 R/W 位为高电平、则器件数据是从 P 端口读取的值。

    如果 R/W 位为低电平、则控制器的数据将输出到 P 端口

    问题2:

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4426598 #4426598"]是  多次尝试检查总线是否繁忙之间的延迟(微秒(delay_us),是4.7 us 吗? 我正在查找要在以下函数中使用的值[/QUERT]

    Tbuf 是基于 I2C 时序标准的停止和启动条件之间的总线空闲时间。 停止位和起始位之间的时间最小为4.7us。

    问题3:

    我相信我在问题2中回答了这个问题。  

    请阅读数据表第13页的第8.3.1节 I2C 接口部分。

    问题4:  

    [引用 userid="493381" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175162/tms320f28379d-reading-p0-p7-of-pcf8574a-i-o-expander/4426598 #4426598"]应使用以下哪一项来检测来自 PCF8574A 的确认?

    我不太熟悉 C2000ware、但乍一看、您可能会使用模块 I2C_STS_NO_ACK (无确认)或 I2C_STS_NACK_SENT (发送了 NACK)。 根据这些状态位、您可以确定是否从 PCF8574发送了 ACK。  

    我认为您为停止条件所采取的步骤已关闭。

    根据 数据表的第10页、我们可以确认 I2C 事务的正确顺序。

    控制器发送一个启动条件。

    控制器发送目标地址(PCF8574A 地址)、然后发送 R/W 位

    3.确认由 PCF8574A 发送到控制器

    4.从 p 端口读取数据

    5.确认由 PCF8574A 发送到控制器(每次重复读取都会重复此操作)。 当通信完成时、控制器将一个停止条件置为有效。

    如果您有任何疑问、请告诉我。

    此致、

    Tyler

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

    尊敬的

    非常感谢详细的解释。 我现在能够从引脚读取数据。

    但是、我没有得到引脚 P7的值。 即使在引脚被上拉且可使用万用表读取为5V 时、I2C 读取也仅取0。

    我在多个 IC 上尝试过、在我使用的所有 IC 上都存在相同的问题。 这是已知问题吗?

    我在100kHz 时使用 I2C、下面是我的读取函数。 我可以使用地址0x38通过 C2000ware 库中提供的 I2CBusScan 函数来检测 I2C 网络上的器件。   

    STATUS_I2C i2cRead(I2CFRAME *msgFrame)
    {
        uint8_t *frame = msgFrame->msgBuffer;
        const int ATTEMPTS = 5000;
        STATUS_I2C status = SUCCESS_RTC;
        I2C_disableFIFO(I2C_PORT);
        I2C_enableFIFO(I2C_PORT);
    
        if (isFuncValid((FuncPtr) I2C_getStopConditionStatus, false, ATTEMPTS))
        {
            //  printf("\nI2C_getStopConditionStatus: i2cMasRead success\n");
            if (isFuncValid((FuncPtr) I2C_isBusBusy, false, ATTEMPTS))
            {
                int buffLoc = 0;
                status = I2C_TransmitSlaveAddressControlBytes(msgFrame);
                I2C_setConfig(I2C_PORT,
                              (I2C_MASTER_RECEIVE_MODE | I2C_REPEAT_MODE));
                I2C_setSlaveAddress(I2C_PORT, msgFrame->slaveAddr);
                I2C_setDataCount(I2C_PORT, msgFrame->numOfBytes);
                I2C_sendStartCondition(I2C_PORT);
                while (!(I2C_getStatus(I2C_PORT) & I2C_STS_REG_ACCESS_RDY))
                    ;
    
                for (int i = 0; i < (msgFrame->numOfBytes) / I2C_FIFO_LEVEL; i++)
                {
                    if (!isFuncValid((FuncPtr) I2C_getRxFIFOStatus, I2C_FIFO_RXFULL,
                                     ATTEMPTS))
                    {
                        //     printf("i2c Rx FAILED %d\n",i);
                        break;
                    }
                    else
                    {
                        for (int i = 0; i < I2C_FIFO_LEVEL; i++)
                        {
                            frame[buffLoc++] = I2C_getData(I2C_PORT);
                            //        printf("Rx i2c Success %d %d\n", buffLoc-1,frame[buffLoc-1]);
                        }
                    }
                }
    
                uint16_t remainingBytes = ((msgFrame->numOfBytes) % I2C_FIFO_LEVEL);
                if (!isFuncValid((FuncPtr) I2C_getRxFIFOStatus, remainingBytes,
                                 ATTEMPTS))
                {
                    //      printf("i2c Rx FAILED @ 2\n");
                }
                I2C_sendStopCondition(I2C_PORT);
                for (int i = 0; i < remainingBytes; i++)
                {
                    frame[buffLoc++] = I2C_getData(I2C_PORT);
                    //    printf("Rx i2c Success-2 %d %d\n", buffLoc-1,frame[buffLoc-1]);
                }
                //    printf("Read done @ %d\n",buffLoc);
                status = handleNACK(I2C_PORT);
                if (status)
                {
                    return status;
                }
                else
                {
                    I2C_disableFIFO(I2C_PORT);
                    if (isFuncValid((FuncPtr) I2C_getStopConditionStatus, false,
                                    ATTEMPTS))
                        ;
                }
            }
            else
            {
                status = ERROR_BUS_BUSY;
            }
        }
        else
        {
            status = ERROR_STOP_NOT_READY;
        }
        //  printf("Completed MasterRead\n");
        return status;
    }

    您能否检查您的任何可用芯片是否可以重现此问题? 因为我们可以在我们焊接在 PCB 上的大约21个芯片上看到这一点。

    下面是用于读取操作的 SCL 和 SDA 线的屏幕截图、引脚上的值为 P7高电平、P6低电平、P5高电平。 但我无法使用代码将 P7读取为高电平、其他2个值被正确读取。 如果您能够解码示波器图像、P4和 P0也可能是高电平。 这可以忽略、因为这些引脚保持悬空并且未被下拉。

    此致、

    Rashmitha

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

    Rashmitha、

    Tyler 将于 下周上班。 请留出一些时间让他回到这个话题。

    此致、

    Eric Hackett  

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

    您好

    您能否与另一位 I2C 专家交流? 我正在尝试得到这个已解决的结果。

    此致、

    Rashmitha

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

    Rashmitha、

    您是否已将引脚设置/写入为输出高电平? 此器件的输入引脚需要设置为高电平。 如果在此之前的任何写入事务对端口位执行写低电平操作、那么当您执行读事务时、它将始终读为低电平。  

    另请注意、该器件仅提供引脚的当前状态、不会提供任何先前的更改、例如按钮按下和释放。 如果您在按下按钮期间读取、则您将看到该状态、如果您在释放后读取、您将看到释放状态。  

    -Bobby