Проблема с использованием Optiga Trust X I2C

Кто -нибудь когда-нибудь использовал модуль Infineon Optiga Trust X с Arduino, используя любую библиотеку I2C?

Вот техническая документация модуля Trust X.

Я пытаюсь получить данные регистра I2C_STATE, но я ничего не получаю после Wire.requestFrom().

Я также попробовал использовать мастер-библиотеку DSS Circuits I2C, те же результаты.

Спасибо

Полный код :

#include <Wire.h>
#define PIN_RST 8
#define PIN_VDD 9

void setup() {
  pinMode(PIN_RST, OUTPUT);
  pinMode(PIN_VDD, OUTPUT);
  digitalWrite(PIN_RST,LOW);
  digitalWrite(PIN_VDD,LOW);

  Serial.begin(115200);
  delay(2000);
  Wire.begin(); // присоединиться к шине i2c (адрес необязателен для мастера)

  digitalWrite(PIN_VDD,HIGH);  // sartup the Trust X module
  digitalWrite(PIN_RST,HIGH);

  delay(15);  // минимальная задержка запуска
}

long val = 9999;

void loop() {
  Wire.beginTransmission(48); // передача на устройство №48 (0x30)
  Wire.write(byte(0x82));            // отправляет байт инструкции
  Wire.endTransmission();     // остановить передачу

  Wire.requestFrom(48, 4);
  while(Wire.available()==0){}

  val = Wire.read(); // Считывает данные из регистра
  Serial.print("val = ");
  Serial.println(val);

  delay(5000);

}

, 👍1

Обсуждение

Тестирование нового датчика всегда начинается со сканера i2c https://playground.arduino.cc/Main/I2cScanner Используйте адрес, который находит сканер i2c. Избегайте того, чтобы скетч останавливался в операторе while. Проверьте, получено ли 4 байта, но не используйте while ., @Jot

Привет и спасибо за ваш ответ. Я уже пробовал сканер, но он не нашел ни одного устройства. Проблема в том, что я думаю при запуске модуля Trust X, как указано в документации. Но я не вижу, что делаю не так., @zoptune

Если сканер i2c его не найдет, то никакой другой код работать не будет. Каков был результат работы сканера i2c? это был не 48-й год. Адаптируйте сканер i2c для установки уровней контактов в setup(). Вы можете сделать время после сброса 1 секундой вместо 15 мс, а также добавить длительную задержку между установкой контактов vdd и reset high. Вы могли бы показать фотографию проводки. Я доверяю Infineon, что они используют стандартный i2c. Первое, что нужно сделать, это заставить сканер i2c работать. После этого вы можете начать писать хороший код, например, удалив while и прочитав 4 байта., @Jot

Какое значение имеют подтягивающие резисторы, которые вы используете на двух линиях I2C?, @Code Gorilla

@Jot Сканер i2c ответил: "Нет устройства". Я знаю, что получу 4 байта, прочитав регистр 0x82, но так как это не сработало, я просто хотел получить хотя бы 1 байт, вот почему я использовал цикл while. Я постараюсь добавить более длительные задержки, и если это все равно не сработает, я поделюсь фотографией проводки. Спасибо вам за ваш ответ., @zoptune

@CodeGorilla Я использую внутренние подтягивающие резисторы Arduino, я предположил, что внутренние резисторы соответствуют протоколу i2c (~ 5K). У меня есть пример кода, который отлично работает с Raspberry Pi 3 без добавления внешних резисторов, поэтому я подумал, что он будет работать так же с Arduino. Поэтому я постараюсь добавить внешний подтягивающий резистор и отключить внутренние резисторы. К сожалению, у меня нет оборудования для визуализации сигнала. Спасибо за ваш ответ, @zoptune

Сейчас я использую комплект Trust X EVAL, в который, по моему мнению, должен быть включен подтягивающий резистор, и я все еще ничего не могу получить. Сканер I2C даже не может найти устройство., @zoptune

