2013-04-09 3 views
6

का उपयोग करके एक साथ नहीं लिखते/पढ़ते हैं, मुझे उम्मीद है कि यह समस्या सॉफ़्टवेयर से संबंधित अधिक हार्डवेयर हो सकती है (हम देखेंगे)। मैं फ्रीस्कल्स पी 1021 प्रोसेसर (पीपीसी, ई 500 वी 2 कोर) के आधार पर एक कस्टम बोर्ड पर काम कर रहा हूं। एक बाहरी पीसीबी जुड़ा होगा और एसपीआई द्वारा कॉन्फ़िगर किया जा सकता है। इस बाहरी पीसीबी के विनिर्देशों को पढ़ता है क्योंकि यह पूर्ण डुप्लेक्स मोड में 2-बाइट कमांड की अपेक्षा करता है और केवल अंतिम बाइट का उपयोग एमआईएसओ पर डेटा स्थानांतरित करने के लिए किया जाता है।स्पाइडव ioctl

यह जानकर मैं वर्तमान में इस डिवाइस का परीक्षण करने के लिए सॉफ़्टवेयर के कुछ टुकड़े तैयार करने के लिए काम करता हूं। तो मैंने अच्छी तरह से ज्ञात spi_test कार्यक्रम के साथ शुरू किया।

[email protected]:~# ./spi_test -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 00 00 00 00 
00 00 
[email protected]:~# 

Pic1

संकेत 608 घड़ियों पता चलता है और ऐसा लगता है पहली छमाही में ही डेटा देखते हैं। मैं लूपबैक के साथ जांच और परीक्षण करने का निर्णय लेता हूं - शॉर्टकटिंग एमओएसआई-एमआईएसओ डेटा को आरएक्स बफर में वापस लाता है। परिणाम:

[email protected]:~# ./spi_test -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

FF FF FF FF FF FF 
40 00 00 00 00 95 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
FF FF FF FF FF FF 
DE AD BE EF BA AD 
F0 0D 
[email protected]:~# 

Pic2

यह संकेत देता है पता चलता है कि पूरे तार किसी भी कारण से दोहराया है (मैं पता नहीं क्यों)। हालांकि, कार्यक्रम कंसोल में प्राप्त डेटा को सही तरीके से दिखाता है, इसलिए यह spi_test की अपेक्षा की जा सकती है। इस तरह (मैं के लिए लक्ष्य का अनुरोध आदेश स्वरूप अनुकरण करने के लिए)

मैं पैटर्न जो 2 बाइट्स करने के लिए नीचे इस कार्यक्रम में भेजा जाएगा हेरफेर आगे:

#ifdef ORIG 
    uint8_t tx[] = { 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0x40, 0x00, 0x00, 0x00, 0x00, 0x95, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 
     0xF0, 0x0D, 
    }; 
#else 
    uint8_t tx[] = { 
     0xAA, 0x81, 
    }; 
#endif 

लेकिन जैसा कि मैंने उम्मीद नहीं थी 32bits स्थानांतरित कर रहे एसपीआई बस के लिए - 16 की बजाय। पहले दो बाइट्स के दौरान एमओएसआई दोनों बाइट्स को टीएक्स [] से प्रदान करता है और अन्य 2 बाइट्स के लिए यह कम/0 होता है। यहाँ सांत्वना उत्पादन के परिणामों और संकेत कर रहे हैं:

[email protected]:~# ./spi_test_2bytes -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 
[email protected]:~# 

Pic3

और अगर मेरे पास कोई डेटा मिसो को MOSI लूपबैक प्राप्त होता है (कंसोल उत्पादन अब भी वही प्राप्त "00 00" है):

Pic4

मैं सभी मापदंडों के साथ एक सा आसपास खेलते हैं और परीक्षण कार्यक्रम को बदलने के लिए हाफ डुप्लेक्स उपयोग करने का निर्णय (संचारित केवल) मोड:

#ifdef ORIG 
    uint8_t tx[] = { 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0x40, 0x00, 0x00, 0x00, 0x00, 0x95, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
     0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD, 
     0xF0, 0x0D, 
    }; 
#else 
    uint8_t tx[] = { 
     0xAA, 0x81, 
    }; 
