write_i2c_block_data에서 cmd 매개 변수의 의미


12

Pi와 Arduino 간의 i2c 통신을 테스트하고 있습니다.

의사는 말합니다 :

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

좋아, 나는 문서에 대한 링크를 추가했다 (
Gus Smith

6
나는 지금 완전한 답을 할 시간이 없다 (누군가는 희망한다). 간단히 말하면, 이것이 I²C의 작동 방식이다. 마스터는 단지 적절한 바이트를 보낸 후 몇 바이트의 데이터를 보낼 수 있으며 그 바이트가 실제로 무엇인지에 대한 사양이 없습니다 (그들의 의미는 장치마다 정의됩니다). 첫 번째 바이트는 종종 명령 (또는 레지스터) 번호입니다. 또한 당신은 항상 달리 적어도 하나의 바이트를 전송해야한다 vals, cmd필수입니다.
Krzysztof Adamski

1
@KrzysztofAdamski 저에게 아주 완벽한 답변 인 것 같습니다.
버터

답변:


9

I²C프로토콜은 매우 간단합니다. 실제로 유선으로 전송되는 데이터 구조를 정의하지는 않습니다. 프레임은 슬레이브 주소 (마스터가 읽고 쓸지 여부를 나타내는 방향 비트 포함) 및 일부 바이트의 데이터로 구성됩니다. 0 바이트의 데이터로 쓰기를 시작하는 것은 의미가 없으므로 첫 번째 바이트는 필수입니다.

이 첫 번째 바이트는 종종 슬레이브 레지스터 주소 또는 명령 번호로 사용되지만 반드시 그럴 필요는 없습니다. 첫 번째 바이트 다음에 추가 바이트가있을 수도 있고 없을 수도 있습니다. 각 바이트의 의미를 정의하는 상위 프로토콜은 장치마다 다릅니다.

이것은 두 개의 독립된 인수가있는 이유를 설명 할 수 있습니다. 첫 번째 인수 ( cmd)는 필수이고 두 번째 인수 ( vals)는 선택 사항입니다. 예제가 Python언어 로되어 있지만 여기에 사용 된 API는 실제로 C선택적인 인수를 만들 수없는 원래 API에 대한 매우 근접한 매핑입니다 .


이것은 내가 질문에 대한 의견에 쓴 것에 대한 좀 더 긴 설명입니다.
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 바이트는 Pi에서 I2C 버스에 기록 된 첫 번째 바이트이며 항상 "쓰기"요청으로 전송됩니다. 이것은 Pi가

bus.read_i2c_block_data

또는

bus.write_i2c_block_data

처음 쓴다

cmd

읽기 전에 I2C 버스 에 연결 하십시오 .

일부 I2C 하드웨어는 읽기 전에 초기화가 필요하기 때문에 유용한 기능입니다.

Arduino에서 이것은 다음을 의미합니다.

먼저

Wire.onReceive(yourCallback)

때문에 함수를 호출 cmd기록 파이로 버스에. cmd버스에서 사용 가능한 첫 번째 바이트가됩니다. Pi가 Arduino보다 쓰기 요청을 보낸 경우 기능이 완료 될 때까지 Wire.onReceive 콜백에 남아 있습니다. Pi가 읽기 요청을 보낸 경우 Arduino는 Wire.onReceive를 완료 한 다음 Wire.onRequest 콜백을 호출합니다.

cmd에있는 값이 해당 값을 적절히 처리하여 시스템에서 의도하지 않은 동작을 일으키지 않도록해야합니다. 예를 들어 Wire.read = 0x30 일 때 Wire.onReceive 콜백에서 LED가 꺼집니다. 그런 다음 읽기 요청 을 보내더라도 먼저 0x30을 작성 하여 LED를 끈 다음 버스에서 요청 된 바이트를 읽습니다.


1

I2C LCD 인 Newhaven NHD-0216K3Z‐FL‐GBW‐V3에 쓰고 있습니다. 사양 시트는 구글 검색 할 수 있습니다. 이 경우 명령 바이트가 0xfe 인 경우 다음 바이트가 명령임을 의미합니다. 약 20 개가 있습니다. 지우기, 백라이트, 깜박임 커서 등. cmd가 0xfe가 아닌 경우 표시 할 문자 일뿐입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.