ฉันเพิ่งตระหนักว่า8051ตระกูลใช้ 11.0592 MHz และทวีคูณของมันเพื่อสร้างอัตราการรับส่งข้อมูลแบบมาตรฐาน แต่มีSoCที่ใช้ 15 MHz พวกเขาจะทำเช่นนี้ได้อย่างไร
ฉันเพิ่งตระหนักว่า8051ตระกูลใช้ 11.0592 MHz และทวีคูณของมันเพื่อสร้างอัตราการรับส่งข้อมูลแบบมาตรฐาน แต่มีSoCที่ใช้ 15 MHz พวกเขาจะทำเช่นนี้ได้อย่างไร
คำตอบ:
UART ไม่สนใจตราบใดที่มันสมเหตุสมผล
ดังนั้น UART ของคุณจะเร็วเกินไปด้วยค่า1.002204 มันกลายเป็นปัญหาที่1+1เมื่อเวลาเปลี่ยนไป 11 บิตมากกว่าครึ่ง
นี่คือคำอธิบายคุณสมบัติ 'พิมพ์ขนาดใหญ่' ของ ARM ARM ที่ค่อนข้างสูง
มี PLL และตัวแบ่งจำนวนหนึ่งพร้อมพรีสเกลเลอร์และ postscalers ที่สามารถสร้างความถี่ได้เกือบทุกประเภทที่คุณอาจต้องใช้ในอัตราส่วนจำนวนเต็ม PLL คูณความถี่ของตนโดยจำนวนเต็มบางส่วนและแบ่งสามารถหารด้วยจำนวนบางคน ( ไม่จำเป็นต้องเป็นอำนาจของ 2 ในแต่ละกรณี)
ความถี่ที่ค่อนข้างสูงภายใน (ประมาณครึ่ง GHz ในกรณีนี้) ไม่ใช่ปัญหา (อย่างที่พวกเขาทำหากปิดชิพ) - ใช้พลังงานค่อนข้างน้อย
วันของการหารด้วยพลังของ 2 จบลงเมื่อไม่นานมานี้และตอนนี้ PLL ถูกนำไปใช้โดยทั่วไปเราไม่จำเป็นต้องกังวลเกี่ยวกับความถี่คริสตัลแน่นอนเกือบเท่า ในทางกลับกันเราอาจต้องการความถี่สัญญาณนาฬิกาที่แตกต่างกันสำหรับนาฬิกาบัสภายใน, USB, Ethernet, UART และอุปกรณ์ต่อพ่วงอื่น ๆ
หากคุณต้องการเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการทำงานเหล่านี้คุณสามารถศึกษาชิปการสังเคราะห์สัญญาณนาฬิกาบางตัวที่ค่อนข้างง่าย (แต่ยังซับซ้อนพอที่ผู้ผลิตบางรายจัดหาซอฟต์แวร์เพื่อคำนวณค่าคงที่การตั้งค่า)
สามารถทำได้โดยใช้ โมดูเลเตอร์
ดูตัวอย่างคู่มือผู้ใช้ MSP430x1xxคู่มือผู้ใช้บนหน้า 260 มันบอกว่า:
ตัวสร้างอัตราการรับส่งข้อมูลของ USART สามารถสร้างอัตราการรับส่งข้อมูลแบบมาตรฐานจากความถี่แหล่งที่ไม่ได้มาตรฐาน เครื่องกำเนิดอัตราการรับส่งข้อมูลจะใช้หนึ่ง prescaler / ตัวแบ่งและตัวดัดแปลงดังแสดงในรูปที่ 13−7 ชุดนี้รองรับตัวหารเศษส่วนสำหรับการสร้างอัตราการส่งข้อมูล
(สังเกตพื้นที่สีเทา)
ปัจจัยการหาร N มักเป็นค่าที่ไม่ใช่จำนวนเต็มซึ่งส่วนจำนวนเต็มสามารถรับรู้ได้โดย prescaler / divider ขั้นตอนที่สองของตัวสร้างอัตราการส่งข้อมูลคือตัวมอดูเลเตอร์ใช้เพื่อให้ตรงกับส่วนที่เป็นเศษส่วนมากที่สุด
[ ... ]
BITCLK สามารถปรับจากบิตเป็นบิตด้วยโมดูเลเตอร์เพื่อตอบสนองความต้องการเวลาเมื่อต้องการตัวหารที่ไม่ใช่จำนวนเต็ม เวลาของแต่ละบิตจะถูกขยายโดยหนึ่งรอบนาฬิกา BRCLK ถ้าตั้งค่าบิตตัวดัดแปลง ทุกครั้งที่รับหรือส่งบิตบิตถัดไปในเรจิสเตอร์ควบคุมการปรับจะกำหนดเวลาสำหรับบิตนั้น บิตการมอดูเลตชุดเพิ่มปัจจัยการหารหนึ่งในขณะที่บิตการมอดูเลตเคลียร์จะรักษาปัจจัยการหารที่กำหนดโดย UxBR
[ ... ]
ผู้คนมากมายคิดว่า UART นั้นกำลังทำงานอยู่บนนาฬิกาตายตัวนั่นคือคุณนำตัวอย่างมาทุกอัน วินาที สิ่งนี้ไม่เป็นความจริง อย่างน้อยไม่ได้อยู่ในโมดูล UART ทั้งหมดที่ฉันออกแบบมา
วิธีการทำงานคือคุณมีนาฬิกาตัวอย่างภายใน สมมติว่าคุณสามารถสุ่มตัวอย่างทุก ๆ 100ns คุณรู้ว่าจุดกึ่งกลางของแต่ละบิตคืออะไร ดังนั้นคุณเลือกจุดสุ่มตัวอย่างที่ใกล้เคียงกลางมากที่สุด สิ่งนี้จะทำให้คุณมีข้อผิดพลาดมากถึง 50ns
สิ่งที่เกิดขึ้นคือคุณได้รับบิตเริ่มต้น จากนั้นคุณจะกำหนดจุดกึ่งกลางของบิตนั่นคือจุดอ้างอิงของคุณ จากนั้นคุณจะรู้ว่าต้องรอนานแค่ไหนเพื่อลองชิมบิตต่อไป ดังนั้นคุณโหลดตัวนับขึ้นมาและเมื่อมันรีเซ็ตคุณตัวอย่าง ทีนี้คุณจะออกรอบโดยไม่เกิน 1 รอบนาฬิกาของนาฬิกาภายในอย่างรวดเร็ว แต่ส่วนใหญ่จะเป็นนาโนวินาที นอกจากนี้คุณรู้ว่าคุณปิด สำหรับบิตถัดไปคุณโหลดตัวนับของคุณด้วยค่าที่แตกต่างกันดังนั้นคุณจึงอยู่ใกล้กับกลางมากที่สุด
ในระบบจริงมีสิ่งต่าง ๆ มากมายที่เกิดขึ้นเช่นกัน ตัวอย่างเช่นคุณไม่ได้รับหนึ่งตัวอย่างคุณสามารถใช้เวลาสองสามและทำการประมวลผลบางอย่างกับพวกเขา ฯลฯ ผลที่ได้คือ ADC 1 บิตพร้อมความหมายทั้งหมดเช่นเสียงควอนติเซชั่น แต่คุณควรได้รับความคิดทั่วไป
Modern SoC ใช้ PLL ที่เรียกว่าสร้าง (เกือบ) นาฬิกาใด ๆ ที่อาจจำเป็นสำหรับอินเตอร์เฟส ในแง่ง่ายวงจร PLLใช้ VCO ความถี่สูง (oscillator ควบคุมแรงดันไฟฟ้า) จากนั้นใช้ตัวแบ่งความถี่ที่แตกต่างกันทั้ง VCO และนาฬิกาอินพุตและสร้างการป้อนกลับแรงดันไฟฟ้าตามอัตราส่วนความถี่ ข้อเสนอแนะนี้จะควบคุม VCO เช่นว่าวงทั้งหมดจะถูกล็อคกับความถี่ที่ต้องการ
สมมติว่า 8 บิตไบต์นำหน้าด้วยบิตเริ่มต้นเดียวแล้วตามด้วยบิตหยุดเดียวและสมมติว่าการสุ่มตัวอย่างที่สมบูรณ์แบบโดยผู้รับซึ่งหมายความว่าหลังจากระยะเวลา 9.5 บิตนาฬิกาจะต้องปิดโดยน้อยกว่าครึ่งบิตบิต
นั่นหมายถึงความแตกต่างของนาฬิกาที่สามารถรับได้สูงสุดระหว่างตัวส่งและตัวรับคือ 5% อย่างไรก็ตามอาจมีข้อผิดพลาดที่ปลายทั้งสองด้านของลิงค์และการประสานการรับอาจไม่สมบูรณ์ ในทางปฏิบัติดังนั้นโดยทั่วไปฉันขอแนะนำว่าอัตราการรับส่งข้อมูลจริงจะถูกเก็บไว้ภายใน 1% ของอัตราการส่งข้อมูลที่ระบุ
ไมโครคอนโทรลเลอร์ที่ฉันคุ้นเคยมากที่สุดคืออุปกรณ์ PIC18 รุ่นเก่าเหล่านี้ใช้ตัวนับ 8 บิตที่ยืดหยุ่นเพื่อปรับขนาด baudrate ในขณะที่รุ่นใหม่นั้นมีตัวนับ 16 บิตที่ยืดหยุ่น นอกจากนี้ยังมีโหมดความเร็วสูง "สูง" และ "ต่ำ" ซึ่งเปลี่ยนค่า baudrate ด้วยปัจจัยสี่
ด้วยนาฬิกาอินพุท 20 MHz รุ่น 8 บิตของรุ่นนี้พอเพียงที่จะได้รับภายใน 0.25% ของอัตรารับส่งข้อมูลที่กำหนดสำหรับทุกอัตราจาก 1800 ถึง 19200 เวอร์ชั่น 16 บิตช่วยให้คุณสามารถลดความเร็วลงได้
http://www.nicksoft.info/el/calc/?ac=spbrg&submitted=1&mcu=+Generic+16bit+BRG&Fosc=20&FoscMul=1000000&FoscAutoSelector=0&MaxBaudRateError=1 (ละเว้นการซิงโครไนซ์ = 1 colums พวกเขาทำงานอยู่ในสหรัฐฯ โหมดซิงโครนัส)
PLLs ตัวแบ่งเศษส่วน ฯลฯ ไม่จำเป็นสำหรับซีเรียล UART
ในการแลกเปลี่ยนข้อมูลอนุกรมผู้ควบคุมจะต้องส่งออกหรือสุ่มตัวอย่างข้อมูลภายในช่วงเวลาที่กำหนด "หน้าต่าง" ในขณะที่มันเป็นเรื่องง่ายที่สุดที่จะมีตัวควบคุมที่แบ่งนาฬิกาด้วยปัจจัยที่สามารถตั้งโปรแกรมได้และจากนั้นอีกครั้งโดยปัจจัยที่มีการกำหนดรหัสแบบยากเพิ่มเติมไม่มีความต้องการที่บิตจะอ่านหรือเขียนในช่วงเวลาเท่ากัน หากปลายสุดของการเชื่อมต่อออกบิตในช่วงเวลาที่ตรงกับอัตราการรับส่งข้อมูลอย่างแม่นยำผู้รับจะได้รับด้วยอัตราการสุ่มใด ๆ ที่มากกว่าสองเท่าของอัตราการรับส่งข้อมูลที่ให้ตัวอย่างในเวลาที่เหมาะสม ตัวอย่างเช่นสมมติว่าข้อมูลส่งออกที่ 19,200 และมีการสุ่มตัวอย่างที่แม่นยำ 48,000Hz (2.5x)
เมื่อใครเห็นขอบที่ตกลงมาใครจะรู้ว่าบิตหยุดได้เริ่มต้นระหว่าง 0 และ 1 การสุ่มตัวอย่างครั้งที่แล้ว หากหนึ่งป้ายชื่อตัวอย่างแรกที่สังเกตว่าบิตเริ่มต้นเป็นเวลา 0 บิต 0 จะเริ่มต้นที่ไหนสักแห่งระหว่างเวลา 1.5 และ 2.5; บิต 1 จะเริ่มต้นที่ไหนสักแห่งระหว่างเวลา 4.0 และ 5.0 บิต 2 จะเริ่มต้นที่ไหนสักแห่งระหว่างเวลา 6.5 และ 7.5 และบิต 3 จะเริ่มที่ไหนสักแห่งระหว่างเวลา 9.0 และ 10.0 ตัวอย่างที่ถ่ายในเวลา 3 จะได้รับการรับประกันว่าจะจับบิต 0 [ซึ่งเริ่มต้นระหว่างเวลา 1.5 ถึง 2.5 และสิ้นสุดระหว่างเวลา 4.0 และ 5.0] ตัวอย่างที่ถ่ายในเวลา 6 จะจับบิต 1 และตัวอย่างที่ถ่ายในเวลา 8, 11, 13, 16, 18, และ 20 จะจับบิต 2-7
การใช้อัตราตัวอย่างที่เร็วกว่าจะทำให้ผู้รับไม่ยอมให้มีข้อบกพร่องในแหล่งที่มามากขึ้น แต่ถึงแม้จะมีอัตราตัวอย่างเพียง 2.5 เท่าอัตราบิตนั้นอัตรากำไรขั้นต้นก็ไม่แย่นัก [ประมาณ 1/5 ของเวลาบิต]