Проблема с использованием 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);
}
@zoptune, 👍1
Обсуждение2 ответа
Итак, мне наконец удалось прочитать значение регистра. Я действительно не знаю, в чем была проблема. Вот код, если он может кому-то помочь (кстати , сканер все еще не работает) :
#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);
}
Похоже, ответ немного запоздал, но если кто-то еще увидит эту проблему еще раз.
Это может быть не видно непосредственно в документации (техническом описании или справочном руководстве по решению), но вот что вы можете найти в приложении B к техническому описанию Trust M (раздел 11):: "OPTIGA™ Trust M не будет признавать подчиненный адрес, отправленный хостом, если он занят или находится в состоянии ожидания. Следовательно, хост должен повторить или повторить транзакцию до тех пор, пока она не будет успешной или не истечет время ожидания в течение 100 миллисекунд (крайний случай). Указанное защитное время должно применяться между каждой попыткой операции записи / чтения драйвером хоста I2C ".
Чип всегда переходит в состояние ожидания или сна, если в течение определенного периода времени не будет выдана команда, если только задержка активации сна не будет изменена.
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
- Как отображать переменные на 0,96-дюймовом OLED-дисплее с библиотекой u8glib?
- OVF в последовательном мониторе вместо данных
- ЖК-дисплей I2C отображает странные символы
- Соединение I2C зависает Ведущий если ведомый отключается
- Экран LCD 16*02 I2C показывает только первый напечатанный символ
- Ведомое устройство Arduino с двумя мастерами, использующими одну и ту же шину I2C?
Тестирование нового датчика всегда начинается со сканера 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