V-USB จะขันสกรู SPI ในตัวของ ATmega328p ได้อย่างไร


14

ฉันกำลังทำงานในโครงการ V-USB ที่แสดงเป็นแป้นพิมพ์โดยใช้ ATmega328p ส่วน USB ใช้งานได้ดี (ไม่ใช่โครงการ V-USB ครั้งแรกของฉัน) แต่หลังจากที่ฉันเริ่มต้น V-USB สแต็กด้วยการusbInit()โทรไปยังไลบรารีการ์ด SD ทั้งหมดล้มเหลว ถ้าฉันเรียกฟังก์ชั่นเดิมมาก่อนusbInit()ทุกอย่างจะทำงานได้อย่างสมบูรณ์

ฉันใช้ Arduino โคลนที่เรียกว่า Diavolino แต่ไม่มีโครงร่าง Arduino / เดินสาย ฉันมี USB ที่เชื่อมต่อกับ I / O ดิจิตอล 2 และ 3 และการ์ด SD ถึง 10-13 (สาย SPI ในตัว)

ฉันดูในห้องสมุดการ์ด SD และพบว่าไม่มีสัญญาณของมันโดยใช้การขัดจังหวะหรือการลงทะเบียนใด ๆ นอกเหนือSPxxจาก ฉันยังgrepต้องใช้รหัส V-USB ด้วยซ้ำ แต่มันไม่ได้แตะที่SPxxรีจิสเตอร์

สัญญาณแรกของปัญหาคือเมื่ออุปกรณ์ตัดการเชื่อมต่อเมื่อมันควรจะเข้าถึงการ์ด SD จากนั้นฉันก็ใส่usbPoll()และwdt_reset()เรียกเข้าไปในลูปการจัดการการ์ด SD ทั้งหมดและพบว่าในกรณีของการเขียนการ์ดจะรอตลอดไปเพื่อรับทราบจากการ์ดหลังจากส่งสองไบต์สุดท้าย (CRC-16)

ห้องสมุด SD card ที่ฉันใช้คือsd_rawRoland Riegel


2
ฉันเข้าใจว่า V-USB นั้นใช้งาน CPU มากและอาจแนะนำความล่าช้าที่ไม่สามารถยอมรับได้ในรูทีน SPI โดยปกติการดำเนินงาน SPI จะไม่ไวต่อเวลา แต่เขียนและลบการดำเนินงานใน SPI FLASH อย่างแน่นอน
Dave Tweed

ปัญหาคือว่าแม้การดำเนินการอ่านจะไม่ทำงานส่วนใหญ่และในขณะที่ฉันอ่าน SPI comms จะทำอย่างอิสระทันทีที่ข้อมูลและการลงทะเบียนควบคุมถูกตั้งค่าโดยใช้รหัส
dnet

@DaveTweed - เวลามีความละเอียดอ่อนในแง่ของการต้องรอการ์ดใช่ แต่ในแง่ของการไม่สามารถที่จะเก็บการ์ดรอโปรแกรมของคุณ?
Chris Stratton

2
ดูเหมือนว่าคุณกำลังรอบางสิ่งที่ไม่สามารถเกิดขึ้นหรือตรวจไม่พบ ตัวอย่างเช่นพิน I / O อาจได้รับการตั้งค่าใหม่และไม่เป็นอินพุตอีกต่อไปหรือข้อมูล / นาฬิกาปลอมอาจถูกส่งไปยังการ์ดเพื่อทำให้มันอยู่ในสถานะที่ไม่ต้องการ ตรวจสอบให้แน่ใจว่ากลไกที่ห้องสมุด SD บรรลุความล่าช้าที่ต้องการนั้นไม่ได้ถูกทำลายหรือเร่งความเร็ว
Chris Stratton

3
คุณอาจมีปัญหาด้านเสียงหรือแหล่งจ่ายไฟเช่นกัน ตรวจสอบรางของคุณด้วยขอบเขตและตรวจสอบสาย SD ด้วยเครื่องวิเคราะห์ตรรกะเพื่อดูว่าเกิดอะไรขึ้น
จิมปารีส

คำตอบ:


1

ฉันมีปัญหาเช่นนั้นกับ USART และแก้ไขได้โดยเปลี่ยนการตั้งค่าสุนัขเฝ้าดู ดังที่คุณทราบ V-USB ใช้สุนัขเฝ้าดูและหากคุณเพิ่มเวลาพิเศษในการทำงานครั้งเดียวสุนัขเฝ้าระวังจะถูกเปิดใช้งาน ลองปิดการใช้งานสุนัขเฝ้าดูและหากคุณเห็นทุกอย่างเป็นไปด้วยดีคุณสามารถเปลี่ยนเวลาสุนัขเฝ้าดูหรือคุณสามารถแบ่งรหัสรบกวน (รหัสการ์ด SD ในกรณีของคุณ) ออกเป็นชิ้นเล็ก ๆ และ "รีเซ็ต" สุนัขเฝ้าดูระหว่างพวกเขา แต่อย่าลืมเปิดใช้งานนาฬิกาสุนัขของคุณอีกครั้งหลังจากทำการดีบั๊กเพราะไม่แนะนำให้ใช้ V-USB หากไม่มีสิ่งนั้น


โปรดทราบว่าคำถามที่กล่าวถึงมีการโทร wdt_reset () ในรหัส SD; แม้ว่าแน่นอนเป็นไปได้ว่าสิ่งนี้ไม่ได้ทำทุกที่
Chris Stratton

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