Полудуплекс для Atmel SAMD21
Я использую Arduino MKR GSM 1400. Я знаю, что эта плата использует Atmel SAMD21 и SAMD21 поддерживает полудуплекс (USART с полнодуплексной и однопроводной полудуплексной конфигурацией). Мой вопрос в том, как я могу настроить один из SERCOMs, чтобы использовать его как полудуплексный (используйте один вывод для rx и tx)?
@user3866081, 👍1
Обсуждение2 ответа
Лучший ответ:
До шести последовательных коммуникационных интерфейсов (SERCOM), каждый из которых настраивается для работы как:
- USART с полнодуплексной и однопроводной полудуплексной конфигурацией
- I2C до 3,4 МГц
- СПИ
- ЛИН рабыня
Это ошибка в обзоре функций SAM D21 в таблице данных. SERCOM является полудуплексным для I2C. USART не может быть настроен полудуплексно.
см. Примечание к приложению о конфигурации SERCOM
1 Введение в интерфейсы последовательной связи (USART, I2C и SPI)
... Обмен данными может быть полудуплексным или полнодуплексным в зависимости от спецификации последовательного модуля. ...
1.1 USART
... Он работает в полнодуплексном режиме. ...
1.2 I2C
... Это полудуплекс в общении. ...
Есть ли вообще возможность настроить USART как полудуплексный?, @user3866081
Есть ли такая библиотека, как https://github.com/nickstedman/SoftwareSerialWithHalfDuplex для SAMD21?, @user3866081
как я пишу в ответе. , @Juraj
Я не знаю ни о какой библиотеке SoftwareSerial для SAMD Arduino, @Juraj
Вы можете использовать USART в полудуплексном режиме.
Для этого доступны SERCOMx.PAD0 или SERCOMx.PAD2. См. документ «AT03256: Драйвер SAM D/R/L/C Serial USART (SERCOM USART)». раздел «10. Настройки SERCOM USART MUX».
Ниже приведен фрагмент кода для ATXMEGA32E5, SERCOM0, PAD0. Проверено - работает:
Подтягивание поможет сохранить линию на уровне 1, когда передатчик устройства выключен и на линии нет другого передатчика или он еще не включен. В процедуре настройки GPIO:
// PA08 - SERCOM0/PAD[0]
PORT->Group[0].PINCFG[8].bit.PULLEN=1; // Включение вытягивания
PORT->Group[0].PINCFG[8].bit.PMUXEN=1; // Включение периферийного мультиплексора
PORT->Group[0].PMUX [4].bit.PMUXE=0x02; // функция PMUX C - SERCOM0/PAD[0]
В процедуре настройки SERCOM настройте TX и RX на одной панели:
while(SERCOM0->USART.SYNCBUSY.reg & 0x07) { ; }
SERCOM0->USART.CTRLA.bit.TXPO = 0x00; // SERCOM PAD[0] Распиновка передачи данных
while(SERCOM0->USART.SYNCBUSY.reg & 0x07) { ; }
SERCOM0->USART.CTRLA.bit.RXPO = 0x00; // SERCOM PAD[0] используется для приема данных
Если во время передачи и приемник, и передатчик включены одновременно, вы услышите эхо.
Когда встанете на прием, не забудьте выключить передатчик, чтобы он не мешал приему:
SERCOM0->USART.CTRLB.bit.TXEN=0x00; while(SERCOM0->USART.SYNCBUSY.bit.CTRLB ) { ; }
SERCOM0->USART.CTRLB.bit.RXEN=0x01; while(SERCOM0->USART.SYNCBUSY.bit.CTRLB ) { ; }
Перед передачей не забудьте включить передатчик:
SERCOM0->USART.CTRLB.bit.TXEN=0x01; while(SERCOM0->USART.SYNCBUSY.bit.CTRLB ) { ; }
SERCOM0->USART.CTRLB.bit.RXEN=0x00; while(SERCOM0->USART.SYNCBUSY.bit.CTRLB ) { ; } // Если вы не хотите получать собственную передачу
Надеюсь, это поможет.
- Почему IDE не может найти плату, несмотря на то, что она четко видна и выбрана?
- Seeeduino СЯО запись и чтение ШИМ продолжительность (период) с помощью таймеров
- Связывание загрузчика Arduino В Atmel Studio
- Как заставить Arduino взаимодействовать с тремя другими Ардуино?
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Последовательная связь между ESP8266 и Arduino Uno
- Отправка значения с одного Arduino на другой
- SIM900 3G? Или SIM900A умеет подключаться к 3G?
какую проблему вы пытаетесь решить?, @Juraj
@Juraj Так что же это такое http://asf.atmel.com/docs/latest/sam0.applications.samba_bootloader.samc21_xplained_pro/html/asfdoc_sam0_sercom_usart_mux_settings.html ?, @user3866081
@Juraj "Когда TX и RX подключены к одному и тому же контакту, USART будет работать в полудуплексном режиме, если включены как один передатчик, так и несколько приемников"., @user3866081
так что попробуй. классы-оболочки Arduino не имеют конфигурации clock pin, поэтому вы не можете настроить USART только UART. поэтому вы должны использовать регистры или какой-то другой фреймворк, а затем Arduino, @Juraj