Две независимые шины SPI для синхронной передачи данных

Venanskui
Offline
Зарегистрирован: 10.07.2021

Здравствуйте, как сделать для интерфейса SPi на Arduino UNO по два MOSI, MISO, а то стандартно по одному. Требуется передача данных ускорения с двух акселерометров, по одной шине (выбор через SS ) возникают проблемы, пытался сделать, но не могу работать с регистрами, и не знаю, какая минимальная задержка должна быть между двумя приходящими сигналами. Кто вообще работал с SPI и хорошо разбирается, подскажите пожалуйста, по подключению нескольких устройств, заранее спасибо.

rkit
Offline
Зарегистрирован: 23.11.2016

И вместо того чтобы решить проблему, ты создаешь себе еще большую проблему, я правильно понял?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Venanskui пишет:
как сделать для интерфейса SPi на Arduino UNO по два MOSI, MISO

Никак. Если имеется в виду аппаратный SPI, а не ногодрыг.

Venanskui пишет:
Требуется передача данных ускорения с двух акселерометров, по одной шине (выбор через SS )

Это штатная задача для одного SPI

Venanskui пишет:
Требуется передача данных ускорения с двух акселерометров

Каких?

Venanskui пишет:
по одной шине (выбор через SS )

Так, если требуется по одной, то зачем Вы спрашиваете про две?

Venanskui пишет:
возникают проблемы

Какие? Как именно они проявляются?

Venanskui пишет:
пытался сделать

Как? Где скетч и схема подключения? Что не так с этими попытками? Что именно работает не так, как ожидается?

Venanskui пишет:
не могу работать с регистрами

Учитесь! Или Вы предлагаете мне за Вас научиться? Тогда у меня для Вас приятная новость - уже научился, так что делайте!

Venanskui пишет:
не знаю, какая минимальная задержка должна быть между двумя приходящими сигналами

Не понял о каких сигналах речь, но, в любом случае, это есть в даташите, читайте.

Venanskui пишет:
подскажите пожалуйста, по подключению нескольких устройств

Что именно Вам подсказать?

Как надо подключать написано на любом заборе. Почему у Вас что-то не работает мы не знаем (чтобы знали, Вы должны подробно ответить на ВСЕ вопросы выше). Вот когда объясните Вашу проблему, тогда и поговорим, пока говорить не о чем.

Venanskui пишет:
заранее спасибо.

Не за что.

 

Venanskui
Offline
Зарегистрирован: 10.07.2021

Аксселерометры ADXL362. Мне нужна синхронная передача, а по одному каналу этого сделать нельзя, надо либо по одному каналу с постоянной разностью фаз, либо по двум независимым. У меня получилось подключить два ADXL362, по одной шине с разными SS, но второй, при изменении в нем ускорений, отражается сильными скачками на графике первого, при этом первый никак не влияет на второй, короче второй как то влияет на первый.

Venanskui
Offline
Зарегистрирован: 10.07.2021

/*
ADXL362_SimpleRead.ino - Simple XYZ axis reading example
for Analog Devices ADXL362 - Micropower 3-axis accelerometer
go to http://www.analog.com/ADXL362 for datasheet

License: CC BY-SA 3.0: Creative Commons Share-alike 3.0. Feel free
to use and abuse this code however you'd like. If you find it useful
please attribute, and SHARE-ALIKE!

Created June 2012
by Anne Mahaffey - hosted on http://annem.github.com/ADXL362

Modified May 2013
by Jonathan Ruiz de Garibay

Connect SCLK, MISO, MOSI, and CSB of ADXL362 to
SCLK, MISO, MOSI, and DP 10 of Arduino
(check http://arduino.cc/en/Reference/SPI for details)

*/

#include
#include

ADXL362 xl;
ADXL362 x2;

int16_t temp;
int16_t XValue;
int16_t XValue2;

void setup(){

Serial.begin(9600);
xl.begin(10);
xl.beginMeasure();
x2.begin(9);
x2.beginMeasure();

Serial.println("XValue XValue2");
}

void loop(){

// read all three axis in burst to ensure all measurements correspond to same sample time
digitalWrite(10,LOW);
XValue = xl.readXData();
digitalWrite(10, HIGH);
delay(1000);
digitalWrite(9,LOW);
XValue2 = x2.readXData();
digitalWrite(9, HIGH);
Serial.print(XValue);
Serial.print(" ");
Serial.println(XValue2);
delay(1000);

}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Вставка программного кода в тему/комментарий. В таком виде код обсуждать невозможно. Да и читать, тоже. Например, что там за пустые include? Что там на самом деле?

2. Вас просили ответить на ВСЕ вопросы выше. Например, схему подключения я не вижу. Кстати, если используете библиотеки (или что там за инклюды), давайте ссылки на используемые библиотеки.

В общем, Вы должны ответить на ВСЕ вопросы. Пока этого не будет, говорить не о чем. Я Вам говорю это второй раз. Третий раз говорить не буду. Если Вам это не нужно, то мне - тем более.

И кстати, Вы плодите новые вопросы. Заодно и на них отвечайте. Например,

Venanskui пишет:
второй, при изменении в нем ускорений, отражается сильными скачками на графике первого

Показать не хотите? Секрет?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Venanskui пишет:
но второй, при изменении в нем ускорений, отражается сильными скачками на графике первого, при этом первый никак не влияет на второй, короче второй как то влияет на первый.

Может просто у первого контакт ненадежный? Вот когда вторым трясете первый и глючит.

По поводу скетча - дергать 9м и 10м пином вовсе не обязательно. Библиотека делает это сама. 

Venanskui
Offline
Зарегистрирован: 10.07.2021
#include <LowPower.h>
#include <SPI.h>
#include <ADXL362.h>

ADXL362 x1;
ADXL362 x2;

int SS1 = 9;
int SS2 = 8;
int XData;
int XData2;

void setup() {

  Serial.begin(9600);
  x1.begin(SS1);
  x1.beginMeasure();
  x1.SPIwriteOneRegister(0x2C, 0x57);
  x2.begin(SS2);
  x2.beginMeasure();
  x2.SPIwriteOneRegister(0x2C, 0x57);
  
  Serial.print("XData XData2");
}

void loop() {

  digitalWrite(SS1, LOW);
  SPI.transfer(0x0B);
  SPI.transfer(0x0E);
  XData = SPI.transfer(0x00);
  XData = XData + (SPI.transfer(0x00) << 8);
  digitalWrite(SS1, HIGH);
  delay(10);
  
  digitalWrite(SS2, LOW);
  SPI.transfer(0x0B);
  SPI.transfer(0x0E);
  XData2 = SPI.transfer(0x00);
  XData2 = XData + (SPI.transfer(0x00) << 8);
  digitalWrite(SS2, HIGH);

  Serial.print(XData);
  Serial.print(" ");
  Serial.println(XData2);
  delay(10);
  
}