QN8027 讀寫寄存器的坑

根據官方文檔:對於讀操作,需要先向從機發送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等。

 

 

完。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章