Cmd param का मतलब write_i2c_block_data में


12

मैं पाई और Arduino के बीच i2c संचार का परीक्षण कर रहा हूं।

डॉक्टर कहते हैं:

write_i2c_block_data(addr,cmd,vals)  Block Write transaction.    int addr,char cmd,long[]    None

मेरा यह परीक्षण है:

पाई पर:

import smbus
bus = smbus.SMBus(0)
bus.write_i2c_block_data(address, 48, [49, 50, 51] )

Arduino पर:

void receiveData(int byteCount){
    Serial.print("byte count=");
    Serial.println(byteCount);

    while(Wire.available()) {
        number = Wire.read();
        Serial.print((char)number);
     }
}

Arduino पर मुझे यह आउटपुट दिखाई देता है:

byte count=4
0123

मेरा सवाल है: cmdपैरामीटर का उपयोग क्या है ? मैं Arduino पर कोई भेद नहीं देखता, जो बाइट का प्रतिनिधित्व करता है।
मुझे लगता है कि मैं इससे एक फिट फिट के रूप में निपट सकता हूं। शायद मैं कमांड के रूप में पहले 2 बाइट्स का उपयोग करना चाहता हूं।

इस पृष्ठ की विधि के बारे में अधिक जानकारी नहीं है: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc


आप परिभाषित करना चाह सकते हैं कि cmdपैरामीटर क्या है ... मुझे यह जानने का एक उचित काम करना था कि आपका क्या मतलब है। हालांकि मुझे इसका जवाब नहीं मिला ... यह केवल विशिष्ट चिप्स जैसे कि GPIO विस्तारक या कुछ और के द्वारा इस्तेमाल किया जा सकता है ...
बट्स

ठीक है, मैंने प्रलेखन के लिए लिंक जोड़ा (जो बहुत ज्यादा नहीं है)
गुस स्मिथ

6
मेरे पास अभी पूर्ण उत्तर देने का समय नहीं है (मुझे आशा है कि कोई व्यक्ति) लेकिन संक्षेप में - यह है कि I²C कैसे काम करता है। मास्टर इसे केवल डेटा के कुछ बाइट्स (उचित पते पर भेजने के बाद) भेज सकते हैं और उन बाइट्स वास्तव में क्या हैं (उनका अर्थ प्रति डिवाइस परिभाषित किया गया है) पर कोई विनिर्देश नहीं है। यह सिर्फ इतना होता है कि पहला बाइट अक्सर एक कमांड (या रजिस्टर) नंबर होता है। इसके अलावा, आप हमेशा इतनी विपरीत कम से कम एक बाइट भेजने के लिए vals, cmdअनिवार्य है।
क्रिज़िस्तोफ एडम्सकी

1
@KrzysztofAdamski यह मेरे लिए एक बहुत पूरा जवाब की तरह लगता है।
चूतड़

जवाबों:


9

I²Cप्रोटोकॉल बहुत सरल है। यह वास्तव में डेटा संरचनाओं को परिभाषित नहीं करता है जो तार पर भेजे जाते हैं। फ्रेम में एक गुलाम पता होता है (दिशा-सूचक बिट के साथ अगर मास्टर पढ़ना या लिखना चाहता है) और (लिखने के मामले में) डेटा के कुछ बाइट्स। चूँकि यह 0 बाइट डेटा के साथ लिखने की पहल करने का कोई मतलब नहीं है, इसलिए पहले बाइट अनिवार्य है।

इस पहले बाइट को अक्सर एक दास रजिस्टर पते या कमांड नंबर के रूप में उपयोग किया जाता है, लेकिन यह नहीं होता है। पहले एक के बाद अतिरिक्त बाइट्स हो सकते हैं या नहीं भी हो सकते हैं। उच्च स्तर के प्रोटोकॉल को परिभाषित करता है कि प्रत्येक बाइट का मतलब डिवाइस विशिष्ट है।

यह समझा सकता है कि दो अलग-अलग तर्क क्यों हैं - पहला एक ( cmd) अनिवार्य है और दूसरा दूसरा ( vals) वैकल्पिक है। जब आपका उदाहरण Pythonभाषा में होता है, तो यहां उपयोग की जाने वाली API मूल CAPI की वास्तविक रूप से बहुत करीब मैपिंग होती है, जहां आप आसानी से वैकल्पिक तर्क नहीं बना सकते हैं।


यह थोड़ा लंबा स्पष्टीकरण है कि मैंने सवाल के तहत टिप्पणी में क्या लिखा था।
Krzysztof Adamski

मुझे खुशी है कि तुमने किया! इस तरह के सरल, अभी तक "अहा!" स्पष्टीकरण वास्तव में कुछ समय के लिए सहायक होते हैं, जैसे आज :-)
उहॉ

3

जब आप पाई से कोई ब्लॉक राइट / रीड जारी करते हैं:

bus.write_i2c_block_data(address, 48, [49, 50, 51] )

या

bus.read_i2c_block_data(address, 48, [49, 50, 51] )

Arduino पर दो चीजें होती हैं (पढ़ सकती हैं) जो पढ़ने या लिखने पर निर्भर करती हैं।

Cmd बाइट पाई से I2C बस को लिखा गया पहला बाइट है, इसे हमेशा "राइट" अनुरोध के रूप में भेजा जाता है। इसका मतलब है कि अगर पाई जारी कर रहा है

bus.read_i2c_block_data

या

bus.write_i2c_block_data

यह पहले लिखता है

cmd

I2C बस से पहले यह पढ़ता है

यह एक उपयोगी विशेषता है क्योंकि कुछ I2C हार्डवेयर को पढ़ने से पहले आरंभीकरण की आवश्यकता होती है।

Arduino पर इसका मतलब यह है कि:

पहले,

Wire.onReceive(yourCallback)

फ़ंक्शन को कहा जाता है क्योंकि पाई द्वारा बस cmdको लिखा गया था । cmdबस में उपलब्ध पहली बाइट होगी। यदि Arduino की तुलना में Pi ने लिखित अनुरोध भेजा है, तो फ़ंक्शन पूरा होने तक Wire.onReceive कॉलबैक में रहेगा। अगर पाई ने एक रीड रिक्वेस्ट भेजी है, तो Arduino वायर को पूरा करेगा। रीसिव करे फिर वायर को कॉल करें।

आपको यह सुनिश्चित करना चाहिए कि cmd में रखा गया मान आपके सिस्टम में अनपेक्षित व्यवहार के कारण उचित रूप से इसके मूल्य को नियंत्रित नहीं करता है। यदि उदाहरण के लिए, आपके Wire.onReceive कॉल वापस एक एलईडी बंद हो जाता है जब Wire.read = 0x30। फिर भी अगर आपने रीड रिक्वेस्ट भेजी है , तो वह पहले 0x30 लिखकर LED को बंद कर देगा और फिर वह बस से मांगी गई बाइट्स को पढ़ेगा।


1

मैं I2C LCD, Newhaven NHD K 0216K3Z to FL ‐ GBW I V3 लिख रहा हूं। इसकी स्पेक शीट को गुगला किया जा सकता है। अपने मामले में, जब कमांड बाइट 0xfe होती है, तो इसका मतलब है कि निम्नलिखित बाइट एक कमांड है - उनमें से लगभग 20 हैं। स्पष्ट, बैकलाइट, ब्लिंक कर्सर और इतने पर। अगर cmd 0xfe नहीं है, तो यह केवल कुछ कैरेक्टर को प्रदर्शित करने के लिए है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.