Обмен сообщениями между множественными клонами Maple Mini

joevpt
Сб 27 августа 2016 г., 19:06
У меня есть проект, который использует 6 досок Arduino, которые я переношу в Maple Mini Clones, чтобы получить 32 -битную и более высокую такту. Как написано в настоящее время, у проекта есть один мастер I2C и пять рабов I2C. Я прочитал, что подчиненный режим не реализован в порте Maple Mini для провода и задается вопросом, какое решение рекомендуется?
Рабские карты уже используют SPI_2 для связи с некоторыми периферийными устройствами, а основная карта использует SPI_2 для связи с Ethernet и SD -картой.
Порт завершен, за исключением интерфейсов, которые всегда находятся от мастера до одного или нескольких рабов.

Кто -нибудь знает, будет ли библиотека I2C для STM32F1 в ближайшее время, или у кого -нибудь есть предложение для альтернативы?

заранее спасибо..

Пито
Сб 27 августа 2016 г., 8:21 вечера
Вы можете использовать UARTS - они могут делать MBITS - и рабы будут подключены к мастеру в конфигурации звезды, прослушивая запрос от мастера, когда идентификатор соответствует конкретному идентификационному соле, ответит. Если Slabes 'Uart TX Pins позволяют открыть дренаж, вы можете подключить все TXS -TX с RX Master («Wired или») и All Slab's RX с Tx Master Tex напрямую. Я сделал это в восьмидесятых с ПК против нескольких 8051, и это сработало :). Вам нужно создать простой протокол, где мастер отправит запрос всем рабам, и только один раб ответит.. Подробности зависят от вашего приложения, однако.
Вы можете использовать 9 -битную передачу, где набор 9 -го бита «1» укажет, что это адрес раба (вы можете обратиться к 256 рабам).

joevpt
Сб 27 августа 2016 г. 20:43
Спасибо, Пито. Я создал Daisychain от Master в Slave1, затем раб 1, чтобы раб 2 и т. Д. Простой протокол с условием для пересылки сообщения, если это не для этого раба работает хорошо. В этом решении используются два USART на MCU.

Я не понимал, что смогу объединить несколько рабов TX и RX вместе, а затем перевернулся на мастер. Это дает мне преимущество, чтобы выглядеть точно так же, как i2c, что касается моего проекта. Это также экономит один USART на MCU.

Нужно ли мне установить линии RX TX в этом случае Maple Mini Mini Clone) или я могу просто подключить их вместе.

Саймонф
Сб 27 августа 2016 г., 21:03
Пито написал:Вы можете использовать UARTS - они могут делать MBITS - и рабы будут подключены к мастеру в конфигурации звезды, прослушивая запрос от мастера, когда идентификатор соответствует конкретному идентификационному соле, ответит. Если Slaves 'Uart TX Pins позволяют открыть дренаж, вы можете подключить все TXS -TX с RX Master («Wired или») и All Slab's RX с TX Master Tx напрямую.

joevpt
Сб 27 августа 2016 г., 21:13
Спасибо Саймону за разъяснение соединения. Прежде чем я сделаю это, могу ли я уточнить, что подтягивание требуется на обеих линиях, и на каждой линии TX требуется диод ?

Поэтому каждый MCU в этой настройке может прочитать каждую передачу и подтвердить свое собственное сообщение (например, Old Ethernet ищет столкновение).

Мне это нравится!

Саймонф
Сб 27 августа 2016 г. 22:11
Жупт написал:Спасибо Саймону за разъяснение соединения. Прежде чем я сделаю это, могу ли я уточнить, что подтягивание требуется на обеих линиях, и на каждой линии TX требуется диод ?

Поэтому каждый MCU в этой настройке может прочитать каждую передачу и подтвердить свое собственное сообщение (например, Old Ethernet ищет столкновение).

Мне это нравится!

joevpt
Сб 27 августа 2016 г., 22:45
Великий Саймон, и еще раз спасибо за быстрый ответ. Я доберусь до этого завтра. 30 см для меня более чем достаточно, поэтому я буду использовать несколько резисторов по 10 тыс.

Rogerclark
Сб 27 августа 2016 г. 11:05
Если вы получите эту работу, не могли бы вы сообщить нам об этом и опубликовать небольшую схематическую диаграмму

Спасибо

Роджер

Саймонф
Сб 27 августа 2016 г. 11:18
Жупт написал:Великий Саймон, и еще раз спасибо за быстрый ответ. Я доберусь до этого завтра. 30 см для меня более чем достаточно, поэтому я буду использовать несколько резисторов по 10 тыс.

