|
小弟近來在學(xué)習(xí)IIC通信協(xié)議,看的是郭天祥的C51單片機(jī)課本,其中對于應(yīng)答信號的模擬子程序書里面是這樣的:
void respons( )
{
uchar i = 0;
SCL = 1;
delay( );
while((SDA == 1) &&(i<255));
i ++;
SCL = 0;
delay( );
}
為什么要有 while((SDA == 1) &&(i<255)); ? 課本里是這樣解釋的,(SDA == 1) &&(i<255); 是相與的關(guān)系,表示若在一段時間內(nèi)沒有收到從器件的應(yīng)答,則主器件默認(rèn)從器件已經(jīng)收到數(shù)據(jù)而不再等待應(yīng)答信號,因?yàn)槿绻患舆@個延時退出,一旦器件沒有發(fā)出應(yīng)答信號,程序?qū)⒂肋h(yuǎn)停止在這里,而真正的程序中是不允許這樣的。
小弟的問題是:1、while((SDA == 1) &&(i<255)); i ++; 能不能換成delay( ) ?因?yàn)闊o論C51是否接收到了從機(jī)的應(yīng)答,都會往下執(zhí)行SCL = 0; 并不會說程序停在那里不動, while((SDA == 1) &&(i<255)); 的功能也就相當(dāng)于等待從機(jī)進(jìn)行應(yīng)答,一旦SDA被從機(jī)拉為低電平就開始執(zhí)行SCL = 0;所以我覺得while((SDA == 1) &&(i<255)); i ++; 可以換成delay( )。
2、這一個模擬應(yīng)答信號子函數(shù)中,為什么沒有SDA = 0;這個語句?是不是因?yàn)閺臋C(jī)是具有IIC協(xié)議功能的,一旦接受了一個字節(jié)的信息后,自動會使SDA = 0;不需要手動操作?
|
|