লিখিত_আই 2 সি_ব্লক_ডেটাতে সেন্টিমিড পরমের অর্থ


12

আমি পাই এবং আরডুইনোর মধ্যে আই 2 সি যোগাযোগ পরীক্ষা করছি।

ডক বলেছেন:

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] )

আরডুইনোতে:

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

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

আরডুইনোতে আমি এই আউটপুটটি দেখতে পাচ্ছি:

byte count=4
0123

আমার প্রশ্ন: cmdপ্যারামিটারটির ব্যবহার কী ? আমি আরডুইনোর কোনও পার্থক্য দেখতে পাচ্ছি না যার মধ্যে বাইট কোনটি উপস্থাপন করে।
আমি অনুমান করি যে এটি আমি দেখতে উপযুক্ত হিসাবে মোকাবেলা করতে পারি। সম্ভবত আমি কমান্ড হিসাবে প্রথম 2 বাইট ব্যবহার করতে চাই।

এই পৃষ্ঠায় পদ্ধতিটিতে খুব বেশি তথ্য নেই: http://wiki.erazor-zone.de/wiki:linux:python:smbus:doc


আপনি cmdপ্যারামিটারটি কী তা সংজ্ঞায়িত করতে চাইতে পারেন ... আপনি কী বোঝাতে চেয়েছেন তা নির্ধারণের জন্য আমাকে বেশ কিছু করতে হয়েছিল। যদিও আমি কোনও উত্তর খুঁজে পাইনি ... এটি কেবলমাত্র জিপিআইও প্রসারণকারী বা কোনও কিছুর মতো নির্দিষ্ট চিপগুলি ব্যবহার করতে পারে ...
বাটার্স

ঠিক আছে, আমি ডকুমেন্টেশনের লিঙ্কটি যুক্ত করেছি (যা খুব বেশি নয়)
গুস স্মিথ

6
আমার কাছে এখনই পুরো উত্তর দেওয়ার সময় নেই (আমি আশা করি কেউ করবে) তবে সংক্ষেপে - এইভাবেই কাজ করে ² মাস্টার কেবল এটি কিছু বাইট ডেটা প্রেরণ করতে পারেন (যথাযথ ঠিকানা প্রেরণের পরে) এবং সেই বাইটগুলি আসলে কী তা সম্পর্কে কোনও স্পষ্টতা নেই (প্রতি ডিভাইসে তাদের অর্থ সংজ্ঞায়িত করা হয়েছে)। এটি ঠিক তাই ঘটে যে প্রথম বাইটটি প্রায়শই একটি কমান্ড (বা নিবন্ধভুক্ত) নম্বর হয়। এছাড়াও আপনি সবসময় তাই অসদৃশ অন্তত একটি বাইট পাঠাতে হবে vals, cmdবাধ্যতামূলক।
ক্রিজিসটফ অ্যাডামস্কি

1
@ KrzysztofAdamski আমার কাছে এটি বেশ সুন্দর উত্তর বলে মনে হচ্ছে।
বাটারস

উত্তর:


9

I²Cপ্রোটোকল খুব সহজ। এটি তারের মাধ্যমে প্রেরিত ডেটা স্ট্রাকচারকে সত্যই সংজ্ঞায়িত করে না। ফ্রেমটিতে একটি দাসের ঠিকানা (দিকনির্দেশনা বিট সহ নির্দেশ করা হয় যে মাস্টার পড়তে বা লিখতে চান কিনা) এবং (লেখার ক্ষেত্রে) কিছু বাইট ডেটা থাকে। যেহেতু 0 বাইট উপাত্ত দিয়ে লেখার সূচনা করার কোনও অর্থ নেই তাই প্রথম বাইট বাধ্যতামূলক।

এই প্রথম বাইটটি প্রায়শই স্লেভ রেজিস্টার ঠিকানা বা কমান্ড নম্বর হিসাবে ব্যবহৃত হয় তবে এটি করতে হয় না। প্রথমটির পরে অতিরিক্ত বাইট থাকতে পারে বা নাও থাকতে পারে। প্রতিটি বাইট মানে কী তা নির্ধারণ করে উচ্চ স্তরের প্রোটোকলটি ডিভাইস নির্দিষ্ট।

