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.

[参考译文] MSP432P401M:API、用于在 llC.h 文件中发送 NACK、以便与具有 I2C 的 FDC2212通信

Guru**** 2535750 points
Other Parts Discussed in Thread: FDC2212, MSP430FR5969, TIDA-00466

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/600077/msp432p401m-api-to-send-nack-in-llc-h-file-to-communicate-with-fdc2212-with-i2c

器件型号:MSP432P401M
主题中讨论的其他器件: FDC2212MSP430FR5969TIDA-00466

尊敬的先生/女士:

我的客户正在使用 MSP432P401M 和 FDC2212进行电容感应。

参考 FDC2212数据表、在 I2C 读取期间、需要从 MSP432发送 NACK 和 STOP。  

您能否告知 我们是否会有 EUSCI_B_I2C DriverLib 命令/API 来返回 FDC2212?

MSP430中有一个用于在 IIC.h 文件中发送 NACK 的 API。 API 是否适用于 MSP432P401M?

 

希望很快收到您的回复。  谢谢。

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

    通过置位 UCTXSTP 位可以发送一个 NACK 信号。 它由设置,例如通过 I2C_ReceivmasterSingleByByte()或 I2C_masterSendSingleByteWithTimeout()等函数设置。  

    当你调用这些函数中的一个时、主机模块使用该函数来发送一个字节。 此函数发送 START、将字节发送到从器件并发送 STOP。 停止后、UCTXSTP 位将置位、并根据 TRM 生成 NACK、请参阅以下内容:

    请参阅 Driverlib API 文档和 TRM。  

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

    您好 Evan、

    感谢您的友好解释。 请帮助检查我的客户提供的代码。

    请检查 EUSCIB3_IRQHandler 中的代码

    第一。 如果不添加线路 MAP_I2C_masterReceiveSingle、则 I2C 总线在读取一次后挂起。

    2。 添加 MAP_I2C_ReceivmasterSingle、然后总线在读取导致 MSP 发送 NACK 位后不挂起。

      但 MAP_I2C_ReceivmasterSingle 将向从器件发送额外的8位时钟、从而在下次读取时导致数据错误。

      IF (iStatus 和 EUSCI_B_I2C_Receive_INTERRUPT0)

          {

            if (RXByteCtr = RXData[NUM_OF_PAGE_BYes]){

              MAP_I2C_masterReceiveMultiByteStop (CAT24_I2C_base);

              MAP_I2C_masterReceiveSingle (CAT24_I2C_base);// I2C 发送否定应答

              //# map_I2C_masterReceiveSingleByte (CAT24_I2C_base);// I2C 总线挂起

              //# map_I2C_masterReceiveMultiByteNext (CAT24_I2C_base);//与 map_I2C_masterReceiveSingle 相同

              MAP_I2C_DisableInterrupt (CAT24_I2C_base、EUSCI_B_I2C_Receive_INTERRUPT0);

              MAP_I2C_setMode (CAT24_I2C_base、EUSCI_B_I2C_Transmit 模式);

              RXByteCtr = 0;

              CAT24_I2C_Mode = CAT24_I2C_IDLE;

              #if (!FW_RUN_MODE)

              MAP_Interrupt_disableSlepOnIsrExit();

              #endif

            }否则、如果(RXByteCtr <= RXData[NUM_OF_PAGE_BYes]- 1){

              RXData[RXByteCTR++]= MAP_I2C_ReceivmasterMultiByteNext (CAT24_I2C_base);

            }

          }

    如果代码更改为如下、则不会向从器件发送额外的8位时钟。

    但 I2C 总线将在读取一次后挂起。

      IF (iStatus 和 EUSCI_B_I2C_Receive_INTERRUPT0)

          {

            if (RXByteCtr = RXData[NUM_OF_PAGE_BYes]- 1){

              MAP_I2C_masterReceiveMultiByteStop (CAT24_I2C_base);

              MAP_I2C_masterReceiveSingle (CAT24_I2C_base);// I2C 发送否定应答

              //# map_I2C_masterReceiveSingleByte (CAT24_I2C_base);// I2C 总线挂起

              //# map_I2C_masterReceiveMultiByteNext (CAT24_I2C_base);//与 map_I2C_masterReceiveSingle 相同

              MAP_I2C_DisableInterrupt (CAT24_I2C_base、EUSCI_B_I2C_Receive_INTERRUPT0);

              MAP_I2C_setMode (CAT24_I2C_base、EUSCI_B_I2C_Transmit 模式);

              RXByteCtr = 0;

              CAT24_I2C_Mode = CAT24_I2C_IDLE;

              #if (!FW_RUN_MODE)

              MAP_Interrupt_disableSlepOnIsrExit();

              #endif

            }否则、如果(RXByteCtr <= RXData[NUM_OF_PAGE_BYes]- 2){

              RXData[RXByteCTR++]= MAP_I2C_ReceivmasterMultiByteNext (CAT24_I2C_base);

            }

          }

    如果遵循 i2c_master_rw_erial_start-master_code.c 中的 TI 示例代码、

    它只是一种解决方法、将错误数据替换为新数据。

    如果读取的数据超过3个字节、则可以正常工作。

    如果读取2个字节、代码将导致 I2C 总线挂起。

    如果只读取一个数据、则由于未发送停止位而无法正常工作。

    /*发送开始和发送缓冲区的第一个字节。 我们必须发送

      *两个字节、用于清理缓冲区中的前一个发送中的任何内容*/

      MAP_I2C_masterSendMultiByteStart (CAT24_I2C_base、TXData[TXByteCtr);

    MAP_I2C_masterSendMultiByteNext (CAT24_I2C_base、TXData[TXByteCtr +);

    /*将字节接收到接收缓冲区中。 如果我们已接收所有字节、

          *发送停止条件*/

          IF (iStatus 和 EUSCI_B_I2C_Receive_INTERRUPT0)

          {

            if (RXByteCtr = RXData[NUM_OF_PAGE_BYes]- 1){

              RXData[RXByteCTR++]= MAP_I2C_ReceivmasterMultiByteNext (CAT24_I2C_base);

              MAP_I2C_DisableInterrupt (CAT24_I2C_base、EUSCI_B_I2C_Receive_INTERRUPT0);

              MAP_I2C_setMode (CAT24_I2C_base、EUSCI_B_I2C_Transmit 模式);

              RXByteCtr = 0;

              CAT24_I2C_Mode = CAT24_I2C_IDLE;

              #if (!FW_RUN_MODE)

              MAP_Interrupt_disableSlepOnIsrExit();

              #endif

            }if (RXByteCtr = RXData[NUM_OF_PAGE_BYes]- 2){

              MAP_I2C_masterReceiveMultiByteStop (CAT24_I2C_base);

              RXData[RXByteCTR++]= MAP_I2C_ReceivmasterMultiByteNext (CAT24_I2C_base);

            }否则{

              RXData[RXByteCTR++]= MAP_I2C_ReceivmasterMultiByteNext (CAT24_I2C_base);

            }

        }

    感谢您的友好支持。

    e2e.ti.com/.../1715.i2c_5F00_master_5F00_rw_5F00_repeated_5F00_start_2D00_master_5F00_code.c

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


    我可以在今天稍后更深入地探讨这一点、但为了确保您的客户不会尝试重新创建滚轮、他们是否了解了使用 MSP430FR5969的 FDC 器件的 TI 参考设计的固件? Driverlib 代码与将在 MSP432上实现的代码非常相似。


    我这样说是因为他们似乎正在尝试使 FDC 器件与通用 MSP432示例代码一同工作、而不是与他们想要连接的器件所具有的示例代码。

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

    在 TIDA-00466所包含的固件中、有一个 I2C.c 文件、其中包含专为 FDC 器件编写的各种例程。 具体而言,有两个函数 i2c_readByte()和 i2c_readWord(),我认为这两个函数在您的客户环境中非常有帮助,有助于理解此通信所需的逻辑。 在 i2c_readWord()中有以下代码片段:

    while (1)
    {
    ISRStatus = EUSCI_B_I2C_getInterruptStatus (EUSCI_B0_BASE、EUSCI_B_I2C_Receive_INTERRUPT0);
    
    if (isrStatus = EUSCI_B_I2C_Receive_INTERRUPT0)
    {
    if (readCounter < 1)
    {
    pData[readCounter]= EUSCI_B_I2C_ReceivmasterMultiByteNext (EUSCI_B0_BASE);
    readCounter++;
    if (readCounter = 1)
    {
    pData[readCounter]= EUSCI_B_I2C_ReceivmasterMultiByteFinish (EUSCI_B0_BASE);
    break;
    }
    
    }
    

    以上并不是您的客户希望在代码的外部边界方面执行的操作、但从逻辑上讲、对于 i2c、这正是他们希望在接收多个字节时执行的操作。

    关于接收单个字节、这只能在 FDC 器件的实例中完成、以读取 TI 提供的 TIDesign I 中的器件 ID、并最终可以在单独的 funciton (在 TID 下载中的 i2c.c 文件中包含 i2c_readByte)中启用。 您能否检查您的客户是否已了解此 TI 设计? 我认为他/她的大部分问题都可以通过这种方式得到解答、但如果不是这样、我仍然愿意提供更多帮助!

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

    感谢您的友好支持。

    我的客户按照以下方式更改了您提供的代码。

    IF (iStatus 和 EUSCI_B_I2C_Receive_INTERRUPT0)

    if (RXByteCtr = RXData[NUM_OF_PAGE_BYes]- 1){
    RXData[RXByteCTR++]= MAP_I2C_ReceivmasterMultiByteFinish (CAT24_I2C_base);
    MAP_I2C_DisableInterrupt (CAT24_I2C_base、EUSCI_B_I2C_Receive_INTERRUPT0);
    MAP_I2C_setMode (CAT24_I2C_base、EUSCI_B_I2C_Transmit 模式);
    RXByteCtr = 0;
    CAT24_I2C_Mode = CAT24_I2C_IDLE;
    #if (!FW_RUN_MODE)
    MAP_Interrupt_disableSlepOnIsrExit();
    #endif
    }否则{
    RXData[RXByteCTR++]= MAP_I2C_ReceivmasterMultiByteNext (CAT24_I2C_base);



    但在 driverlib 中读取一次后、总线仍然挂起。

    uint8_t I2C_masterReceiveMultiByteFinish (uint32_t 模量)

    //发送停止条件。
    BITBAND_PERI (EUSCI_B_CMSIS (模量)->rCTLW0.r、UCTXSTP_OFS)= 1;

    //等待停止完成
    while (BITBAND_peri (EUSCI_B_CMSIS (模态)->rCTLW0.r、UCTXSTP_OFS))

    //等待 RX 缓冲器
    while (!BITBAND_peri (EUSCI_B_CMSIS (moduleInstance)->rIFG、UCRXIFG_OFS))<=在此行挂起



    /*在将停止位设置为到期后从接收缓冲区捕获数据
    MSP430 I2C 关键时序。 *
    返回 EUSCI_B_CMSIS (模态)->rRXBUF.b.bRXBUF;


    请帮助您了解一下。 非常感谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据我的理解、您正在等待 RX 缓冲器、这是不可取的。 使用 MAP_I2C_masterReceiveMultiByteStop (CAT24_I2C_base)而不是 multiByteFinish 时会发生什么情况?

    您能告诉我他们使用的是哪个版本的 driverlib 吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    洪泰
    我将会因内在活动而关闭此主题。 如果您有与上述主题无关的另一个问题、请发布另一个主题、如果您有任何其他与此相关的问题、请随时在此处发布、主题将重新打开。