rreignier
Sun 28 августа 2016 г., 13:56
Привет,
То, что вы пытаетесь сделать, кажется, что зовет St ST Многопроцессорное общение Как объяснено в пункте 27.3.6 в справочном руководстве F103 (RM0008).
Я никогда не пробовал, но просто хотел сообщить вам, что это задокументировано.

joevpt
Sun 28 августа 2016 г., 15:14
Rogerclark написал:Если вы получите эту работу, не могли бы вы сообщить нам об этом и опубликовать небольшую схематическую диаграмму

Спасибо

Роджер

Саймонф
Солнце 28 августа 2016 г., 16:50
Рриньье написал:Привет,
То, что вы пытаетесь сделать, кажется, что зовет St ST Многопроцессорное общение Как объяснено в пункте 27.3.6 в справочном руководстве F103 (RM0008).
Я никогда не пробовал, но просто хотел сообщить вам, что это задокументировано.

joevpt
Вторник 06 сентября 2016 12:34
Наконец -то добрался до этого вчера, и теперь он работает в конфигурации мастера/раба. Я протестировал его, используя Teensy 3.2 В качестве основного устройства и нескольких клонов Maple Mini в качестве подчиненных устройств. Для основного транзитного штифта не требуется особая кондиционирование, но я положил резистор для подтягивания на каждом рабском приеме. В моем случае с тремя рабами я использовал резисторы с 80 тысяч, потому что у меня были их.

Для передачи рабов я использовал небольшой диод на штифте передачи перед присоединением к шине Master Prethip.

Чтобы проверить, у меня была небольшая программа, отправляя строку каждые две секунды за последние 24 часа, и каждый раб признал, что они получили ее. Чтобы избежать столкновений на автобусе, я использовал приращения задержки на 100 мс на каждом рабыне (первый раб 100 мс, второй подчиненный 200 мс, третий подчиненный 300 мс) перед отправкой ACK.

Основная схема показана ниже. Теперь мне нужно написать простой протокол для моих нужд. Мое намерение состоит в том, чтобы использовать один байт -адрес, длина сообщения два байта, сообщение и CRC. Я намерен быть признанной каждой передачей адреса. Каждая трансляция не будет признана. Таким образом, это просто посредник, кто контролирует автобус.

Просто чтобы быть ясным, я использую для этого пару контактов TX/RX (потому что я не могу заставить рабов I2C работать). В своем тесте я использовал TX1/RX1 как на подростковых, так и на клонах Maple Mini, поскольку он позволил мне использовать USB -серийный монитор, чтобы увидеть, что происходит.
Cct.png
СКИт.PNG (4.68 киб) просмотрено 800 раз

Саймонф
Вторник 06 сентября 2016 г. 14:05
Жупт написал:Наконец -то добрался до этого вчера, и теперь он работает в конфигурации мастера/раба. Я протестировал его, используя Teensy 3.2 В качестве основного устройства и нескольких клонов Maple Mini в качестве подчиненных устройств. Для основного транзитного штифта не требуется особая кондиционирование, но я положил резистор для подтягивания на каждом рабском приеме. В моем случае с тремя рабами я использовал резисторы с 80 тысяч, потому что у меня были их.

Мадиас
Вторник 06 сентября 2016 г. 14:30
Жупт написал: Просто чтобы быть ясным, я использую для этого пару контактов TX/RX (потому что я не могу заставить рабов I2C работать).

Fredbox
Вторник 06 сентября 2016 г., 17:06
Теперь мне нужно написать простой протокол для моих нужд. Мое намерение состоит в том, чтобы использовать один байт -адрес, длина сообщения два байта, сообщение и CRC. Я намерен быть признанной каждой передачей адреса. Каждая трансляция не будет признана. Таким образом, это просто посредник, кто контролирует автобус. Моя дневная работа включает в себя общение между промышленными устройствами. Вы описываете, это Modbus/RTU, вероятно, используя код функции 03 или 04. Протокол является последовательным, допускает до 247 адресов устройства и имеет CRC в конце. Видеть САМЕЙМОДБ.калифорнийский Для получения информации о протоколе.

Сжимать
Ср. 07 сентября 2016 г. 14:47
Вам не нужно изобретать колесо, Modbus очень прост и протокол общего мастер-раба.
Вот очень хорошая реализация Modbus: http: // libmodbus.орг/
Вы также можете проверить реализацию Arduino Libmodbus здесь: http: // libmodbus.org/2011/libmodbus-for-arduino-alsy/ (Я использовал эту реализацию много раз с AVRS)

Rogerclark
Ср. 07 сентября 2016 г., 21:55
Сжимать

Спасибо за публикацию этих ссылок Modbus libs.

Я написал минимальную реализацию Modbus с несколькими функциями e.глин. WriteRegister Writecoil и т. Д., И это было очень просто.

