Шина I2C помогите разобраться пожалуйста.
- Войдите на сайт для отправки комментариев
Начал осваивать 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
}
Вы уверены, что контрольная сумма у Вас равна именно 0xFF?
Нет не уверен, (взял с мануала). Но вопрос наверное больше в том, что правильно ли я обращаюсь к устройству по шине I2С с испльзованием библиотеки Wire.h
1. Код нужно размещать по правилам форума.
2. Убедились ли Вы заранее, что по адресу 0x42 находится нужное Вам устройство (например, сканером I2C)?
3. Навскидку ничего криминального в Вашем коде не обнаружил, но см. п. 1.
4. Если Вы передаете неверную контрольную сумму, то IMHO девайс должен воспринимать это как ошибку и не отвечать.
Так что, на мой взгляд, первое, что следует сделать, - это выяснить сканером I2C, есть ли что-то по адресу 0x42, а затем разобраться с алгоритмом подсчета контрольной суммы и аккуратно ее вычислить.
Благодарю.
Про код учту. Сканером нашел устройство на адресе 0x42.
В мануале еще написано :
1. // Длина сообщения, формат LE, Длина равна N (размер данных)+1 (код команды).
Подскажите пожалуйста счто такое "формат LE"?
2. " // Рекомендуемая скорость обмена – 100 кбит/с."
не совссем понял как ее выставить.
1. // Длина сообщения, формат LE, Длина равна N (размер данных)+1 (код команды).
Подскажите пожалуйста счто такое "формат LE"?
little-endian наверное