根據官方文檔:對於讀操作,需要先向從機發送0x59;對於寫操作,需要先向從機發送0x58;
如圖:
但是 ,
實際情況下,按照文檔所說的操作可能無法成功讀寫寄存器。可能是不同批次芯片有修改,但參考手冊未及時更新,看具體情況。
比如用如下程序讀取0x05、0x06、0x07三個寄存器
Wire.beginTransmission(0x2C);
Wire.write(0x59);
Wire.write(0x05);//0x06//0x07
Wire.endTransmission();
Wire.requestFrom(0x2C, 1); // 請求一個字節
while(Wire.available()>0){
uint8_t s=Wire.read();
for(int i=7;i>=0;i--)
Serial.println(s>>i&0x01);
}
返回值將全爲0;
正確的操作應該是不加0x58和0x59,即:
/*----------寫入寄存器----------*/
void write_data(uint8_t address,uint8_t data){
Wire.beginTransmission(0x2C);
Wire.write(address);
Wire.write(data);
Wire.endTransmission();
}
/*----------讀取寄存器----------*/
uint8_t read_data(uint8_t address){
Wire.beginTransmission(0x2C);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(0x2C, 1); // 請求一個字節
if(Wire.available()>0)
return Wire.read();
else
return 0x00;
}
PS:對於部分操作,適當添加延時以避免ic處於上一步操作的繁忙狀態而導致操作無效,例如上電之後至少等待100ms,重置寄存器之後等待20ms等。
完。