打印
[应用方案]

M051使用I2C 100kHz & 400kHz的slave wake up功能

[复制链接]
2510|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Howard16|  楼主 | 2014-10-31 16:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

我在使用I2C Slavepower down功能時,發現Chip無法wake up,經深入測試後發現Chipwake up但是SI flag因為printf();延後被清除,
所以後續的I2C動作不正常,I2CMaster端會Time out,使得Master以為Chip沒有wake up

===============================================================
if(I2C_GET_WAKEUP_FLAG(I2C0))
    {
        /* Clear I2C Wake-up interruptflag */
        I2C_CLEAR_WAKEUP_FLAG(I2C0);
        printf("I2C0 WAKE INT0x%x\n", I2C0->I2CWKUPSTS);
        return;
    }
===============================================================
printf("I2C0 WAKE INT 0x%x\n", I2C0->I2CWKUPSTS);
使SI flag延後清除,導致I2C Bus被拉住,所以Ack時間被拉長

另外還有一處也會發生同樣問題
==================================================
void PWRWU_IRQHandler(void)
{
    /* Check system powerdown mode wake-up interrupt flag */
    if(((CLK->PWRCON)& CLK_PWRCON_PD_WU_STS_Msk) != 0)
    {
        /* Clear systempower down wake-up interrupt flag */
        CLK->PWRCON |=CLK_PWRCON_PD_WU_STS_Msk;
       printf("Power-down Wake-up INT 0x%x\n", ((CLK->PWRCON)& CLK_PWRCON_PD_WU_STS_Msk));
    }
}
==================================================
printf("Power-down Wake-up INT 0x%x\n",((CLK->PWRCON) & CLK_PWRCON_PD_WU_STS_Msk)); 這個也會有一樣的情況發生
下面是測試時量測到的訊號(使用內部RC22MHz作為system clock):
不正常的Ack,被printf();拉住了


printf();註解掉後,正常的Ack訊號


另外,使用400kHzI2C時,由於I2COpen-Drain Output,要注意Pull-up電阻值是否適合,建議是4.7k歐姆的電阻,
以免影響I2C的訊號爬升速率,造成後續通訊的問題。



M051SeriesBSP_CMSIS_v3.00.001.rar (306.01 KB)
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

44

帖子

1

粉丝