Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры
Войти
Регистрация
Восстановить пароль
 
 
kocmockocmoc
1 / 1 / 1
Регистрация: 07.12.2016
Сообщений: 31
#1

Организация 8 параллельных SPI каналов приема данных - Микроконтроллер

26.03.2017, 13:03. Просмотров 519. Ответов 27

Добрый день.
У меня есть 8 гироскопов, подключаю их сейчас к Ардуино. Канал SPI там один. Из-за этого скорость опроса всех датчиков падает с возможных 3600 Гц до 3 Гц.
Хочу организовать 8 параллельных SPI каналов, возможно даже не на Ардуино, чтобы просто параллельно слушать все данные.
Заказал CAN контроллеры MCP2515-I/SO MCP2515 для Arduino MEGA 2560 пока, предполагаю, что раз там 4 канала UART, то с по помощью него число каналов можно увеличить до 4. Но где-то внутри понимаю, что это не совсем оптимально.

Подскажите пожалуйста, в каком направлении вообще стоит смотреть?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.03.2017, 13:03
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Организация 8 параллельных SPI каналов приема данных (Микроконтроллер):

Организация приема байт на PortB (ASM, ATMega16)
Помогите пожалуйста с кодом. AVRStidio, Ассемблер. Задание Организовать...

Фильтр приема данных
Добрый день, к МК по UART подключено устройство от которого по запросу приходят...

Подскажите алгоритм приема данных
У меня есть небольшой радиомодуль который цифрует эфир и выдает серию ноликов и...

SPI обновление данных
Всем доброго времени суток.. Помогите разобраться Есть два мк (мега8),...

ATmega128. Пересылка данных с USART в SPI
Доброго времени суток, мне требуется реализовать пересылку символов с USART в...

Помогите реализовать передачу данных по UART или SPI
Доброго времени суток, обращаюсь к вам форумчане за помощью. Требуется передать...

27
ValeryS
Модератор
7134 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,227
27.03.2017, 13:34 #21
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
мне приходится сейчас включать-переподключать шину SPI под новый CS.
а это зачем?
0
Витальич
1253 / 1164 / 172
Регистрация: 02.12.2013
Сообщений: 4,843
27.03.2017, 13:38 #22
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
Или нет?
это надо читать документацию
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
мне приходится сейчас включать-переподключать шину SPI под новый CS
как Вы это делаете? не пойму откуда такая потеря в скорости?
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
расскажите про программный SPI пожалуйста
http://www.gaw.ru/html.cgi/txt/app/micros/avr/AVR320.htm
0
ValeryS
Модератор
7134 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,227
27.03.2017, 13:40 #23
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
расскажите про программный SPI пожалуйста
а че там рассказывать

вот псевдокод
Код
for(unsigned int i=0x80;i!=0;i>>=1)
{
delay();
CLK=1;
if(data&i)
 MOSI=1;
else
 MOSI=0;

delay();
CLK=0;

}
1
Voland_
1476 / 986 / 93
Регистрация: 04.01.2010
Сообщений: 3,253
27.03.2017, 18:52 #24
Заглянул я в скетч, подозреваю, что проблема в производительности. У вас же происходят вычисления с плавающей запятой, а они ппц какие ресурсоемкие на AVR. Так что предлагаю во-первых, проверить ваш код без float'ов, ограничившись просто чтением. А там уже будем посмотреть.
1
kocmockocmoc
1 / 1 / 1
Регистрация: 07.12.2016
Сообщений: 31
27.03.2017, 19:20  [ТС] #25
Цитата Сообщение от ValeryS Посмотреть сообщение
а это зачем?
потому что иначе инициализируется первый списке датчик и все данные с него идут (какой бы CS не выбрал позднее)

Цитата Сообщение от Витальич Посмотреть сообщение
как Вы это делаете? не пойму откуда такая потеря в скорости?
при каждом запуске канала датчик тратит 20 мс на старт

Цитата Сообщение от ValeryS Посмотреть сообщение
вот псевдокод
немного осмыслю и напишу
Цитата Сообщение от Voland_ Посмотреть сообщение
Заглянул я в скетч, подозреваю, что проблема в производительности
абсолютно верно

Цитата Сообщение от Voland_ Посмотреть сообщение
У вас же происходят вычисления с плавающей запятой, а они ппц какие ресурсоемкие на AVR. Так что предлагаю во-первых, проверить ваш код без float'ов,
в данном случае это не критично, проблема в организации канала, что на каждый датчик сейчас инициализирую шину SPI отдельно и закрываю.
Хочу один раз каждому датчику инициализировать свой канал, потом просто собирать данные.
Это делается при запуске один раз по хорошему, мне пришлось в цикл это вынести. отсюда и потери.
с float проблема очень легко решается, путем переноса только сырых данных и вычислениях уже на сервере.

