Các xung RX bí ẩn trên UART kết nối trên OS X Arduino Do


14

Arduino IDE 1.6.8, Arduino Do, Mac OS 10.11.3

Tôi đang thấy tám xung bí ẩn trên dòng RX khi tôi kết nối với cổng nối tiếp bằng nhiều thư viện máy khách (Python, JavaScript cũng như Trình giám sát nối tiếp tích hợp trong IDE). Khoảng 78-79us mỗi người, được lấy mẫu với tốc độ 1MS / giây với Logic Pro 16.

Xung bí ẩn

Tám xung này khi được giải thích ở 57600 baud sẽ làm kẹt phần vững Firmata. Và chúng xảy ra trên mọi kết nối.

Điều này đang sử dụng một bản cài đặt mới của Arduino 1.6.8 IDE và với nhiều bản phác thảo (bản phác thảo "Blink" bình thường cũng sẽ tái tạo điều này).

Repro các bước trên máy của tôi:

  1. Cài đặt bất kỳ bản phác thảo
  2. Bắt đầu một bộ phân tích logic nếu bạn muốn bắt nó
  3. Chuyển đến Màn hình nối tiếp. Tôi có cấu hình của tôi cho 57600 baud, kết thúc dòng Newline, nhưng nó không thành vấn đề
  4. Nếu bạn muốn, đóng và lặp lại bước 3
  5. Lưu ý các xung mỗi khi bạn kết nối với cổng nối tiếp

Bất kỳ đề nghị để chẩn đoán này? Nghe có vẻ như cấp trình điều khiển nối tiếp theo một cách nào đó.


1
Bất kể nó đến từ đâu, hãy xem xét rằng nó đã giúp bạn bằng cách chỉ ra một lỗi nghiêm trọng trong phần sụn bạn đang chạy - điều này không thể đặt nó ở trạng thái không thể phục hồi. Đây có phải là lỗi logic chương trình hay mã xử lý UART không xử lý thích hợp với cờ lỗi?
Chris Stratton

1
Về mặt theo dõi nguồn, sẽ rất hữu ích khi thử một chương trình máy khách nối tiếp khác, máy tính / hệ điều hành khác, thiết bị nối tiếp USB khác, v.v ...
Chris Stratton

1
Đối với việc thử các chương trình nối tiếp khác, có nhiều thư viện tương tác với giao thức Firmata và sử dụng các triển khai nối tiếp cơ bản khác nhau (Python, JavaScript và Trình giám sát nối tiếp Arduino IDE) thể hiện hành vi tương tự. Kế hoạch tiếp theo của tôi là thử điều này trên máy Linux và xem liệu tôi có thấy hành vi tương tự hay không, điều này hy vọng sẽ cô lập nếu đây là đặc thù của OS X.
Blake Ramsdell

2
Bạn cũng nhận được một khi bạn ngắt kết nối. Tốc độ truyền kết nối không ảnh hưởng đến độ dài của xung. Tôi nghi ngờ rằng đó là phần sụn của ATMega16U2 đang làm điều đó (hoặc bất kỳ con chip nào trên bất kỳ phiên bản nào).
Majenko

1
Khi bạn khởi động màn hình nối tiếp, phần mềm sẽ đặt lại mô-đun arduino. Nếu mô-đun arduino có bộ tải khởi động trong đó, tôi nghĩ đây là các tín hiệu giao thức STK500.
Mert Gülsoy

Câu trả lời:


1

Ngắn:

Nhìn vào phần mềm ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) Tôi thấy rằng, khi bạn định cấu hình / thay đổi cài đặt của Cổng nối tiếp giả lập USB, USART được đặt lại. Điều này xảy ra ngay cả khi bạn mở Arduino serial Monitor (nó phải cấu hình tốc độ nối tiếp, v.v.). Điều này gây ra đột biến của bạn.

Dài:

Nhìn vào chức năng:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

Ở đó bạn sẽ thấy rằng sau một số dòng, nó đặt lại USART, bằng cách xóa các thanh ghi của nó:

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

Tại trang 168, trong bảng dữ liệu ATMEGA16U2 hiện tại, bạn sẽ thấy rằng, bằng cách đặt bit 3 của UCSR1B (TXEN1), bạn kích hoạt bộ phát, ghi đè hoạt động của cổng thông thường (nghĩa là nó trở thành đầu ra). Trích dẫn biểu dữ liệu:

Viết bit này thành một cho phép Bộ phát USART. Máy phát sẽ ghi đè hoạt động cổng bình thường cho chân TxDn khi được bật. Việc vô hiệu hóa Máy phát (ghi TXENn về 0) sẽ không có hiệu lực cho đến khi việc truyền đang diễn ra và đang chờ xử lý được hoàn thành, nghĩa là khi Đăng ký thay đổi truyền và Đăng ký bộ đệm truyền không chứa dữ liệu được truyền. Khi bị tắt, Máy phát sẽ không còn ghi đè cổng TxDn.

Do đó, bằng cách viết, UCSR1B = 0;bạn không còn ghi đè chân TXD1, mà sẽ đóng vai trò là đầu vào.

ATMEGA16U2 TXD được kết nối với dòng RX của ATSAM3X8E. Trong hoạt động bình thường, với UART được bật, dòng đó vẫn ở mức cao nếu không có dữ liệu nào được truyền đi. Nếu bạn tắt UART, dòng cụ thể đó sẽ không còn trình điều khiển nữa 1. Vì mã khởi tạo không đặt kéo lên trên pin đó (và không được định cấu hình là đầu ra), pin trở thành đầu vào nổi và bất kỳ rò rỉ nào GND hoặc thậm chí trở kháng đầu vào của đầu dò của bạn (nằm giữa pin của bạn và GND), sẽ từ từ đưa mức logic về 0.

Để ghi đè điều này, vấn đề, bạn nên: 1) Sửa đổi phần sụn ATMEGA16U2, bằng cách đặt mã PIN đó là OUTPUT, với giá trị 1. 2) Sửa đổi phần sụn ATMEGA16U2, bằng cách bật kéo lên trên pin đó. 3) (được đề xuất) Kích hoạt tính năng kéo lên trên dòng RX trên ATSAM3X8E.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.