ฉันไม่มี UART บนไมโครคอนโทรลเลอร์ดังนั้นฉันจะเพิ่มได้อย่างไร


13

ฉันกำลังใช้ไมโครคอนโทรลเลอร์ATMEGA32HVBซึ่งมีสิ่งอำนวยความสะดวกสำหรับการปรับสมดุลเซลล์ซึ่งเราสามารถเชื่อมต่อแบตเตอรี่ 4 ก้อนในซีรีส์และใช้ครั้งละหนึ่งเครื่อง มันมีประโยชน์มากสำหรับการจัดการพลังงานดังนั้นฉันจึงไม่สามารถใช้ไมโครคอนโทรลเลอร์ที่แตกต่างกันได้ โปรดแนะนำวิธีการบางอย่างเพื่อเพิ่ม UART ลงไปเพื่อให้ฉันสามารถเชื่อมต่อกับอุปกรณ์อนุกรมได้อย่างง่ายดาย


11
วิธีซอฟต์แวร์ UART ตามที่อธิบาย user26129 เรียกว่าบิตต่อสู้
Johan.A

4
เพียงแค่ความคิดส่วนตัวของฉัน $ 0.02 แต่โดยปกติฉันจะชอบตัวควบคุมแบตเตอรี่แยกต่างหากและ UART ที่รวมอยู่ใน uC แทนวิธีอื่น ๆ ทำไมคุณต้องมีการจัดการแบตเตอรี่ที่รวมอยู่ใน uC?
Mels

ฉันต้องใช้แบตเตอรี่แบบชาร์จได้ซึ่งจะถูกเรียกเก็บเงินโดยใช้แผงโซลาร์ดังนั้นฉันต้องการ 4 แบตช์ในซีรีส์ที่จะใช้ครั้งละหนึ่งอัน
27475

4
คำถามหนึ่งคือจำนวนที่คุณต้องการใช้ UART และในทิศทางใด หากคุณต้องการสร้างการดีบักหรือข้อความสถานะเป็นครั้งคราวในขณะที่ตัวประมวลผลของคุณไม่ได้มีความต้องการเพิ่มมากขึ้นการส่งออกซีเรียลบิตแบบอนุกรมอาจดูน่าสนใจมาก มีการทำเครื่องหมายเช่นการใช้การขัดจังหวะการเปลี่ยนพินซึ่งสามารถลดภาระเฉลี่ยของการมีช่องสัญญาณอินพุตได้เช่นกัน แต่หากคุณคาดหวังว่าจะได้รับตัวอักษรในอัตรารับส่งข้อมูลสูงในเวลาที่คุณมีข้อผูกพันตามเวลาจริงอื่น ๆ ปัญหา
Chris Stratton

คำตอบ:


17

ดังที่คนอื่น ๆ ได้กล่าวไว้คุณสามารถเพิ่มฮาร์ดแวร์เพิ่มเติมลงในระบบของคุณเพื่อมอบฟังก์ชั่น UART หรือคุณสามารถเลียนแบบหนึ่งในซอฟต์แวร์ หากคุณมีการควบคุมการออกแบบฮาร์ดแวร์โดยรวมและการเพิ่ม IC อื่นเป็นตัวเลือกฉันจะพิจารณาวิธีการที่ใช้ฮาร์ดแวร์เป็นอย่างยิ่ง แน่นอนคุณสามารถทำให้ซอฟต์แวร์ UART ทำงานได้โดยใช้การกัดบิตแต่คุณอาจไม่ต้องการอุทิศทรัพยากร CPU เพื่อสร้างช่วงเวลาที่ต้องการ

