|
最基本的功夫,今天可以坐下來(lái)做一個(gè)總結(jié)。
I2C是非常普通的通信方式,Arduino單片機(jī)集成了I2C庫(kù),可以直接調(diào)用幾個(gè)函數(shù)實(shí)現(xiàn)I2C通信。Arduino MEGA2560開(kāi)發(fā)板I2C接口,在班上對(duì)應(yīng)的20--SDA 21--SCL。
圖1
Arduino的I2C庫(kù)是Wire.h。常用庫(kù)函數(shù)如下:
Wire.beginTransmission(Addr);
Wire.write(data);
Wire.endTransmission(void);
Wire.requestFrom(Addr, num);
Wire.available();
Wire.read()。
每個(gè)數(shù)據(jù)發(fā)出后,都必須有應(yīng)答,只有在等到應(yīng)答后,才能發(fā)出下一個(gè)數(shù)據(jù)或者指令。
下面是一段代碼:
Wire.beginTransmission(0x01);
Wire.write(0xAA);
如果0x01發(fā)出后I2C器件沒(méi)有應(yīng)答,那么0xAA就不能發(fā)送,這時(shí)候用示波器或者邏輯分析儀看,就只能看到發(fā)出了Start信號(hào)和數(shù)據(jù)0x01。
Wire.beginTransmission(Addr)只發(fā)送起始信號(hào)和I2C地址,Addr是I2C總線地址。
Wire.write(data)只發(fā)送數(shù)據(jù),data就是希望發(fā)送的數(shù)據(jù),而且是發(fā)一次,地址就自動(dòng)加一。
Wire.endTransmission(void)發(fā)送停止信號(hào)。
Wire.requestFrom(Addr, num)向已知地址器件獲取連續(xù)num個(gè)數(shù)據(jù),這時(shí)候需要注意,數(shù)據(jù)只是存起來(lái)了,并沒(méi)有真正返回。
Wire.read()就是用來(lái)讀回前面那些存起來(lái)的數(shù)據(jù),而且是讀一次地址自動(dòng)加一。
Wire.available()則返回已經(jīng)存了多少個(gè)數(shù)據(jù)。
|
|