我在使用I2C Slave的power down功能時,發現Chip無法wake up,經深入測試後發現Chip有wake up但是SI flag因為printf();延後被清除, 所以後續的I2C動作不正常,I2C的Master端會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訊號
另外,使用400kHz的I2C時,由於I2C為Open-Drain Output,要注意Pull-up電阻值是否適合,建議是4.7k歐姆的電阻, 以免影響I2C的訊號爬升速率,造成後續通訊的問題。
M051SeriesBSP_CMSIS_v3.00.001.rar
(306.01 KB)
|