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

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
XiaoPing_Yang
Level 4
Level 4
25 replies posted 10 replies posted 10 questions asked

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。

0 点赞
1 解答
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

请问下,在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都是置位的。

在原帖中查看解决方案

0 点赞
1 回复
LinglingG_46
Moderator
Moderator
Moderator
500 solutions authored 1000 replies posted 10 questions asked

请问下,在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都是置位的。

0 点赞