Re: I2C通讯,为什么没有接从器件,第九个脉冲是高,程序还能向下走?
|
||||
---|---|---|---|---|
版主
|
還看出來你的問題,參考一下右邊範例程式裡的12-1項有I2C的範例程式。
發表於: 2006/10/26 15:57
|
|||
|
I2C通讯,为什么没有接从器件,第九个脉冲是高,程序还能向下走?
|
||||
---|---|---|---|---|
初級會員
|
各位,哪为有经验的朋友看看.
我用的是P18F2455为主机,在I2C通讯时,怎当我没从器件时,波形是对的,第九个脉冲的SDA为高,但是主I2C器件怎么就没能检测到这个脉冲了,程序还是向下继续走了? 奇怪!有哪位帮我看看. 程序如下: IdleI2C(); StartI2C(); i=0; while (!PIR1bits.SSPIF) { i++; if(i>COE) { I2CMErrorState.Wrt=1; goto _EEROR; } } PIR1bits.SSPIF=0; suc=0; SSPCON2bits.ACKSTAT=1; WriteI2C1(ID,suc); if(suc==0) { I2CMErrorState.Wrt=2; goto _EEROR; } while(SSPCON2bits.ACKSTAT) //注意,为什么在没有接器件时,这句话没判断出来? 实在想不通? { i++; if(i>COE) { I2CMErrorState.Wrt=3; goto _EEROR; } } i=0; while (!PIR1bits.SSPIF) { i++; if(i>COE) { I2CMErrorState.Wrt=4; goto _EEROR; } } PIR1bits.SSPIF=0; while (length!=0) { //SSPCON2bits.ACKSTAT=1; WriteI2C1(*dptr,suc); if(suc==0) { I2CMErrorState.Wrt=5; goto _EEROR; } i=0; while(SSPCON2bits.ACKSTAT) { i++; if(i>COE) { I2CMErrorState.Wrt=6; goto _EEROR; } } i=0; while (!PIR1bits.SSPIF) { i++; if(i>COE) { I2CMErrorState.Wrt=7; goto _EEROR; } } PIR1bits.SSPIF=0; dptr++; // Point to next byte length--; } StopI2C(); i=0; while (!PIR1bits.SSPIF) { i++; if(i>COE) { I2CMErrorState.Wrt=8; goto _EEROR; } } PIR1bits.SSPIF=0; _NORMAL: SSPCON1=0X00; SSPCON2=0X00; SSPSTAT &=0X3f; PIR1bits.SSPIF=0; // Clear SSPIF return NOM ; _EEROR: SSPCON1=0X00; SSPCON2=0X00; SSPSTAT &=0X3f; PIR1bits.SSPIF=0; // Clear SSPIF return ER_DEV;
發表於: 2006/10/26 9:43
|
|||
|