วิธีการออกแบบและแก้ปัญหาระบบต้นแบบทาส I2C ที่กำหนดเอง?


10

จะดำเนินการอย่างไรเมื่อต้องการระบบทาสต้นแบบ I2C ที่กำหนดเอง

เกณฑ์การออกแบบที่จะใช้มีอะไรบ้าง?

เครื่องมือการดีบักคืออะไรที่สามารถใช้เพื่อแก้ไขปัญหา


นี่คือคำถามอ้างอิง ฉันได้ลบความคิดเห็นสองข้อที่ทำให้เรื่องนี้ชัดเจนน้อยลง (ผู้ถามตอบคำถาม)
Nick Gammon

คำตอบ:


10

แบบฝึกหัดนี้ที่ฉันให้ในการประชุม Embedded Linux พยายามตอบคำถามโดยให้ลิงก์ไปยังคำอธิบายโดยละเอียดเพิ่มเติมของหัวข้อที่ได้รับการแก้ไขและการใช้ตัวอย่างที่เป็นประโยชน์ในการขับรถขับเคลื่อน 4 มิติโดยที่ Arduino Mini Pro ทำหน้าที่เป็นทาสและควบคุมล้ออิสระ 4 ตัว . เอกสารต้นฉบับสามารถพบได้ที่นี่

หมายเหตุ: คำตอบนี้กำลังดำเนินการอยู่ในขณะที่ฉันปรับไฮไลต์จากลิงค์


แอปพลิเคชันทั่วไปของบัส I2C

  • การเชื่อมต่อกับอุปกรณ์ต่อพ่วงค่อนข้างช้า ตัวอย่าง: เซ็นเซอร์, แอคชูเอเตอร์เชิงกล
  • การควบคุมอุปกรณ์ต่อพ่วง“ ที่รวดเร็ว” ซึ่งใช้ช่องทางอื่นในการแลกเปลี่ยนข้อมูล เช่น: โคเดก

    ในพีซีระบบปฏิบัติการมักจะโต้ตอบกับ I2C ด้วย:

    • อุณหภูมิและเมตรแรงดันแบตเตอรี่
    • ตัวควบคุมความเร็วพัดลม
    • ตัวแปลงสัญญาณเสียง

ในกรณีที่มีตัวควบคุมบัสหลายตัวอุปกรณ์ต่อพ่วงจะถูกจัดกลุ่มตามความเร็ว


การแนะนำอย่างรวดเร็วเกี่ยวกับบัส I2C - คุณสมบัติหลัก

  • รถบัสอนุกรม
  • 2 บรรทัดเท่านั้น: Serial CLock และ Serial DAta (บวกกราวด์)
  • 4 ความเร็ว: 100kHz, 400kHz, 1MHz, 3.2MHz
  • โดยปกติแล้ว 1 อุปกรณ์หลักและ 1 ทาสขึ้นไป
  • การสื่อสารเริ่มต้นโดยอุปกรณ์หลักเสมอ
  • ผู้เชี่ยวชาญหลายคนสามารถอยู่ร่วมกันบนรถบัสเดียวกันได้ (ต้นแบบหลายคน)
  • Open-Drain: ทั้ง SDA และ SCL ต้องการตัวต้านทานแบบ pull-up
  • “ การยืดนาฬิกา”
    • ต้นแบบควบคุม SCL แต่สลาฟสามารถกดค้างไว้ได้ (เพราะท่อระบายน้ำเปิด) หากจำเป็นต้องปรับความเร็ว
    • ต้นแบบต้องตรวจสอบสถานการณ์นี้
    • ทาสสามารถติดขัดและติดขัดบัส: จำเป็นต้องรีเซ็ตบรรทัดจากต้นแบบไปยังทาส
  • โดยทั่วไปการกำหนดแอดเดรส 7 บิต แต่ยังรองรับ 10 บิต
  • โปรโตคอลลอจิคัล: ไม่ได้ระบุระดับแรงดันไฟฟ้าจริงและขึ้นอยู่กับการใช้งานของแต่ละบุคคล เช่น 1.8V / 3.3V / 5.0V

URL อ้างอิง:

ตัวอย่างการกำหนดค่าบัส

ตัวอย่างการกำหนดค่าบัส


ลักษณะของพิธีสาร (ประยุกต์)

  • 2 ประเภทข้อความ: อ่านและเขียน
  • Start / Stop bit - แสดงเป็น“ [“ และ“]” ในคำตอบที่เหลือ
  • ที่อยู่: 7 หรือ 10 บิต
  • R / W บิต: R = 1 / W = 0 ใช้เพื่อแยกประเภทของข้อความที่ส่ง
  • ข้อมูลบนรถบัส: (ที่อยู่ << 1 | R / W)
  • ลงทะเบียนเป็นตัวจัดการข้อมูลภายในอุปกรณ์ที่เลือก

ตัวอย่างของปริมาณการใช้รถบัส

ตัวอย่างของการจราจรรถบัส ตัวอย่างวงจรการเขียนบัส ตัวอย่าง Bus Read Cycle Part1 ตัวอย่าง Bus Read Cycle Part2


