ความหมายของ cmd param ใน write_i2c_block_data


12

ฉันกำลังทดสอบการสื่อสาร i2c ระหว่าง Pi และ Arduino

หมอพูดว่า:

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

ฉันมีแบบทดสอบนี้:

บน Pi:

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 หรือบางอย่าง ...
Butters

ตกลงฉันจะเพิ่มการเชื่อมโยงไปเอกสาร (ซึ่งไม่มาก)
กัสสมิ ธ

6
ฉันไม่มีเวลาที่จะตอบคำถามอย่างเต็มรูปแบบในตอนนี้ (ฉันหวังว่าจะมีใครบางคน) แต่พูดโดยย่อ - นี่คือวิธีที่I²Cทำงาน ปริญญาโทสามารถส่งข้อมูลจำนวนหนึ่งไปยังไบต์ (หลังจากส่งที่อยู่ที่เหมาะสม) และไม่มีสเปคว่าไบต์เหล่านั้นคืออะไรจริง ๆ (ความหมายถูกกำหนดต่ออุปกรณ์) มันเกิดขึ้นจนไบต์แรกมักจะเป็นหมายเลขคำสั่ง (หรือลงทะเบียน) นอกจากนี้คุณจะต้องส่งอย่างน้อยหนึ่งไบต์ซึ่งแตกต่างจากvalsนั้นcmdเป็นข้อบังคับ
Krzysztof Adamski

1
@KrzysztofAdamski ฟังดูเหมือนคำตอบที่สมบูรณ์สำหรับฉัน
Butters

คำตอบ:


9

I²Cโปรโตคอลง่ายมาก ไม่ได้กำหนดโครงสร้างข้อมูลที่ส่งผ่านสายสัญญาณจริง ๆ เฟรมประกอบด้วยที่อยู่สลาฟ (ที่มีบิตทิศทางระบุว่าอาจารย์ต้องการอ่านหรือเขียน) และ (ในกรณีที่เขียน) บางไบต์ของข้อมูล เนื่องจากไม่เหมาะสมที่จะเริ่มต้นเขียนด้วย 0 ไบต์ของข้อมูลไบต์แรกจึงเป็นสิ่งจำเป็น

ไบต์แรกนี้มักจะใช้เป็นที่อยู่ลงทะเบียนทาสหรือหมายเลขคำสั่ง แต่ไม่จำเป็นต้อง อาจมีหรือไม่มีไบต์เพิ่มเติมหลังจากอันแรก โปรโตคอลระดับสูงกว่ากำหนดความหมายของแต่ละไบต์ว่าเป็นอุปกรณ์เฉพาะ

สิ่งนี้อาจอธิบายได้ว่าเหตุใดจึงมีอาร์กิวเมนต์ที่แยกกันสองรายการ - รายการแรก ( cmd) เป็นรายการบังคับและรายการที่สอง ( vals) เป็นทางเลือก ในขณะที่ตัวอย่างของคุณเป็นPythonภาษา API ที่ใช้ในที่นี้คือการทำแผนที่CAPI ดั้งเดิมอย่างใกล้ชิดซึ่งคุณไม่สามารถสร้างอาร์กิวเมนต์ที่เป็นทางเลือกได้อย่างง่ายดาย


นี่คือคำอธิบายอีกต่อไปเล็กน้อยของสิ่งที่ฉันเขียนในความคิดเห็นภายใต้คำถาม
Krzysztof Adamski

ฉันดีใจที่คุณทำ! ง่าย ๆ แบบนี้ แต่ "อ๊ะ!" คำอธิบายมีประโยชน์จริง ๆ บางครั้งเช่นวันนี้ :-)
uhoh

3

เมื่อคุณออกบล็อกเขียน / อ่านจาก Pi ด้วย:

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

หรือ

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

มีสองสิ่งที่เกิดขึ้น (สามารถ) บน Arduino ขึ้นอยู่กับการอ่านหรือเขียน

cmd byte เป็นไบต์แรกที่เขียนไปยังบัส I2C จาก Pi มันจะถูกส่งเป็นคำขอ "เขียน" เสมอ ซึ่งหมายความว่าหาก Pi ออก

bus.read_i2c_block_data

หรือ

bus.write_i2c_block_data

มันเป็นครั้งแรกที่เขียน

cmd

เพื่อบัส I2C ก่อนที่มันอ่าน

นี่เป็นคุณสมบัติที่มีประโยชน์เนื่องจากฮาร์ดแวร์ I2C บางตัวต้องการการเตรียมใช้งานก่อนจึงจะสามารถทำการอ่านได้

บน Arduino หมายความว่า:

ก่อนอื่น

Wire.onReceive(yourCallback)

ฟังก์ชั่นเรียกว่าเพราะcmdถูกเขียนไปยังรถบัสโดย Pi cmdจะเป็นไบต์แรกที่มีบนรถบัส ถ้า Pi ส่งคำขอเขียนกว่า Arduino จะยังคงอยู่ในการเรียกกลับ Wire.onReceive จนกว่าฟังก์ชั่นจะเสร็จสมบูรณ์ ถ้า Pi ส่งการร้องขอการอ่าน Arduino จะเสร็จสิ้นการ Wire.onReceive แล้วโทร Wire.onRequest โทรกลับ

คุณต้องตรวจสอบให้แน่ใจว่าค่าที่วางในหน่วย cmd ไม่ก่อให้เกิดพฤติกรรมที่ไม่ตั้งใจในระบบของคุณโดยการจัดการค่าของมันอย่างเหมาะสม ถ้าเป็นเช่นนั้น Wire.onReceive การโทรกลับของคุณจะปิดไฟ LED เมื่อ Wire.read = 0x30 จากนั้นแม้ว่าคุณจะส่งคำขอการอ่านก่อนอื่นก็จะปิด LED โดยการเขียน 0x30 แล้วมันจะอ่านไบต์ที่ร้องขอจากรถบัส


1

ฉันกำลังเขียนถึง I2C LCD, Newhaven NHD ‐ 0216K3Z ‐ FL ‐ GBW ‐ V3 แผ่นข้อมูลจำเพาะของมันสามารถ googled ในกรณีของมันเมื่อคำสั่งไบต์เป็น 0x หมายถึงว่าไบต์ต่อไปนี้เป็นคำสั่ง - มีประมาณ 20 ตัว ล้างแสงไฟเคอร์เซอร์กะพริบและอื่น ๆ หาก cmd ไม่ใช่ 0xfe มันเป็นเพียงตัวอักษรบางตัวที่จะแสดง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.