1 Reply Latest reply on Jan 6, 2020 5:45 PM by LinglingG_46

    Psoc4 判断EZI2C 是否处于活动状态

    yaxi_1543386

      Hi Sir ,

          请问下,在Psoc 4 下如何判断当前 EZI2C是否处于活动状态?

          if(0 == (EZI2C_KEY_EzI2CGetActivity() & EZI2C_KEY_EZI2C_STATUS_BUSY) 在使用时,是否不要勾选 Clock streching? 因为 函数只有在不勾选Clock streching

      时, status 才有更新值。

      uint32 EZI2C_KEY_EzI2CGetActivity(void)

      {

          uint32 status;

       

       

          EZI2C_KEY_DisableInt();  /* Lock from interruption */

       

       

          status = EZI2C_KEY_curStatus;

       

       

          /* Relay on address match event from HW as bus busy status */

          #if(EZI2C_KEY_EZI2C_SCL_STRETCH_DISABLE)

          {

              /* For EZI2C_KEY_CY_SCBIP_V0 the wake is prohibited by customizer */

              #if(EZI2C_KEY_EZI2C_EC_AM_ENABLE)

              {

                  status |= EZI2C_KEY_CHECK_INTR_I2C_EC(EZI2C_KEY_INTR_I2C_EC_WAKE_UP) ?

                              EZI2C_KEY_EZI2C_STATUS_BUSY : 0u;

              }

              #else

              {

                  status |= EZI2C_KEY_CHECK_INTR_SLAVE(EZI2C_KEY_INTR_SLAVE_I2C_ADDR_MATCH) ?

                              EZI2C_KEY_EZI2C_STATUS_BUSY : 0u;

              }

              #endif

          }

          #endif

       

       

          EZI2C_KEY_curStatus &= ((uint8) ~EZI2C_KEY_EZI2C_CLEAR_STATUS);

       

       

          EZI2C_KEY_EnableInt();   /* Release lock */

       

       

          return(status);

      }  

       

          另外,在这个函数的介绍中,是这样描述的:

          EZI2C_KEY_EZI2C_STATUS_BUSY - A transfer intended for the primary  or secondary address is in progress. The status bit is set after an

          address match and cleared on a Stop or ReStart condition.

          这个参数是否只是在地址匹配的时候才是置位的,当Stop产生时,或Restart产生时,这个就被清零了。也就是说这个EZI2C_KEY_EZI2C_STATUS_BUSY的时间很短吧。

          Thanks。

        • 1. Re: Psoc4 判断EZI2C 是否处于活动状态
          LinglingG_46

          请问下,在Psoc 4 下如何判断当前 EZI2C是否处于活动状态?

          if(0 == (EZI2C_KEY_EzI2CGetActivity() & EZI2C_KEY_EZI2C_STATUS_BUSY) 在使用时,是否不要勾选 Clock streching? 因为 函数只有在不勾选Clock streching时, status 才有更新值。

           

          解释:

           

          这个status 即使选了 clock stretching 的话,也是会更新的。

          uint32 EZI2C_EzI2CGetActivity(void)
          {
              uint32 status;

              EZI2C_DisableInt();  /* Lock from interruption */

              status = EZI2C_curStatus;

          ……

          }

           

          对于PSoC42 系列来说:如果disable掉 clock stretching的话,执行下面语句:

            status |= EZI2C_CHECK_INTR_SLAVE(EZI2C_INTR_SLAVE_I2C_ADDR_MATCH) ? EZI2C_EZI2C_STATUS_BUSY : 0u;

           

          这个status返回的有的值,可以判断是读结束了,还是写结束了,还是出现错误了。在读写的过程中,这个bit都是置位的。