Единственный трудный бит - это пользовательский CRC, и в Интернете был пример кода

Сжимать
Чт, 08 сентября 2016 г., 1:00 утра
Есть два способа реализации расчета CRC. Первое - это сделать все вычисления по коду, а второй способ - использовать таблицу поиска.
В 8051/AVR World метод Lookup Table лучше и быстрее, но требует некоторой кодовой памяти больше (512 байтов для таблиц), в мире Arm скорость не является проблемой, а вычислительный метод более элегантный.

Вот мой код для метода поиска таблицы (используя директиву GCC-AVR PROGMEM для хранения таблиц во вспышке) uint8_t CRCHi[] PROGMEM = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 }; uint8_t CRCLo[] PROGMEM = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; /*---------------------------------------------------------------------------*/ /** @brief calculate the CRC16 value of the input data @param buf input data @param len length of the input data @return CRC16 value of the input data */ /*---------------------------------------------------------------------------*/ uint16_t CRC16( uint8_t *buf, uint8_t len) { uint8_t hi=0xFF; uint8_t lo=0xFF; uint16_t index; while ( len-- ) { index = lo ^ (uint8_t)*buf++; lo = hi ^ pgm_read_byte(&CRCHi[index]); hi = pgm_read_byte(&CRCLo[index]); } index = lo << 8; index |= hi; return(index); }

Rogerclark
Чт, 08 сентября 2016 г. 1:15 утра
Я думаю, что я использовал вычислительный метод, но оба действительны. Данные Modbus я был настолько мал, что время расчета CRC было незначительным

Бубулиндо
Чт, 08 сентября 2016 г., 7:35 утра
Это может быть глупым вопросом, но разве подразделение CRC на STM32F103 не будет идеальным для этого расчета??

Сжимать
Чт, 08 сентября 2016 г., 11:04
Хотя можно подключить MCU с TX и RX (с некоторыми диодами и резисторами), протокол Modbus RTU предназначен для работы с сети RS485 (очень легко использовать транс 485, как ADM485 или SN75176, на линии TX/RX)
Это очень распространено в промышленных системах (для подключения ПЛК с датчиками, удаленным iOS и т. Д.), Поскольку общая длина провода сети может составлять до 1600 м и скорости передачи данных до 10 Мбит.
Ограничение протокола состоит в том, что есть только один мастер, и рабы не могут инициировать передачу без запроса мастера.

PS: Много очень низко ценой UART<>Модули RS485 существуют на eBay/AliexPress: http: // www.eBay.com/sch/i.HTML?_nkw = rs485&_sop = 15

Rogerclark
Чт, 08 сентября 2016 г., 11:30 утра
Бубулиндо написал:Это может быть глупым вопросом, но разве подразделение CRC на STM32F103 не будет идеальным для этого расчета??

Бубулиндо
Чт, 08 сентября 2016 г. 18:31
Я только что посмотрел, и нет. Он не совместим на F1 или F4, так как они прикреплены к 0x4c11db7, который, по -видимому, в основном используется в TCP/IP.

F3, однако... с программируемым полиномом и N -битом размер данных, по -видимому, возможен.

Я думал, что уже реализована библиотека для CRC... Вы знаете что -нибудь об этом?

Rogerclark
Чт, 08 сентября 2016 г., 21:16
Код CRC хорошо задокументирован, и @Slammer разместил его.

HW CRC интересен, но в этом случае это кувалдо

Сжимать
Чт, 08 сентября 2016 г., 22:13
Обсуждение об аппаратном расчете CRC для Modbus, хотя это интересно, не имеет практической ценности, рамки очень малы, а вычислительный метод очень быстрый на руке, необходимое время на диапазоне микросекундов. Даже на 8051, много лет назад, я использовал оба метода (вычислительный метод меньше, а иногда каждый байт считается небольшими MCU), и не было проблем.

Rogerclark
Чт, 08 сентября 2016 г., 22:29
Сламмер написал:Обсуждение об аппаратном расчете CRC для Modbus, хотя это интересно, не имеет практической ценности, рамки очень малы, а вычислительный метод очень быстрый на руке, необходимое время на диапазоне микросекундов. Даже на 8051, много лет назад, я использовал оба метода (вычислительный метод меньше, а иногда каждый байт считается небольшими MCU), и не было проблем.

Пито
Сб 10 сентября 2016 г. 16:30
В схемы - я бы добавил резистор 100OM в RX каждого раба, чтобы избежать звонка (проводятся между RX Master и RX раба) RX).
К физическому слою - вы используете слой, управляемый напряжением, (высокий импеданс), для длины 30 см все в порядке, для 500 м, он не будет работать, однако, однако.
Промышленное использование, т.е. «Целевая петля» (низкий импеданс, то есть петля тока 20 мА), хорошо для больших расстояний, обычно изолированный с опто.
RS485 - это тоже низкий импеданс.

