Шина I2C помогите разобраться пожалуйста.

dedold
Offline
Зарегистрирован: 08.08.2017

Начал осваивать Arduino недавно.

Подскажите пожалуйста что я ни так делаю.

Есть Arduino Uno и подключенный к нему датчик по шине I2C.

В датчик надо передать последовательность :

Ind

Наименование поля

HEX

0

08h – признак начала сообщения

08

1

Длина сообщения

01

2

 

00

3

Код запроса

27

4

Контрольная сумма

ff

5

 

dd

 

Написал какой скетч, но ничего не работает….

Заранее благодарен, если кто сможет помочь.

 

 

#include <Wire.h>

int DAT1 = 0x42; // Адрес датчика

byte val = 0;

void setup()

{

  Serial.begin(9600);          // запускаем последовательную передачу данных на скорости 9600 бит в секунду

  Wire.begin();                // подключаем шину I2C (для ведущего устройства адрес опционален)

}

int reading = 0;  // создаем переменную reading

void loop()

{

 // Шаг 1. начнем передовать

  Wire.beginTransmission(DAT1); // передаем девайсу (0x42);

   Wire.write(0x08);  // пишем (0x08)

    Wire.write(0x01);  // пишем (0x01)

    Wire.write(0x00);    // пишем (0x00)

    Wire.write(0x27); // пишем (0x27)

    Wire.write(0xff);  // пишем (0xff)  

    Wire.write(0xdd);  // пишем (0xdd)  

 Wire.endTransmission();      // останавливаем передачу данных       

               

// Шаг 2. Ждем, когда начнется считывание:

 delay(7);                   // в «даташите» указано, что нужно ждать

               

  // Шаг 3. Запрашиваем у DAT считанные данные:  

  Wire.requestFrom(DAT1, 22);    // запрашиваем длину 22 байт у ведомого устройства с адресом DAT1     

 Serial.println("!!!!!  answer !!!!");   

  while(Wire.available())    // пока есть, что читать

  {

    char c = Wire.read();    // получаем байт (как символ)  

    Serial.print(c);         // печатает в порт

   }

    Serial.println("4");

  

  delay(5000);                  // немного ждем, чтобы успеnm прочитать то, что мы показали на Serial Monitor

}

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вы уверены, что контрольная сумма у Вас равна именно 0xFF?

dedold
Offline
Зарегистрирован: 08.08.2017

Нет не уверен, (взял с мануала). Но вопрос наверное больше в том, что правильно ли я обращаюсь к устройству по шине I2С с испльзованием библиотеки Wire.h

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

1. Код нужно размещать по правилам форума.

2. Убедились ли Вы заранее, что по адресу 0x42 находится нужное Вам устройство (например, сканером I2C)?

3. Навскидку ничего криминального в Вашем коде не обнаружил, но см. п. 1.

4. Если Вы передаете неверную контрольную сумму, то IMHO девайс должен воспринимать это как ошибку и не отвечать. 

 

Так что, на мой взгляд, первое, что следует сделать, - это выяснить сканером I2C, есть ли что-то по адресу 0x42, а затем разобраться с алгоритмом подсчета контрольной суммы и аккуратно ее вычислить.

dedold
Offline
Зарегистрирован: 08.08.2017

 

Благодарю.

Про код учту. Сканером нашел устройство на адресе 0x42.

В мануале еще написано :

1. // Длина сообщения, формат LE, Длина равна N (размер данных)+1 (код команды).

Подскажите пожалуйста счто такое "формат LE"?

2. " // Рекомендуемая скорость обмена – 100 кбит/с."

не совссем понял как ее выставить.

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

dedold пишет:

1. // Длина сообщения, формат LE, Длина равна N (размер данных)+1 (код команды).

Подскажите пожалуйста счто такое "формат LE"?

little-endian  наверное