각종 CHIP

CH341 칩을 이용해서 UART,I2C,SPI 통신하기 3편(I2C)

원원 2024. 12. 22. 14:14

안녕하세요. CH341 칩을 이용해서 I2C통신을 해보겠습니다.

2편에서는 UART통신을 했었는데, 같은 프로그램에 Winform의 tabControl 도구를 이용해서 UI를 구성해보겠습니다.
UART통신은 serialPort도구를 이용했었는데 이번에 i2c에서는 CH341DLL을 이용해보겠습니다.
CH341DLL은 아래의 사이트에서 다운로드 가능합니다.
https://www.wch-ic.com/downloads/CH341PAR_ZIP.html

CH341DLL_EN.H을 보면 사용가능한 함수와 설명이 나옵니다.

CH341DLL.DLL을 C#에서 사용할수있게 Wrap한 DLL을 사용하겠습니다
https://github.com/iillii/ch341-Sharp

* 하드웨어 구성
CH341에서 I2C통신을 해야하므로 1,2번핀을 연결합니다. 1,2번핀을 연결했을때랑 2,3번핀을 연결했을때 다르게 잡히는걸 확인할수있습니다.

1,2번연결
2,3번연결



* 프로그램 구성
I2C 파형을 보기위해 아날라이저를 연결합니다. 그리고 실제로 i2c모듈과 통신이 되는지 보기위해 i2c모듈도 같이 연결합니다.


* CH341 통신 연결하기
OpenDevice()함수를 이용해서 연결시도를 합니다. 연결이 되었으면 true가 리턴되고 실패했으면 false가 리턴됩니다. 
timer도구를 이용해서 1초에한번씩 OpenDevice()를 호출하고 성공/실패에 따라 UI로 표시해줍니다.

연결성공
연결실패


* I2C 통신속도 설정하기

SCL의 속도를 설정해주는 함수가 있습니다. SetStream()함수를 이용하면 20KHz, 100KHz(default), 400KHz, 750KHz 설정이 가능합니다. default로 사용할것이므로 따로 설정하지는 않습니다.


* Write하기
아래의 사이트에 write/read함수에 대한 사용예시가 잘 나와있습니다.
https://www.onetransistor.eu/2017/09/ch341a-usb-i2c-programming.html?utm_source=chatgpt.com
여기서는 ADDRESS+W, DATA1, DATA2 포맷으로 write를하는 WriteI2C함수를 사용합니다.


* Read하기
여기서는 ADDRESS+W, DATA1,  ADDRESS+R, DATA2포맷으로 read하는 ReadI2C함수를 사용합니다.


*프로그램테스트

한번에 여러 데이터를 write하고 read하는 포맷으로 프로그램을 만들었습니다. INTERVAL은 각 통신마다 간격인데 write함수에는 default로 10ms가 들어가있는것 같습니다. 그래서 write 함수의 INTERVAL은 (10ms+입력ms)로 생각하면 됩니다.

먼저 Write를 해보겠습니다.

 

 

 

연결한 I2C디바이스의 주소는 0x3C입니다. 주소를 0x03에 WRITE해서, nack가 오는걸 볼 수 있습니다.
주소가 0x06이라고 나온 이유는, 0x03을 <<1하고 Write비트(0)를 OR해줘서입니다.

0x3C를 WRITE했을때 정상적으로 ack가 오는걸 볼 수 있습니다. .


Read를 해보겠습니다

write와 만찬가지로 주소가 0x03이므로 nack가 옵니다. 그리고 address read에는 07인데 그 이유는 0x03을 <<1하고 read비트(1)를 OR해줬기때문에 0x07입니다.

0x3C를 READ했을때 정상적으로 ack가 오고 0x01을 읽었을때 0x04가 읽혔습니다.
0x04를 읽고나서 nack가 오는 이유는 마스터가 더 이상 데이터를 읽지않는걸 알려주기위해서 nack를 보냈습니다.

read를 하는경우 좌측에 결과값이 나오게 됩니다.

 

*소스코드(Commits : Add i2c)
https://github.com/yhunterr/CH341_com_csharp