joevpt
Пт 23 сентября 2016 г., 18:07
Всем привет,

Наконец-то у меня есть работа, как это предложило Пито и Симонф, складывая все доски только на порту RX и локально связывая порт TX с портом RX через диод. Преимущество, как говорят ребята, состоит в том, что все советы получают сообщение на порту RX (включая текущего докладчика), и нет главной доски автобусов (даже один равен). Вы можете контролировать, как это работает полностью в программном обеспечении, поэтому вы можете иметь в своей программе, что некоторые доски говорят только при разговоре, в то время как другие доски позволяют инициировать связь.

Схема довольно проста, и, хотя я использовал два резистора (по одному на каждом конце каждый составлял 20 тысяч), она работала только с одним резистором.

Большое спасибо всем, кто предложил советы и особенно Пито и Саймонфу

С уважением,

Джо
Pict1.png
пик1.PNG (4.8 киб) просмотрено 998 раз

Саймонф
Пт 23 сентября 2016 г., 18:42
Добро пожаловать в помощь. Рад, что вы получили это, это самый простой и гибкий способ соединить кучу взлетов, которые вы даже можете уйти со смесью устройств 3/5 В.

Rogerclark
Пт 23 сентября 2016 г., 8:37 вечера
Джо

Это похоже на изобретательно простую систему.

Возможно, ему нужно имя ;-)

"Maple Bus" ;-)

joevpt
Пт 23 сентября 2016 г., 21:57
Роджер,

Чтобы использовать Maple Mini в моем проекте (переносить его непосредственно из Arduino Mega), мне понадобится библиотека I2C, чтобы поддержать как мастер, так и рабский режим. Это решение намного проще, что попытка добавить подчиненный код в библиотеку, и хотя это означает, что мне нужно написать немного больше кода, чтобы сделать протокол, как описали другие в этой теме, он добавляет функциональность без каких -либо ограничений.

Мне нравится «Maple Bus» как термин, но, конечно, решение работает с любым MCU, у которого есть порт UART.

Отличный форум, с множеством отличных идей здесь, так хорошо сделано для всех вас.

Джо

Rogerclark
Пт 23 сентября 2016 г., 22:08
Привет, Джо

Спасибо

Я понимаю, что это будет работать с любым MCU, и вы можете иметь 5V и 3.3 В на автобусе одновременно, что великолепно, так как иногда необходимо смешать 5 В Arduino Pro-Mini's и STM32 в том же проекте.

Итак, "Maple Bus", возможно, не самое лучшее имя, но я не мог думать ни о чем, на момент ;-)

Пито
Сб 24 сентября 2016 г., 6:20 утра
Это в основном «1-проводная» автобус, разработанный Dallas Semiconductor. Я думаю, что написать хорошо работающий «драйвер» для такой настройки было бы проблемой.

Martinayotte
Сб 24 сентября 2016 г. 16:48
Действительно, задача заключается в том, что программное обеспечение, а не аппаратное обеспечение, такая же проблема, как и с автобусом RS485: столкновения при использовании в Multi Master Protocol.
Хотя наличие одного мастера/арбитра решает такие проблемы.

Пито
Солнце 25 сентября 2016 г. 8:46 утра
Как я писал ранее, у меня была настройка 1MASTER - XSLAVES (небольшой проект автоматизации лаборатории за 80 лет), и мы закончили с приложением, где мастер отправил запрос с [ADDR] и [Команда], а Slave_XY ответил каким -то действием или [[ данные]. Afaik, чтобы заставить его работать каким -то образом надежно, мы везде везде в течение длительных задержек/тайм -аутов, чтобы избежать столкновений (ответы от рабов иногда не были немедленными и зависели от других внешних событий) :)
Но сегодня ребята намного умны, чем мы были в эпоху динозавров :) Так что я совершенно уверен, что хороший SW для этой 1-проводной установки выполняется..

DAUGINARUG
Пн 20 марта 2017 г. 16:38
Всем здравствуйте,
Я новичок в устройствах STM32 и на этом форуме.
Мне было интересно, работал ли кто -нибудь над кодом "Maple Bus". У кого -нибудь есть пример кода или, возможно, новая библиотека для такого типа общения?

У меня был проект, в котором использовались два Pro Mini Arduinos, в которых говорилось I2C. Один мастер и один раб. Я хотел перенести этот проект в Maple Mini, но не хочу повторно изобретать колесо.

Black Pill Datalogger Accesing SDHC из USB