Добавлено через 8 минут
Цитата Сообщение от ValeryS Посмотреть сообщение
for(unsigned int i=0x80;i!=0;i>>=1)
Это мы собираем данные из регистра до тех пор пока не получили от канала синхронизации CLK - "0"?

Цитата Сообщение от ValeryS Посмотреть сообщение
delay();
CLK=1;
if(data&i)
MOSI=1;
else
MOSI=0;
delay();
Зачем delay в начале и в конце?

Цитата Сообщение от ValeryS Посмотреть сообщение
CLK=1;
if(data&i)
MOSI=1;
else
MOSI=0;
delay();
CLK=0;
Это мы разграничиваем такты синхронизации?

Цитата Сообщение от ValeryS Посмотреть сообщение
if(data&i)
Это если в канале есть данные?

Извините, если вопросы кажутся глупыми, я просто пытаюсь понять

Добавлено через 7 минут
с shiftIn() функцией кто-нибудь сталкивался в ардуино?
0
ValeryS
Модератор
7134 / 5401 / 669
Регистрация: 14.02.2011
Сообщений: 18,227
27.03.2017, 19:32 #26
Лучший ответ Сообщение было отмечено kocmockocmoc как решение

Решение

Цитата Сообщение от kocmockocmoc Посмотреть сообщение
потому что иначе инициализируется первый списке датчик и все данные с него идут (какой бы CS не выбрал позднее)
не может такого быть
CS Cristall Select Выбор кристалла, сиречь микросхемы
выбираешь первый кристалл инициализируешь
потом второй и т.д
только один раз в начале

а потом опрашиваешь их по очереди


Цитата Сообщение от kocmockocmoc Посмотреть сообщение
Зачем delay в начале и в конце?
чтобы тактовая частота была похожа на меандр
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
Это если в канале есть данные?
проверяем если бит равен 1 выставляем на ножке 1 если бит равен 0 выставляем 0
Цитата Сообщение от kocmockocmoc Посмотреть сообщение
Это мы собираем данные из регистра до тех пор пока не получили от канала синхронизации CLK - "0"?
нет проверяем байт побитово
1
kocmockocmoc
1 / 1 / 1
Регистрация: 07.12.2016
Сообщений: 31
27.03.2017, 19:38  [ТС] #27
Цитата Сообщение от ValeryS Посмотреть сообщение
не может такого быть
CS Cristall Select Выбор кристалла, сиречь микросхемы
выбираешь первый кристалл инициализируешь
потом второй и т.д
только один раз в начале
а потом опрашиваешь их по очереди
вы посеяли сомнения во мне, проверю еще раз.

надо осмыслить в начале, что Вы ответили по псевдокоду
0
kocmockocmoc
1 / 1 / 1
Регистрация: 07.12.2016
Сообщений: 31
30.03.2017, 18:53  [ТС] #28
Вы были правы.
Я все это время копался в библиотеке и datasheet к GY-BMI160 в поисках ответа: почему CS переключается неправильно?
Я нашел ответ: не знаю где именно, но существует зарезервированная переменная ss_spi_cs, которая одна единственная отвечает за текущий выбор, не давая больше никому.
Про неё я не нашел ровным счетом НИЧЕГО в интернете. Кроме пары ссылок на библиотеку в GitHub'e.
В Setup нужно все чипы инициализировать на одном и том же объекте BMI160.
В Loop'e потом просто менять значения в этой переменной.

прикладываю скетч и модифицированную библиотеку для тех, кто столкнется с подобной проблемой.
0
Вложения
Тип файла: rar multyplex_gyro.rar (1.2 Кб, 0 просмотров)
Тип файла: rar bibl.rar (8.5 Кб, 0 просмотров)
30.03.2017, 18:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2017, 18:53
Привет! Вот еще темы с решениями:

SPI -> 485->SPI
Есть необходимость переводить SPI на 485 интерфейс. Хотел бы уточнить, драйвер...

Организация параллельных процессов
Мне нужно организовать 5 параллельных процессов, каждый длится от 1 до 5...

База данных с возможностью приема данных из файлов Excel
Здравствуйте Уважаемые! В "Delphi для начинающих" по этому вопросу НИКТО не...

Скрипт приема данных
Можно для примера,скрипт для приёма данных от программы. То есть залил...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
28
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru