का उपयोग करके एक साथ नहीं लिखते/पढ़ते हैं, मुझे उम्मीद है कि यह समस्या सॉफ़्टवेयर से संबंधित अधिक हार्डवेयर हो सकती है (हम देखेंगे)। मैं फ्रीस्कल्स पी 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]:~#
संकेत 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]:~#
यह संकेत देता है पता चलता है कि पूरे तार किसी भी कारण से दोहराया है (मैं पता नहीं क्यों)। हालांकि, कार्यक्रम कंसोल में प्राप्त डेटा को सही तरीके से दिखाता है, इसलिए यह 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]:~#
और अगर मेरे पास कोई डेटा मिसो को MOSI लूपबैक प्राप्त होता है (कंसोल उत्पादन अब भी वही प्राप्त "00 00" है):
मैं सभी मापदंडों के साथ एक सा आसपास खेलते हैं और परीक्षण कार्यक्रम को बदलने के लिए हाफ डुप्लेक्स उपयोग करने का निर्णय (संचारित केवल) मोड:
#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]:~#
वास्तव में मुझे लगता है कि बजाय 2 बाइट्स फुल डुप्लेक्स स्थानांतरण करने का मैं एक एन बाइट संचारित पीछा करना एक एन बाइट द्वारा प्राप्त।
- क्यों 0xAA, 0x81 और 0x00, 0x00 फैलता है:
असल में वहाँ दो सवाल कर रहे हैं?
- क्यों (लूपबैक का उपयोग करके) मूल कोड डेटा को आरएक्स बफर में वापस प्राप्त करने में सक्षम है, लेकिन यदि 2 बाइट्स तक कम किया गया तो कोई डेटा प्राप्त नहीं हुआ है?
पोस्ट कहीं और छवियों और जवाब में उन्हें लिंक जोड़ - एक उच्च प्रतिनिधि उपयोगकर्ता तो आपका जवाब संपादित कर सकते हैं उन्हें –
शामिल करने के लिए मैं आज की जाँच करेगा अगर spidev SPI_MASTER_HALF_DUPLEX ध्वज के साथ संकलित किया गया था सक्षम है जो स्पि डिवाइस को आधे डुप्लेक्स में मजबूर करता है। – stede
SPI_MASTER_HALF_DUPLEX सेट नहीं किया गया था। – stede