UART의 신비한 RX 펄스는 OS X Arduino Due에 연결됩니다.


14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

여러 클라이언트 라이브러리 (Python, JavaScript 및 IDE의 내장 직렬 모니터)를 사용하여 직렬 포트에 연결할 때 8 개의 신비한 펄스가 RX 라인에 표시됩니다. Logic Pro 16으로 1MS / s로 샘플링 된 약 78-79us.

미스터리 펄스

57600 보드에서 해석 될 때이 8 개의 펄스는 Firmata 펌웨어를 방해합니다. 그리고 그들은 모든 연결에서 발생합니다.

Arduino 1.6.8 IDE를 새로 설치하고 여러 스케치를 사용합니다 (일반적인 "깜박임"스케치도이를 재현합니다).

내 컴퓨터의 재현 단계 :

  1. 스케치 설치
  2. 잡으려면 로직 분석기를 시작하십시오.
  3. 직렬 모니터로 이동하십시오. 57600 baud, 줄 바꿈 줄 끝으로 구성했지만 중요하지 않습니다.
  4. 원하는 경우 3 단계를 닫고 반복하십시오.
  5. 직렬 포트에 연결할 때마다 펄스가 발생합니다.

이를 진단하기위한 제안 사항이 있습니까? 어떤 식 으로든 직렬 드라이버 수준 인 것 같습니다.


1
어디에서 왔는지에 관계없이 실행중인 펌웨어의 치명적인 버그를 표시하여 호의를 베 풀었습니다.이를 복구 할 수없는 상태로 만들 수는 없습니다. 프로그램 논리 버그입니까, 아니면 UART 처리 코드가 오류 플래그를 적절하게 처리하지 않습니까?
Chris Stratton

1
소스를 추적하는 관점에서 다른 직렬 클라이언트 프로그램, 다른 컴퓨터 / 운영 체제, 다른 USB 직렬 장치 등을 사용해 보는 것이 도움이 될 것입니다.
Chris Stratton

1
다른 직렬 프로그램을 시도 할 때 Firmata 프로토콜과 상호 작용하고 동일한 동작을 나타내는 다른 기본 직렬 구현 (Python, JavaScript 및 내장 Arduino IDE 직렬 모니터)을 사용하는 여러 라이브러리가 있습니다. 다음 계획은 Linux 시스템에서 시도해보고 동일한 동작이 나타나는지 확인하는 것입니다. OS X에만 해당되는 경우이를 격리 할 것입니다.
Blake Ramsdell

2
연결을 끊을 때 하나도 얻습니다. 연결 보오율은 펄스 길이에 영향을 미치지 않습니다. 내 의심은 그것이 그것을하는 ATMega16U2의 펌웨어 (또는 어떤 버전의 칩이든)라는 것입니다.
Majenko

1
직렬 모니터를 시작하면 소프트웨어가 arduino 모듈을 재설정합니다. arduino 모듈에 부트 로더가 있으면 STK500 프로토콜 신호라고 생각합니다.
Mert Gülsoy

답변:


1

짧은:

ATMEGA16U2 펌웨어를 보면 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) USB 에뮬레이트 된 직렬 포트, USART가 재설정됩니다. 이것은 Arduino Serial Monitor를 열 때도 발생합니다 (직렬 속도 등을 구성해야 함). 이로 인해 스파이크가 발생합니다.

긴:

기능을보십시오 :

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

거기에서 일부 라인 뒤에 레지스터를 제로화하여 USART를 재설정한다는 것을 알 수 있습니다.

/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
    UCSR1B = 0;
    UCSR1A = 0;
    UCSR1C = 0;

현재 ATMEGA16U2 데이터 시트의 168 페이지에서 UCSR1B의 비트 3 (TXEN1)을 설정하여 트랜스미터를 활성화하여 일반 포트 작동을 재정의 함 (즉, 출력이 됨)을 알 수 있습니다. 데이터 시트 인용 :

이 비트를 1로 쓰면 USART 송신기가 활성화됩니다. 트랜스미터는 활성화 된 경우 TxDn 핀의 일반 포트 작동을 무시합니다. 전송기의 비활성화 (TXENn을 0으로 쓰기)는 진행 중이거나 보류중인 전송이 완료 될 때까지, 즉 전송 시프트 레지스터 및 전송 버퍼 레지스터에 전송할 데이터가 포함되지 않은 경우에는 적용되지 않습니다. 비활성화되면 트랜스미터는 더 이상 TxDn 포트를 무시하지 않습니다.

따라서 쓰기 UCSR1B = 0;를하면 TXD1 핀을 더 이상 덮어 쓰지 않아도되며 입력으로 작동합니다.

ATMEGA16U2 TXD는 ATSAM3X8E의 RX 라인에 연결되어 있습니다. 정상 작동에서 UART가 활성화 된 상태에서 데이터가 전송되지 않으면 해당 라인은 계속 높게 유지됩니다. UART를 비활성화하면 해당 라인이 더 이상 드라이버가되지 않습니다. 초기화 코드는 해당 핀에서 풀업을 설정하지 않으며 출력으로 구성되지 않기 때문에 핀이 부동 입력이되고 누수가 발생합니다. GND 또는 프로브의 입력 임피던스 (핀과 GND 사이에 있음)는 천천히 로직 레벨을 0으로 만듭니다.

이 문제를 무시하려면 1) 해당 PIN을 OUTPUT으로 값 1로 설정하여 ATMEGA16U2 펌웨어를 수정하십시오. 2) 해당 핀에서 풀업을 활성화하여 ATMEGA16U2 펌웨어를 수정하십시오. 3) (추천) ATSAM3X8E의 RX 라인에서 풀업을 활성화하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.