- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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。
Solved! Go to Solution.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
请问下,在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都是置位的。
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
请问下,在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都是置位的。