Вам нужно 4.7k подтягиваний как на линиях данных, так и на тактовых линиях. Если сканер не показывает устройство, то вы можете попробовать другое устройство. Однажды я часами гонялся за неисправностью, которая оказалась в том, что я подключил микросхему задом наперед., @Code Gorilla

@CodeGorilla Я попробовал с внешним подтягивающим резистором (4.7K), и ничего не изменилось.Сегодня я наконец-то смог прочитать реестр. Честно говоря, я не знаю, какие изменения сделали это возможным. Я опубликую свой код, если он кому-то поможет, @zoptune


2 ответа


1

Итак, мне наконец удалось прочитать значение регистра. Я действительно не знаю, в чем была проблема. Вот код, если он может кому-то помочь (кстати , сканер все еще не работает) :

#include <Wire.h>

#define DEVICE_ADDRESS 0x30

#define PIN_RST 8
#define PIN_VDD 9

void printOutput(byte *out, int out_len){
   int y=0;
  Serial.print("out = ");
  for(;y<out_len;y++){
    Serial.print(out[y],HEX);
  }
  Serial.println("");
}

void coldReset(){
  pinMode(PIN_RST, OUTPUT);
  pinMode(PIN_VDD, OUTPUT);
  digitalWrite(PIN_VDD,LOW);
  digitalWrite(PIN_RST,LOW);
  delayMicroseconds(2000);
  digitalWrite(PIN_VDD,HIGH);  // sartup the Trust X module
  digitalWrite(PIN_RST,HIGH);
}

int I2C_get(byte reg, byte *out, int out_len){
  int i=0, nbSend=0, nbAvailable=0, ret=0;
  Wire.beginTransmission(DEVICE_ADDRESS); // передача на устройство #48 (0x30)
  nbSend=Wire.write(reg);            // отправляет байт инструкции
  Wire.endTransmission();     // остановить передачу
// Serial.print("nb send = ");
// Serial.println(nbSend);

  delayMicroseconds(50);
  Wire.requestFrom(DEVICE_ADDRESS, out_len);

// nbAvailable=Wire.available();
// Serial.print("доступно nb = ");
// Serial.println(nbAvailable);

  if(Wire.available()==out_len){
    for(;i<out_len;i++){
      out[i]=Wire.read();
    }
  }
  else ret=-1;

  return ret;
}

void setup() {

  Serial.begin(115200);
// Wire.begin(); // присоединиться к шине i2c (адрес необязателен для мастера)
// coldReset();
// delayMicroseconds(15000); // Время запуска
}


void loop() {
  int y=0, out_len, ret;
  byte res1[]={0x00,0x00,0x00,0x00};

  Wire.begin(); // присоединиться к шине i2c (адрес необязателен для мастера)
  Wire.setClock(400000);
  coldReset();
  delayMicroseconds(15000); // Время запуска

  out_len=4;
  ret=I2C_get(byte(0x84),res1,out_len);
  if(ret!=-1){
    printOutput(res1,out_len);
  }
  else{
    Serial.println("Error I2C_get");
  }

  Wire.end();
  Serial.println("");
  delay(5000);
}
,

1

Похоже, ответ немного запоздал, но если кто-то еще увидит эту проблему еще раз.

Это может быть не видно непосредственно в документации (техническом описании или справочном руководстве по решению), но вот что вы можете найти в приложении B к техническому описанию Trust M (раздел 11):: "OPTIGA™ Trust M не будет признавать подчиненный адрес, отправленный хостом, если он занят или находится в состоянии ожидания. Следовательно, хост должен повторить или повторить транзакцию до тех пор, пока она не будет успешной или не истечет время ожидания в течение 100 миллисекунд (крайний случай). Указанное защитное время должно применяться между каждой попыткой операции записи / чтения драйвером хоста I2C ".

Чип всегда переходит в состояние ожидания или сна, если в течение определенного периода времени не будет выдана команда, если только задержка активации сна не будет изменена.

,