Проблема с I2C Arduino DUE
- Войдите на сайт для отправки комментариев
Всем привет! Ломаю голову уже неделю! Проблема в следующим: у меня есть датчик ITG3200 в исполнении GROVE system, датчик исправный, подключаю я его у arduino due к линиям scl1, sda1, +3.3 и gnd соответственно и все бы хорошо, но ардуино с датчиком отказывается общаться, точнее она это делает но только один раз после сброса питания ардуино.
Исползую следующий элементарный код:
#include <Wire.h> void setup() { Wire1.begin(); // join i2c bus (address optional for master) //delay(5000); //задержка в 5 секунд } void loop() { Wire1.beginTransmission(0x68); Wire1.write(0); Wire1.endTransmission(false); Wire1.requestFrom(0x68, 1); // request 6 bytes from slave device #2 while(Wire1.available()) // slave may send less than requested { unsigned char data = Wire1.read(); // receive a byte as character } delay(500); }
в этом листенге запрашивается ID датчика ITG3200
Сразу после включения питания:
тут все хорошо! Далее более подробные фотографии
байт адреса и адрес регистра:
байт адреса с битом R/W=1 и собственно данные:
тут все замечательно, принимаеться 0x69 это ID которое у меня записано регист 0 (WHO_I_AM) в ITG3200.
А ВОТ ДАЛЕЕ ВОЗНИКАЕТ ПРОБЛЕМА! НЕ СМОТРЯ НА ТО ЧТО ЧТЕНИЕ ПАРАМЕТРА ДАТЧИКА НАХОДИТЬСЯ В void loop() ардуино не желает общаться с ITG3200 и на осцыле я наблюдаю следующее:
А тепер вопрос: в чем дело, почему DUE себя так ведет? и еще одна деталь, если добавить в void setup() задержку 3-5 секунд, меньше не проверял, то на линии ничего не просходит, как на последней фотке. Спасибо
Сложно сказать в чем причина, так как DUE - новая платформа, может что-то не "допилили" при обертывании в Арнуино-функции, может еще чего. Попробуйте не на SCL1 и SDA1, а на SCL и SDA. И вот этот пример.
Так же могу предположить что нужно добавить строку
Wire1.endTransmission(
);
после того как прочитали данные:в конце endTransmission() можно не вызывать, так как requestFrom() делает тоже самое, после приема данных.
Все запутываеться еще и тем, что если вставить Serial.println("разный текст") в ключевые точки кода, например
и после этого включить монитор порта, то в мониторе мы увидем ожидаемый результат, но на асцыле ничего не будет происходить.
И кстати подключался к датчику с помощью PIC18f452 и вообщем проблем не было. IDE Arduino 1.5 находиться на beta тесте, может дело в этом