ทาสที่กำหนดเอง

เหตุใดจึงต้องสร้าง I2C ที่กำหนดเอง

  • เซ็นเซอร์ / แอคชูเอเตอร์ที่ต้องการไม่สามารถใช้งานได้กับอินเตอร์เฟส I2C
  • มีที่อยู่เฉพาะน้อยกว่าที่จำเป็นกว่าทาสที่ต้องการ
  • ฟังก์ชั่นที่กำหนดเองที่ต้องการบนทาส:
    • ปฏิกิริยากึ่งอิสระต่อสิ่งเร้า
    • การกรอง / การประมวลผลข้อมูลอินพุตล่วงหน้า
  • การเพิ่มประสิทธิภาพพลังงาน:“ ศูนย์กลางเซ็นเซอร์” ที่กำหนดเองจะดูแลทำความสะอาดในขณะที่โปรเซสเซอร์หลักไม่ได้ทำงาน
  • การตอบสนองต่ออินพุตแบบเรียลไทม์
  • [จินตนาการของคุณที่นี่]

วิธีการออกแบบทาส I2C ที่กำหนดเอง?

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

การออกแบบของ I2C Master

เกณฑ์การออกแบบที่สำคัญ:

  • น้ำหนัก / ขนาด
  • กำลังการคำนวณที่จำเป็นและเวลาแฝงเฉลี่ย
  • อุปกรณ์ที่เหมือนพีซี
    • อุปกรณ์สมองกลฝังตัว
    • ภาษาการเขียนโปรแกรมที่ต้องการ: ตีความ vs รวบรวม
  • ความพร้อมใช้งานของบัส / gpios สำหรับการขับขี่ทาส:
    • GPIOs เท่านั้น: bitbang โปรโตคอล
    • I2C: แอปพลิเคชันพื้นที่ผู้ใช้เทียบกับเคอร์เนลไดรเวอร์
    • ไม่มีอินเตอร์เฟส GPIOs / I2C: อะแดปเตอร์ USB เป็น I2C

การดีบัก: หารและพิชิต

ควบคุมรถบัสโดยตรงด้วยอุปกรณ์เฉพาะกิจ ตัวอย่าง:

  • Bus Pirate (มีประโยชน์สำหรับบัสอื่น ๆ )
  • อะแดปเตอร์ USB to I2C Master ซึ่งใช้ชิป FTDI FT232R ด้วย
  • อุปกรณ์ที่กำหนดเอง (อาจเป็นโครงการแยกต่างหาก)
  • สอดแนมบัสด้วยเครื่องวิเคราะห์ตรรกะหรือขอบเขต / เครื่องวัดขั้นสูง ตัวอย่าง:

    • sigrok / pulseview พร้อมตัววิเคราะห์ตรรกะที่เข้ากันได้
    • ขอบเขต / เมตรแบบสแตนด์อโลน 2 ช่อง
    • ใช้ In-Debugger / In Circuit Emulator ที่เฉพาะเจาะจงสำหรับทาส

      ตัวอย่าง: AVR Dragon สำหรับชิป AVR (Arduino UNO, Nano, Mini, MiniPro)


โจรสลัดรถบัส

รถบัสโจรสลัด

  • ส่วนใหญ่มีวัตถุประสงค์เพื่อการพัฒนา
  • สามารถสูดอากาศทั้งบัสและขับได้
  • ส่วนต่อประสานคอนโซลผ่านพอร์ตอนุกรม (ttyACM) รวมถึงมาโครหรือการเข้าถึงโดยทางโปรแกรมสำหรับภาษาการเขียนโปรแกรมหลายภาษา
  • ตัวต้านทานแรงดึงและแรงดันในตัว (5V / 3.3V)
  • รองรับโปรโตคอลอื่น ๆ อีกมากมาย
  • ข้อมูลอ้างอิง: Wikipedia , หน้าหลัก

อะแดปเตอร์ USB เป็น I2C

usbtoi2c

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

sigrok และ pulseview

โลโก้ sigrok (องค์ประกอบ bakend)

sigrok

ตัวอย่าง pulseview (visualizer)

pulseview

ตัวอย่างของเครื่องวิเคราะห์ลอจิกต่ำ

saleae

  • มาตรฐานแบบพฤตินัยสำหรับการวัดด้วยพีซีบน linux (แต่มีในระบบปฏิบัติการอื่นด้วย)
  • รองรับการวิเคราะห์เชิงตรรกะขอบเขตและเมตรที่หลากหลาย
  • โปรโตคอลถอดรหัสต่างๆรวมถึง I2C
  • มีประโยชน์สำหรับการแสดงภาพสัญญาณเชิงตรรกะและการดีบักข้อผิดพลาดของโปรโตคอล
  • แม้แต่ตอนจบที่ต่ำมาก HW ราคาไม่แพงก็สามารถสร้างมิติใหม่ให้กับการดีบั๊ก
  • ข้อมูลอ้างอิง: sigrok , pulseview , ฮาร์ดแวร์ที่รองรับ

ตัวอย่าง: การบังคับทิศทางแบบสี่ล้อ