#endif 
    uint8_t rx[ARRAY_SIZE(tx)] = {0, }; 
    struct spi_ioc_transfer tr = { 
     .tx_buf = (unsigned long)tx, 
#ifdef ORIG  
     .rx_buf = (unsigned long)rx, 
#else 
     .rx_buf = 0, 
#endif 

चूंकि यह संकलित और निष्पादित चीज अपेक्षित है। एसपीआई_Cएलके चक्र 16 बिट्स और एमओएसआई के लिए 16 गुणा डेटा को अपेक्षित रूप से प्रदान करते हैं। Cosole उत्पादन कोई डेटा प्राप्त पता चलता है और संकेत की उम्मीद की तरह हैं:

[email protected]:~# ./spi_test_2bytes -D /dev/spidev32766.3 
spi mode: 0 
bits per word: 8 
max speed: 500000 Hz (500 KHz) 

00 00 
[email protected]:~# 

Pic5

Pic6

वास्तव में मुझे लगता है कि बजाय 2 बाइट्स फुल डुप्लेक्स स्थानांतरण करने का मैं एक एन बाइट संचारित पीछा करना एक एन बाइट द्वारा प्राप्त।

  1. क्यों 0xAA, 0x81 और 0x00, 0x00 फैलता है:

    असल में वहाँ दो सवाल कर रहे हैं?

  2. क्यों (लूपबैक का उपयोग करके) मूल कोड डेटा को आरएक्स बफर में वापस प्राप्त करने में सक्षम है, लेकिन यदि 2 बाइट्स तक कम किया गया तो कोई डेटा प्राप्त नहीं हुआ है?
+0

पोस्ट कहीं और छवियों और जवाब में उन्हें लिंक जोड़ - एक उच्च प्रतिनिधि उपयोगकर्ता तो आपका जवाब संपादित कर सकते हैं उन्हें –

+0

शामिल करने के लिए मैं आज की जाँच करेगा अगर spidev SPI_MASTER_HALF_DUPLEX ध्वज के साथ संकलित किया गया था सक्षम है जो स्पि डिवाइस को आधे डुप्लेक्स में मजबूर करता है। – stede

+0

SPI_MASTER_HALF_DUPLEX सेट नहीं किया गया था। – stede

उत्तर

1

ठीक है, पोस्ट शांत भारी है। मैंने बस कुछ हिस्सों को पढ़ा और हाल ही में लिनक्स पर एसपीआई के संपर्क में आया। हालांकि, जैसा कि https://www.kernel.org/doc/Documentation/spi/spidev एसिंक पढ़ने/लिखने में उपयोगकर्ता स्पेस में उपलब्ध नहीं है। AFAIK पढ़ने/लिखना fcntl के आसपास सिर्फ एक रैपर है। इस प्रकार आपको async I/O प्राप्त करने के लिए अपना स्वयं का कर्नेल मॉड्यूल लिखना होगा।

+0

यह उत्तर गलत लगता है। Https://www.kernel.org/doc/Documentation/spi/spidev आलेख विशेष रूप से कहता है "ioctl() अनुरोधों का उपयोग, पूर्ण डुप्लेक्स स्थानान्तरण ... उपलब्ध हैं ..."। और स्पि-टेस्ट (उदा। Https://github.com/KnCMiner/spi-test/blob/master/spi-test.c#L97) उस ioctl() का उपयोग करता है। –

0

मुझे पता है कि यह एक बहुत पुराना धागा है, लेकिन मैं आरटी 5350 रनिंग ओपनडब्लूआरटी पर स्पाइडव का उपयोग कर रहा हूं। मैं बिल्कुल वही परिणाम प्राप्त कर रहा हूं; मैं बस एक पूर्ण डुप्लेक्स स्थानांतरण हो रहा है। RT5350 डेटाशीट को पढ़ना ऐसा प्रतीत होता है कि हार्डवेयर केवल आधा डुप्लेक्स एसपीआई स्थानान्तरण करने में सक्षम है। प्रत्येक स्थानांतरण या तो एक लेखन (एमओएसआई पर आउटपुट बाइट्स, कुछ भी नहीं पढ़ता है), या एक पढ़ा (एमओएसआई पर आउटपुट शून्य, एमआईएसओ पढ़ें)।

मुझे आपके पी 1021 चिप के लिए डेटाशीट नहीं मिल रहा है, लेकिन हमारे परिणामों की समानता पर विचार करते हुए मैं कहूंगा कि इसका हार्डवेयर एसपीआई इसी तरह लागू किया गया है।

इसका मतलब है कि एक कर्नेल मॉड्यूल उत्तर नहीं है (ioctl SPI_IOC_MESSAGE अंत में spi_async() को कॉल करता है)। पूर्ण डुप्लेक्स एसपीआई करने का एकमात्र तरीका सॉफ्टवेयर में जीपीआईओ का उपयोग कर रहा है।

RT5350 संदर्भ: http://forum.vocore.io/viewtopic.php?f=3&t=72#p233

संबंधित मुद्दे