用單片機(jī)的I/O口模擬I2C協(xié)議
I2C用IO模擬程序網(wǎng)上范例最多的就是51的程序了,這些范例的正確性無需懷疑.但是如果直接以它為藍(lán)本將它"AVR化",一不留神,就會(huì)有點(diǎn)問題了.
這要從I2C的硬件規(guī)范和AVR及51單片機(jī)的IO口說起.I2C要求SCL,SDA二線都有 線與 功能,即I2C驅(qū)動(dòng)口應(yīng)該是 漏極開路 電路,其高電平的維持是靠上拉電阻來實(shí)現(xiàn)的, 而低電平則需要驅(qū)動(dòng)口的強(qiáng)下拉能力.
51單片機(jī)IO口正好完全符合這個(gè)特性.寫起I2C驅(qū)動(dòng)頗為得心應(yīng)手.但是AVR的IO口強(qiáng)大了,它輸出的高電平是實(shí)實(shí)在在的高電平,而不是靠什么上拉電阻來提供,只有10mA都不到的電流!于是如果直接使用 PORTB_Bit0 = 1這樣的操作,就不能滿足I2C的線與功能了,如果此時(shí)有別的設(shè)備要將SCL或者SDA拉低,那么結(jié)果就是二個(gè)IO口打架,誰贏誰輸不得而知,時(shí)間長了,多半是兩敗俱傷,芯片發(fā)熱吧.
當(dāng)然AVR的IO口自然有辦法滿足I2C的電氣特性要求,不就是不能輸出1么,那么用它的高阻狀態(tài)即可(DDRB_Bit0=0,PORTB_Bit0=0即可),要輸出0么(DDRB_Bit0=1,PORTB_Bit0=0).
標(biāo)簽:
I2C
AVR
程序
范例
上傳時(shí)間:
2016-07-19
上傳用戶:gxrui1991