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.