ต้นแบบที่สร้างขึ้นโดยใช้ Arduino Mini Pro 2 ตัว เสียงหึ่งๆ


ตัวอย่างทาสทำอะไรในตัวอย่าง?

ทาส I2C:

  • ควบคุมปริมาณของแรงบิดที่ใช้กับแต่ละล้อ
  • ควบคุมทิศทางแต่ละล้อหมุน
  • วัดความเร็วการหมุนของแต่ละล้อผ่านตัวเข้ารหัสแสง (Odometer)
  • เปิดเผยพารามิเตอร์ด้านบนไปยัง I2C Master

บทบาททาส

บล็อกไดอะแกรมระดับสูงของ I2C Slave


การเลือก Slave: Arduino Mini Pro

MiniPro

  • มีพิน / ฟังก์ชั่นเพียงพอสำหรับล้อแต่ละอัน:
    • 1 เอาต์พุต PWM พร้อมการกำหนดค่ารอบการทำงานแบบอิสระ
    • 1 GPIO สำหรับการลงทะเบียนอินพุตมาตรวัดระยะทางเป็น IRQ
    • 2 GPIO สำหรับการเลือก:
      • ข้างหน้า
      • ย้อนกลับ
      • ว่าง
      • ล็อค
  • I2C HW block สำหรับการแลกเปลี่ยน i2c ที่ถูกขัดจังหวะ
  • พินเฉพาะสำหรับการเขียนโปรแกรมด้วย SPI
  • รอยเท้าขนาดเล็ก
  • ราคาถูก.
  • เค้าโครงบอร์ดของโคลนที่แสดงในรูปภาพนั้นได้รับการปรับให้เหมาะสำหรับการติดตั้งบนซ็อกเก็ต DIL

ICD เฉพาะทาส: AVR Dragon

AVR Dragon


การเลือกระบบปฏิบัติการ: ChibiOS

ChibiOS

  • RTOS: การจองงานงานเซมาฟอร์ระบบไดนามิก ฯลฯ
  • รอยเท้าขนาดเล็ก: ลิงก์ใช้รหัส / ข้อมูลเท่านั้น
  • ความแตกต่างระหว่าง RTOS และ BSP ผ่าน HAL
  • GPLv3 สำหรับการใช้ที่ไม่ใช่เชิงพาณิชย์
  • พัฒนาอย่างแข็งขัน แต่เป็นผู้ใหญ่แล้ว
  • รองรับ 8bit AVR

อย่างไรก็ตามมีการรองรับ BSP ที่ จำกัด สำหรับ AVR ขาด: - ไดรเวอร์ขัดจังหวะสำหรับ AVR GPIO (เพิ่ม) - I2C รองรับโหมด AVR slave (กำหนดเอง) ซึ่งจะต้องมีการพัฒนาแยกกันเป็นส่วนหนึ่งของเสียงหึ่งๆ SW สำหรับ AVR


การกำหนดพารามิเตอร์การสื่อสาร

สำหรับแต่ละล้อ:

  • วัฏจักรหน้าที่ของสัญญาณ PWM ที่ใช้ในการขับเคลื่อน - 1 ไบต์ 0xFF = แรงบิดสูงสุด / 0x00 = ไม่มีแรงบิด

  • ทิศทางการหมุน - 1 ไบต์

    • 0x00 = ไม่ได้ใช้งาน
    • 0x01 = ย้อนกลับ
    • 0x02 = ไปข้างหน้า
    • 0x03 = ถูกล็อค
  • ระยะเวลาเฉลี่ยระหว่างสล็อตของตัวเข้ารหัสออปติคัล - 2 ไบต์

    • การเขียนสิ่งใดก็ตามที่รีเซ็ตการวัด
  • ดัชนีพารามิเตอร์ - 1 แทะ:

    • 0 = รอบการทำงาน
    • 1 = ทิศทาง
    • 2 = ระยะเวลาเฉลี่ย
  • ดัชนีล้อ - 1 แทะ:

    • 0 = ด้านหลังซ้าย
    • 1 = ด้านหลังขวา
    • 2 = ด้านหน้าขวา
    • 3 = ด้านหน้าซ้าย
    • 4 = ทั้งหมด

โปรโตคอลย่อย: การกำหนดรีจิสเตอร์

รูปแบบการลงทะเบียน: 0xαβ - α = ดัชนีพารามิเตอร์ - β = ดัชนีล้อ

ที่อยู่ (เลือกโดยพลการ): 0x10

รูปแบบ Pirate Bus: - [= บิตเริ่มต้น -] = บิตสุดท้าย - r = อ่านไบต์ - ที่อยู่ครั้งที่ 2 (กะซ้าย 1) สำหรับ R / W บิต


ตัวอย่าง - ในรูปแบบบัสโจรสลัด

[i2c_addr reg_addr = (parm, wheel) reg_value]

[0x20 0x20 0x02]  Left Rear Forward
[0x20 0x21 0x01]  Right Rear Backward
[0x20 0x22 0x01]  Right Front Backward
[0x20 0x23 0x02]  Left Front Forward
[0x20 0x14 0xFF]  Wheels set to max torque

รถหมุนตามเข็มนาฬิกา

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