Полудуплекс для Atmel SAMD21

communication samd21g atmel mkr-gsm-1400

Я использую Arduino MKR GSM 1400. Я знаю, что эта плата использует Atmel SAMD21 и SAMD21 поддерживает полудуплекс (USART с полнодуплексной и однопроводной полудуплексной конфигурацией). Мой вопрос в том, как я могу настроить один из SERCOMs, чтобы использовать его как полудуплексный (используйте один вывод для rx и tx)?

, 👍1

Обсуждение

какую проблему вы пытаетесь решить?, @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


2 ответа


Лучший ответ:

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


1

Вы можете использовать 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 ) { ; } // Если вы не хотите получать собственную передачу

Надеюсь, это поможет.

,