Связь с датчиком KMX63 по I2C

Я пытаюсь использовать новый датчик KMX63 с платой Arduino Uno, мой датчик находится на оценочной плате производства kionix. Для связи il связаны следующим образом:

| Пин Уно | Плата оценки выводов |
| А5 | 5 |
| А4 | 7 |
| 3.3 | 1 |
| ЗАЗЕМЛЕНИЕ | 8 |

Вот схема оценочной платы: схема eval board

Я нашел техническое примечание от конструктора, в котором советовали выполнить некоторые действия после включения датчика, чтобы убедиться, что он хорошо работает. Я написал следующий код:

#include <Wire.h>
#include "KMX62.h"


void setup(){
  Serial.begin(9600);
  Wire.begin();

  Serial.println(F("Starting"));

  byte error=7;
  byte id=0;
  byte command=0;
  delay(60);
  Wire.beginTransmission(KMX62_I2C_ADD_2);
  Wire.write(0x7F);
  Serial.println(F("Write 0x7F"));
  Wire.write(0x00);
  Serial.println(F("Write 0x00"));
  delay(100);
  error=Wire.endTransmission();
  Serial.print(F("retour 1 : "));
  Serial.println(error);
  if( error==0 ){
    Wire.beginTransmission(KMX62_I2C_ADD_2);
    Wire.write(CNTL2);
    Wire.write(0x00);
    error=Wire.endTransmission();
    if( error==0 ){
      Wire.beginTransmission(KMX62_I2C_ADD_2);
      Wire.write(CNTL1);
      Wire.write(0x80);
      error=Wire.endTransmission();
      if(error==0){
        delay(5);
        Wire.beginTransmission(KMX62_I2C_ADD_2);
        Wire.write(WHO_AM_I);
        Wire.endTransmission(false);
        Wire.requestFrom(KMX62_I2C_ADD_2,1);
        id=Wire.read();
        error=Wire.endTransmission();
        if(id==0x18||id==0x2D){
          Wire.beginTransmission(KMX62_I2C_ADD_2);
          Wire.write(COTR);
          Wire.endTransmission(false);
          Wire.requestFrom(KMX62_I2C_ADD_2,1);
          command=Wire.read();
          error=Wire.endTransmission();
          if(command==0x55){
            Serial.println(F("device ok"));
          }else{
            Serial.println(F("Issue with the sensor step e : need to be rebooted"));
          }
        }else{
          Serial.println(F("Issue with the sensor step d id=wrong : need to be rebooted"));
        }
      }else{
        if(error==2||error==3){
        Serial.println(F("Issue with the sensor step c : need to be rebooted"));
        }
      }
    }else{
      if(error==2||error==3){
        Serial.println(F("Issue with the sensor step b : need to be rebooted"));
      }
    }
  }
}

void loop(){

}

но у меня проблема с шагами, программа зависает, когда я пытаюсь записать в регистр 0x7F.
Я не получаю никакой трассировки, которая должна быть после wire.endtransmission().
Вот трассировка, которую я получаю:

09:56:35.477 -> Starting
09:56:35.511 -> Write 0x7F
09:56:35.511 -> Write 0x00

Я использовал сканер I2C, чтобы проверить, появляется ли датчик, мне пришлось изменить сканер, чтобы добавить задержку перед Wire.beginTransmission и Wire.endTransmission, чтобы избежать зависания сканера при первом попытке адреса. После модификации я увидел датчик по тому адресу, по которому он должен был быть. здесь трассировка сканера I2C:

Scanning...
I2C device found at address 0x0F  !
done

Кто-нибудь знает, почему я не могу ничего записать в свой датчик, не заставляя свою программу каждый раз зависать на неопределенный срок?

PS: По совету Крисла я перезапустил все свои программы на Arduino Mini Pro на 3,3 В / 8 МГц и получил тот же результат.

, 👍1

Обсуждение

Можете ли вы объяснить «задержку (100)» перед «Wire.endTransmission ()»? Вы знаете, что "endTransmission" на самом деле является началом передачи., @Mikael Patel

Работает ли оценочная плата от 3,3 В?, @chrisl

Я не понял, что передача началась только после завершения передачи. Я добавил задержку (), потому что в сканер I2C мне пришлось добавить задержку (100) между beginTransmission и endTransmission, или сканер блокировался по указанному адресу., @Maxence Ginet

@chrisl я пробовал с обоими выводами питания Uno 3.3 и 5V и получил тот же результат, @Maxence Ginet

Но Uno попытается поднять SDA и SCL до 5 В, в то время как оценочная плата поднимет их только до 3,3 В. Так что будет перекрестный ток. Если вы хотите подключить устройство 5 В и 3,3 В через I2C, вам обязательно нужен переключатель уровня., @chrisl

Означает ли это, что вы питаете оценочную плату от контакта 3,3 В Uno? Вы должны проверить, какой ток нужен плате. Это может быть слишком много для регулятора 3,3 В на Uno. Пожалуйста, сначала проверьте эти вещи и не подключайте 5 В к устройству 3,3 В, если вы действительно не уверены, что оно может это выдержать. В противном случае вы можете уничтожить устройство., @chrisl

да, я запитал оценочную плату с помощью 3,3 В UNO, я просто провел дополнительный тест с mini pro 3,3 В 8 МГц, и я получил тот же результат, что моя программа зависла, но сканер I2C действительно находит адрес I2C датчика: 0x0F, @Maxence Ginet

BW: Какой регистр 0x7F? Не могли бы вы добавить ссылку на спецификацию продукта, который вы используете? Тот, который я нашел, не имел этого регистра. Это может быть проблемой. Может быть, вы имеете в виду регистр 0x7A?, @Mikael Patel

http://kionixfs.kionix.com/en/document/TN005-Power-On-Procedure.pdf Это техническое примечание, касающееся процедуры включения датчика. Мне это показалось странным, когда я прочитал адресный регистр 0x7F, но я предположил, что это может быть регистр, который нам обычно не нужно трогать., @Maxence Ginet

Вы пробовали последовательность запуска из этого https://github.com/ROHMUSDC/ROHM_SensorPlatform_Multi-Sensor-Shield/blob/master/Platform%20Code/Arduino_UNO_FirmwareExample/ROHM_SENSORSHLD1-EVK-101_10-20-2016/ROHM_SENSORSHLD1-EVK-101_TerminalDemo_11- 10-2016/ROHM_SENSORSHLD1-EVK-101_TerminalDemo_11-10-2016.ino?, @Mikael Patel

@MikaelPatel Я не знал, что попробую эту последовательность запуска с использованием библиотеки проводов, но получил тот же результат, программа кажется заблокированной с первой записью. Может ли проблема исходить из библиотеки проводов?, @Maxence Ginet

Здесь есть несколько аппаратных проблем, прежде чем предположить, что это программное обеспечение., @Mikael Patel


1 ответ


1

Наконец-то я нашел, в чем проблема: я сделал ошибку при чтении схемы оценочной платы. Я думал, что пины J1-9 уже подключены в интерн, но это было не так. Я подключил его к выходу VCC моей платы, и теперь он отлично работает.

,