จากแผ่นข้อมูลอย่างรวดเร็วปรากฏว่าไมโครคอนโทรลเลอร์ของคุณมีทั้ง SPI และ I2C (ซึ่ง Atmel เรียกว่า Two-Wire Interface (TWI)) นี่อาจเป็นอินเทอร์เฟซที่ดีที่สุดที่จะใช้เพื่อแนบ UART ภายนอก อุปกรณ์ดังกล่าวมีให้บริการจากผู้ผลิตหลายราย ตัวอย่างบางส่วน:

  • Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) มีสายของอุปกรณ์ SPI / I2C 1- และ 2 ช่องทางที่มีอยู่ครอบคลุม ~ 1.6- ช่วงการทำงาน 3.3V ฉันไม่ได้ใช้ชิ้นส่วนเหล่านี้โดยเฉพาะ แต่ฉันเคยใช้อุปกรณ์ Exar มาก่อน (ด้วยอินเตอร์เฟสหน่วยความจำบัสขนาน) และมันใช้งานได้ดี

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) มีสายของอุปกรณ์ SPI / I2C UART / IrDA / GPIO ที่มีอยู่ใน 1- และ 2 -channel พันธุ์มากกว่าช่วงแรงดันไฟฟ้าสองสาม ฉันใช้ชิ้นส่วนเหล่านี้ (เฉพาะรุ่น SC16IS762) อย่างกว้างขวางในอดีตและประสบความสำเร็จอย่างมาก

  • Maxim ( http://www.maximintegrated.com/datsheet/index.mvp/id/2052 ) มีอุปกรณ์ MAX3110E และ MAX3111E ซึ่งเป็น UART ที่เชื่อมต่อ SPI หนึ่งในคุณสมบัติที่ไม่เหมือนใครของอุปกรณ์เหล่านี้คือพวกเขามีไดรเวอร์ Line RS-232 ในตัว ดังนั้นหากคุณต้องการ UART ของคุณเพื่อเชื่อมต่อกับอุปกรณ์ที่ใช้แรงดันไฟฟ้าสาย RS-232 แทนระดับตรรกะ (เช่นพีซี) สิ่งนี้อาจมีประโยชน์เนื่องจากจะช่วยให้คุณไม่ต้องเพิ่ม IC ไดรฟ์ไลน์อื่นเข้าไปในบอร์ดของคุณ


ว้าวไม่เคยรู้เลยว่า Maxim มีสิ่งของเหล่านั้นจะ +2 ถ้าฉันทำได้
Tevo D

10

หากคุณกำลังมองหาโซลูชันฮาร์ดแวร์ Maxim มีไอซียูหลายตัวพร้อมอินเตอร์เฟส SPI ไปยังไมโครคอนโทรลเลอร์ (ซึ่งรวมอยู่ในส่วนของคุณ) ดู MAX3100 หรือตัวเลือกอื่น ๆ ที่นี่: http://www.maximintegrated.com/products/interface/controllers-expanders/uart.cfm


8

คุณจะต้องใช้ซอฟต์แวร์ไดรเวอร์ UART ขึ้นอยู่กับสิ่งที่คุณคาดหวังจาก UART นี้คุณสามารถใช้AVR305 (ขนาดกะทัดรัดมาก แต่ไม่มีฟีเจอร์ใดที่ปิดกั้นการส่ง / รับ half-duplex), AVR274 (ขัดจังหวะด้วยคุณสมบัติที่สมบูรณ์) คุณสามารถเขียนซอฟต์แวร์ UART ของคุณเองหรือ คุณสามารถใช้สิ่งที่คุณค้นหาบนอินเทอร์เน็ตได้เช่นโดย googling 'avr software uart'


3

หมายเหตุสั้น ๆ เกี่ยวกับซอฟต์แวร์ "UART" การออกแบบ: อย่างน้อยก็มีวิธีการที่แตกต่างกันในเชิงคุณภาพอย่างใดอย่างหนึ่งอาจจะขึ้นอยู่กับความต้องการ:

  • ไดรฟ์เวอร์ "บิตรับทุกอย่าง" จะปิดการใช้งานอินเทอร์รัปต์ทั้งหมดและใช้รหัสที่นับรอบเพื่อนาฬิกาแต่ละบิต การรับข้อมูลด้วยไดรเวอร์ "รับช่วงเวลาทุกอย่าง" นั้นจำเป็นต้องมีเมื่อข้อมูลมาถึงคอนโทรลเลอร์ไม่ได้ทำอะไรนอกจากรอให้มันมา

  • ไดรฟ์เวอร์ "bit over main loop" จะทำงานเหมือนด้านบนยกเว้นว่าจะใช้ทรัพยากรตัวจับเวลาสำหรับการกำหนดบิตแทนการนับรอบ การขัดจังหวะซึ่งไม่ใช้เวลานานเกินไปในการให้บริการอาจถูกเปิดใช้งาน สำหรับการส่งข้อมูลแบบอนุกรมทรัพยากรตัวจับเวลาอัตราคงที่อาจใช้ร่วมกับวัตถุประสงค์อื่น สำหรับการรับอนุกรมอย่างไรก็ตามไดรเวอร์บิตแบรนจะต้องสามารถโหลดตัวจับเวลาเมื่อบิตเริ่มต้นมาถึงเพื่อให้หมดอายุในช่วงกลางของเวลาบิตที่เข้ามาแต่ละครั้ง

  • ไดร์เวอร์บิตแมปที่ขับเคลื่อนด้วยการขัดจังหวะเต็มรูปแบบใช้ตัวจับเวลาอัตราคงที่ซึ่งทำงานที่อัตราข้อมูลหลายค่าโดยเฉพาะ (3x และ 5x ดีกว่า 4x) และทำทุกอย่างผ่านตัวจับเวลานั้น ไดรเวอร์ดังกล่าวสามารถทำงานพร้อมกันกับทุกอย่างอื่น แต่จะต้องใช้ CPU ที่เร็วกว่าประเภทไดรเวอร์เดิมที่จะต้องใช้

เพื่อหลีกเลี่ยงการมีสองรูปแบบแรกของตัวควบคุมรอตลอดไปสำหรับข้อมูลที่อาจไม่เคยเกิดขึ้นเป็นเรื่องปกติที่รูทีนการอ่านเพื่อรวมค่าหมดเวลาใช้งาน โปรดทราบว่าหากวนของคอนโทรลเลอร์ AA ทำเช่น "รับไบต์ขณะรอ 100ms ทำสิ่งอื่นถ้าไม่มีใครมาแล้วก็รับไบต์ต่อไป ฯลฯ " และไบต์มาถึงในระหว่างเวลาที่ "ได้รับ" ประจำหมดเวลาและตัวควบคุมเริ่มรออีกครั้งไบต์นั้นจะหายไป อุปกรณ์ที่สื่อสารด้วยจะต้องคาดหวังความเป็นไปได้นั้น

เฉพาะไดร์เวอร์รูปแบบที่สามเท่านั้นที่จะสามารถจัดการกับความเป็นไปได้ของไบต์ข้อมูลที่เริ่มต้นที่จะมาถึงในขณะที่ไบต์ข้อมูลกำลังถูกส่ง อย่างไรก็ตามสองสไตล์แรกสามารถใช้สำหรับโปรโตคอลการสื่อสาร full-duplex ความเร็วสูงบางตัวหากคอนโทรลเลอร์ต้องพูดเมื่อพูดกับเท่านั้น เคล็ดลับคือการมีรูทีน "อ่านและเขียนข้อมูล" ซึ่งจะรอบิตเริ่มต้นที่เข้ามาและเมื่อตรวจพบหนึ่งซ้อนทับการอ่านและเขียนเช่นนั้นตัวควบคุมจะส่งแต่ละบิตเช่นเดียวกับที่จะตรวจสอบข้อมูลที่เข้ามา เมื่อตัวควบคุมตรวจจับบิตเริ่มต้นที่เข้ามามันจะรู้ได้อย่างแม่นยำว่าเมื่อใดควรค้นหาบิตข้อมูล 8 บิตถัดไปและหยุดบิตดังนั้นจะรู้ว่ามันสามารถใช้เวลาในการส่งออกข้อมูลของตัวเองได้อย่างปลอดภัย

หมายเหตุบางส่วน: ตัวควบคุมที่ใช้หนึ่งในสองรูปแบบของ bit-bang uart เพื่อรับข้อมูลจะต้องประมวลผลแต่ละไบต์ของข้อมูลก่อนที่ขอบตกของบิตเริ่มต้นของไบต์ถัดไปเพื่อหลีกเลี่ยงการสูญเสียข้อมูล หากตัวควบคุมรู้ว่าการประมวลผลจะใช้เวลาอย่างน้อยครึ่งบิตมันอาจเพิ่มเวลาสูงสุดสำหรับการประมวลผลโดยการยอมรับแต่ละไบต์ทันทีที่คว้าบิตข้อมูลล่าสุดแทนที่จะรอบิตหยุด อย่างไรก็ตามวิธีการเพิ่มเติมในการให้คอนโทรลเลอร์มีเวลามากขึ้นอาจเป็นประโยชน์หากมีอุปกรณ์ที่ให้การรับส่งข้อมูลด้วยบิตหยุดสองบิตแทนที่จะเป็นหนึ่ง หากสามารถกำหนดค่า "parity mark" ได้นั่นจะเป็นการเพิ่มเวลาบิตเพิ่มเติมอีกเล็กน้อย การส่งที่ 115200-8-M-2 นั้นจะช่วยให้เวลาในการประมวลผลมากกว่า 57600-8-N-1 ถึงแม้ว่ามันจะป้อนข้อมูลได้เร็วกว่า 1.6 เท่า


1

คุณสามารถใช้ I / O pin ของ uC ได้ สิ่งเดียวเมื่อเปลี่ยนหรือถ่ายโอนข้อมูลบนพินเหล่านี้คุณควรมีความถี่ของพินเป็นสองเท่ากับอัตรารับส่งข้อมูล นี่คือวิธีการทำงานของ UART ตามปกติมันจะสุ่มสัญญาณบิตที่อยู่ตรงกลาง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.