वी-यूएसबी एक 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 लाइनों) में है।

मैंने एसडी कार्ड लाइब्रेरी के माध्यम से देखा और इसके अलावा किसी भी व्यवधान या रजिस्टर का उपयोग करने का कोई संकेत नहीं मिला SPxx। मैं भी grepवी-यूएसबी कोड है, लेकिन यह भी SPxxरजिस्टर को छूने नहीं करता है ।

समस्या का पहला संकेत तब था जब एसडी कार्ड को एक्सेस करना चाहिए था जब डिवाइस काट दिया गया था। फिर मैंने सभी एसडी कार्ड को लूप में रखा usbPoll()और wdt_reset()कॉल किया, और पाया कि लिखने के मामले में, कार्ड अंतिम दो बाइट्स (CRC-16) भेजने के बाद कार्ड से पावती के लिए हमेशा इंतजार करता है।

एसडी कार्ड पुस्तकालय मैं उपयोग sd_rawरोलांड Riegel द्वारा किया जाता है।


2
यह मेरी समझ है कि वी-यूएसबी बहुत सीपीयू-गहन है, और यह शायद एसपीआई दिनचर्या में अस्वीकार्य देरी का परिचय दे रहा है। आम तौर पर, एसपीआई संचालन समय के प्रति संवेदनशील नहीं होते हैं, लेकिन एसपीआई फ्लैश पर लिखने और मिटाए गए संचालन निश्चित रूप से होते हैं।
डेव ट्वीड

समस्या यह है कि पढ़ा हुआ ऑपरेशन भी अधिकांश समय काम नहीं करता था, और जैसा कि मैंने पढ़ा है, जैसे ही SPI कॉम्स स्वतंत्र रूप से किया जाता है, जैसे ही डेटा और कंट्रोल रजिस्टर रनिंग कोड द्वारा सेट किए जाते हैं।
dnet

@DaveTweed - कार्ड हां के लिए प्रतीक्षा करने के संदर्भ में समय संवेदनशील है, लेकिन आपके कार्यक्रम के लिए कार्ड का इंतजार नहीं कर पाने के संदर्भ में ??
क्रिस स्ट्रैटन

2
संभवतः आप किसी ऐसी चीज़ पर इंतज़ार कर रहे हैं जो या तो हो सकती है या जिसका पता नहीं लगाया जा सकता है; उदाहरण के लिए, I / O पिन को पुन: कॉन्फ़िगर किया गया हो सकता है और अब कोई इनपुट नहीं हो सकता है, या कार्ड में भ्रामक डेटा / घड़ियां भेजी जा सकती हैं, इसे अवांछित स्थिति में लाया जा सकता है। यह भी सुनिश्चित करें कि जिस तंत्र द्वारा SD लाइब्रेरी आवश्यक विलम्ब को पूरा करती है, उसे तोड़ा या त्वरित नहीं किया गया है।
क्रिस स्ट्रैटन

3
आपको शोर या बिजली आपूर्ति की समस्या भी हो सकती है। एक दायरे के साथ अपने रेल की जाँच करें और क्या हो रहा है यह देखने के लिए एक तर्क विश्लेषक के साथ एसडी लाइनों की जाँच करें।
जिम पेरिस

जवाबों:


1

मुझे USART के साथ इस तरह की समस्या थी और वॉच डॉग सेटिंग्स को बदलकर इसे हल किया। जैसा कि आप जानते हैं कि वी-यूएसबी एक घड़ी कुत्ते का उपयोग करता है और यदि आप एक ऑपरेशन में अतिरिक्त समय लगाते हैं, तो घड़ी कुत्ता सक्रिय हो जाता है। वॉच डॉग को निष्क्रिय करने का प्रयास करें और यदि आप देखते हैं कि सबकुछ ठीक हो जाता है, तो आप वॉच डॉग का समय बदल सकते हैं या आप इंटरफेरिंग कोड (एसडी कार्ड कोड को आपके मामले में) छोटे भागों में विभाजित कर सकते हैं और उनके बीच वॉच डॉग को "रीसेट" कर सकते हैं। लेकिन डिबगिंग के बाद अपने वॉच डॉग को फिर से सक्रिय करना न भूलें क्योंकि इसके बिना वी-यूएसबी का उपयोग करने की अनुशंसा नहीं की जाती है।


ध्यान दें कि प्रश्न में wdt_reset () कॉल को एसडी कोड में डाला गया है; हालांकि यह संभव है कि यह हर जगह नहीं किया गया था।
क्रिस स्ट्रैटन

1
हां, लेकिन वॉच डॉग को अक्षम करने के साथ कोड की कोशिश करना वास्तव में लायक है। कभी-कभी विशेष रूप से जब रिटर्निंग डेटा को एक बाधित दिनचर्या में संसाधित किया जाता है, तो कोड वहां फंस जाता है और रीसेट होने से पहले वॉच डॉग सक्रिय हो जाता है
Aug
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.