এটি ব্যাখ্যা করতে পারে কেন দুটি পৃথক যুক্তি রয়েছে - প্রথমটি ( cmd) বাধ্যতামূলক এবং দ্বিতীয়টি ( vals) isচ্ছিক। আপনার উদাহরণটি Pythonভাষায় থাকাকালীন , এখানে ব্যবহৃত Cএপিআইটি আসল API এর খুব কাছাকাছি ম্যাপিং যেখানে আপনি সহজেই optionচ্ছিক যুক্তি তৈরি করতে পারবেন না।


প্রশ্নের অধীনে মন্তব্যে আমি কী লিখেছি তার এটি আরও দীর্ঘতর ব্যাখ্যা।
ক্রিজিসটফ অ্যাডামস্কি

আমি খুশি যে আপনি করেছেন! এই ধরণের সরল, তবুও "আহা!" ব্যাখ্যাগুলি আজকের মতো :-)
উহো

3

আপনি যখন পাই থেকে ব্লক রাইটিং / পড়ার বিষয়টি প্রকাশ করেন:

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

অথবা

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

পড়া বা লেখার উপর নির্ভর করে আরডুইনোতে দুটি জিনিস ঘটে (হতে পারে)।

সেন্টিমিডে বাইট পাই থেকে আই 2 সি বাসে লেখা প্রথম বাইট, এটি সর্বদা "রাইটিং" অনুরোধ হিসাবে প্রেরণ করা হয়। এর অর্থ হ'ল পাই যদি একটি জারি করে থাকে

bus.read_i2c_block_data

অথবা

bus.write_i2c_block_data

এটি প্রথম লিখেছে

cmd

এটি পড়ার আগে I2C বাসে যান

এটি একটি দরকারী বৈশিষ্ট্য কারণ কিছু আই 2 সি হার্ডওয়্যার রিড করার আগে ইনিশিয়েশন প্রয়োজন।

আরডুইনোতে এর অর্থ এটি:

প্রথম,

Wire.onReceive(yourCallback)

ফাংশন বলা হয় কারণ পাই দ্বারা বাসে লেখাcmd হয়েছিল । বাসে পাওয়া প্রথম বাইট হবে। পাইটি যদি আরডুইনোর চেয়ে লিখিত অনুরোধ প্রেরণ করা থাকে তবে ফাংশনটি শেষ না হওয়া পর্যন্ত ওয়্যার.অন রিরসিভ কলব্যাকে থাকবে। পাই যদি পঠনের অনুরোধ পাঠায়, আরডুইনো ওয়্যার.অনরেসিভ সম্পূর্ণ করবে তারপরে Wire.onRequest কলব্যাকটি কল করুন।cmd

আপনাকে অবশ্যই নিশ্চিত করতে হবে যে সেন্টিমিডিতে রাখা মানটি সঠিকভাবে তার মানটি পরিচালনা করে আপনার সিস্টেমে অযাচিত আচরণের কারণ নয়। উদাহরণস্বরূপ, আপনার ওয়্যার.অন রিসিভ কলটি যখন ওয়্যার.রেড = 0x30 হয় তখন একটি এলইডি বন্ধ করে দেয়। তারপরেও যদি আপনি একটি পড়ার অনুরোধ প্রেরণ করেন তবে এটি প্রথমে 0x30 লিখে এলইডি বন্ধ করবে তারপরে এটি বাস থেকে অনুরোধ করা বাইটগুলি পড়বে।


1

আমি একটি আই 2 সি এলসিডি, নিউহ্যাভেন এনএইচডি ‐ 0216K3Z ‐ এফএল ‐ জিবিডাব্লু ‐ ভি 3 লিখছি। এর স্পেক শিটটি গুগল করা যায়। এর ক্ষেত্রে, কমান্ড বাইট যখন 0xfe হয় তার অর্থ নীচের বাইটটি একটি কমান্ড - সেগুলির মধ্যে প্রায় 20 রয়েছে। সাফ, ব্যাকলাইট, ব্লিঙ্ক কার্সার এবং আরও অনেক কিছু। যদি সেন্টিমিডি 0xfe না হয় তবে এটি প্রদর্শিত কিছু অক্ষর।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.