Акселерометр AtTiny85 и MMA8452Q не могут подключиться с помощью i2c

Я пытаюсь подключить MMA8452Q к AtTiny85 с помощью библиотеки TinyWireM. Я сделал правильную аппаратную настройку с подтягиванием выводов SCL и SDA — протестировал на Arduino. Uno, и это работает, однако, когда я подключаю Tiny, я даже не могу получить рукопожатие. Следующий код выводит 13 вместо 42 (0x2A)

НАСТРОЙКА ОБОРУДОВАНИЯ

Прорыв MMA8452 ------------ AtTiny85

3,3 В ------- регулятор напряжения ------ 5 В

SDA -----------^^(330)^^----------- PB0 (на программаторе attiny помечен как 5)

SCL -----------^^(330)^^----------- PB3 (на программаторе attiny отмечен как 2)

Земля --------------------------------- Земля

(Я также безуспешно пробовал разные контакты)

КОД

//---связь с консолью bluetooth---//
#include <SoftwareSerial.h>
#define rxPin 1 //не важно - нужен для инициализации
#define txPin A2
SoftwareSerial blueTooth(rxPin, txPin);
// --- //


#include "TinyWireM.h" // Используется для I2C

// Плата SparkFun по умолчанию установлена на 1, устанавливается на 0, если установлена перемычка SA0 в нижней части платы
#define MMA8452_ADDRESS 0x1D  // 0x1D, если SA0 высокий, 0x1C, если низкий


#define WHO_AM_I   0x0D



void setup() {

  blueTooth.begin(9600);
  delay(1000);
  TinyWireM.begin(); //Подключаемся к шине как ведущий
  delay(1000);
 }

void loop() {
   byte c =0;
   c = readRegister(WHO_AM_I); 
   blueTooth.println(c); 
   delay(1000);
  }


 // Читаем один байт из addressToRead и возвращаем его как байт
byte readRegister(byte addressToRead) {
  TinyWireM.beginTransmission(MMA8452_ADDRESS);
  TinyWireM.send(addressToRead);
  TinyWireM.endTransmission(); //завершить передачу, но оставить соединение активным

  TinyWireM.requestFrom(MMA8452_ADDRESS, 1); // Запрашиваем 1 байт, после этого шина освобождается по умолчанию

  while(!TinyWireM.available()) ; //ждем возврата данных
  return TinyWireM.receive(); //Вернуть этот один байт
} 

Кто-нибудь знает, как это сделать правильно?

, 👍2

Обсуждение

Подтягивающие резисторы I2C имеют сопротивление от 4,7 кОм до Vcc (при напряжении 5 В). SCL — это PB2 (вывод 7 микросхемы), а SDA — это PB0 (вывод 5 микросхемы)., @Mikael Patel

поменял резисторы. все еще получаю тот же результат, @Chris


2 ответа


0

используя библиотеку TinyWireM.

Убедитесь, что i2c действительно работает. Библиотеки Arduino, как правило, низкого качества, и то, что кто-то написал их, не означает, что они на самом деле работают. Подключите к шине логический анализатор или осциллограф и посмотрите, что происходит.

Как только вы это подтвердите, получите техническое описание процессора 8452, посмотрите, как он работает, и напишите для него код.

,

Я попытался сделать то, что вы предложили, а также попытался подключить i2c attiny в качестве ведомого к uno в качестве ведущего. тоже не работал. Как правило , то, что я получаю на осцилляторе, представляет собой некоторый беспорядок, отличный от того, что я получаю при подключении uno. На uno я получаю хорошие прямоугольные сигналы на часах и цифровые сигналы на sda. Я провел несколько тестов и использовал контакты pb0, pb2 и pb3 на attiny для последовательной связи, чтобы контакты работали (я думаю?). Может все-таки проблема в чипе? Кажется, что многим людям удалось использовать TinyWireM в качестве библиотеки i2c... я не знаю, что делать дальше, @Chris

я сканировал устройства i2c, и он обнаруживает устройство i2c по каждому сканируемому адресу... так странно, @Chris


1

На ATtiny85 контакт 5 (PB0) — это SDA, а контакт 7 (PB2) — это SCL для интерфейса I2C. Вы используете неправильный контакт для SCL.

Кроме того, ваши подтягивающие резисторы слишком мощные. Где-то между 4,7 кОм и 10 кОм рекомендуется для подтяжки на линиях SDA и SCL.

,