สั้น:
ดูเฟิร์มแวร์ ATMEGA16U2 ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/ฉันพบว่าเมื่อคุณกำหนดค่า / เปลี่ยนแปลงการตั้งค่าของ พอร์ตอนุกรม 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;
ที่หน้า 168 ของแผ่นข้อมูล ATMEGA16U2 ปัจจุบันคุณจะพบว่าโดยการตั้งค่าบิต 3 (TXEN1) ของ UCSR1B คุณเปิดใช้งานเครื่องส่งสัญญาณแทนที่การทำงานของพอร์ตปกติ (เช่นจะกลายเป็นเอาต์พุต) การอ้างถึงแผ่นข้อมูล:
การเขียนบิตนี้เป็นหนึ่งจะเปิดใช้งานเครื่องส่งสัญญาณ USART เครื่องส่งสัญญาณจะแทนที่การทำงานของพอร์ตปกติสำหรับพิน TxDn เมื่อเปิดใช้งาน การปิดการใช้งานของเครื่องส่งสัญญาณ (การเขียน TXENn เป็นศูนย์) จะไม่มีผลจนกว่าการส่งสัญญาณอย่างต่อเนื่องและรอดำเนินการจะเสร็จสิ้นเช่นเมื่อ Transmit Shift Register และ Transer Buffer Register ไม่มีข้อมูลที่จะส่ง เมื่อปิดการใช้งานเครื่องส่งสัญญาณจะไม่แทนที่พอร์ต TxDn อีกต่อไป
ดังนั้นโดยการเขียนUCSR1B = 0;
คุณจะไม่แทนที่ PIN TXD1 อีกต่อไปซึ่งจะทำหน้าที่เป็นอินพุต
ATMEGA16U2 TXD เชื่อมต่อกับสาย RX ของ ATSAM3X8E ในการทำงานปกติเมื่อเปิดใช้งาน UART บรรทัดนั้นจะยังคงอยู่ในระดับสูงหากไม่มีการส่งข้อมูล หากคุณปิดใช้งาน UART บรรทัดนั้นจะไม่มีไดรเวอร์อีกต่อไปเป็น 1 เนื่องจากรหัสการเริ่มต้นไม่ได้ตั้งค่า pull-up บนพินนั้น (และไม่ได้กำหนดค่าเป็นเอาต์พุต) พินจะกลายเป็นอินพุตแบบลอยและการรั่วไหลใด ๆ GND หรือแม้แต่อิมพิแดนซ์อินพุตของโพรบของคุณ (ซึ่งอยู่ระหว่างพินและ GND) จะทำให้ระดับตรรกะเป็น 0 อย่างช้าๆ
ในการแก้ไขปัญหานี้คุณควร: 1) แก้ไขเฟิร์มแวร์ ATMEGA16U2 โดยการตั้งค่า PIN นั้นเป็น OUTPUT ด้วยค่า 1 2) แก้ไขเฟิร์มแวร์ ATMEGA16U2 โดยเปิดใช้งานการดึงที่ขานั้น 3) (แนะนำ) เปิดใช้งานการดึงขึ้นบนบรรทัด RX บน ATSAM3X8E