아두이노 wire.h wire.c 의 i2c 구현 내용을 mbed (C언어)에서 구현한 내용을 확인해볼 수 있습니다.
AVR 기반의 우두이노에서 사용하는 I2C 구현 내용은
wire.h / wire.c 파일에 구현되어 있습니다.
참고: ArduinoCore-avr/Wire.h at master · arduino/ArduinoCore-avr (github.com)
그런데 여기서 wire.h 파일의 i2c API들인
beginTransmission(), endTransmission()
위와 같은 함수의 API Call을 합니다.
그래서 궁금했습니다.
이 함수를 다른 HW플랫폼에 포팅 및 이식하려면
어떻게 해야하는지요.
그래서 mbed (C/C++) 기반으로 위 I2C API를 구현한 내용을
하기와 같이 찾았습니다.
wire.h: ArduinoCore-mbed/Wire.h at master · arduino/ArduinoCore-mbed (github.com)
wire.cpp: ArduinoCore-mbed/Wire.cpp at master · arduino/ArduinoCore-mbed (github.com)
위 링크 중에 wire.cpp의 파일을 보면
beginTransmission(), endTransmission()
위의 아두이노 기반의 함수들을
어떻게 C언어로 또는 C++언어 기반의 HW Platform에 이식할 수 있는 지 알 수 있습니다.
참고하면,
void arduino::MbedI2C::beginTransmission(uint8_t address) {
_address = address << 1;
usedTxBuffer = 0;
}
uint8_t arduino::MbedI2C::endTransmission(bool stopBit) {
#ifndef TARGET_PORTENTA_H7
if (usedTxBuffer == 0) {
// we are scanning, return 0 if the addresed device responds with an ACK
char buf[1];
int ret = master->read(_address, buf, 1, !stopBit);
return ret;
}
#endif
if (master->write(_address, (const char *) txBuffer, usedTxBuffer, !stopBit) == 0) return 0;
return 2;
}
uint8_t arduino::MbedI2C::endTransmission(void) {
return endTransmission(true);
}
(추가1)
i2c_writebytes() 와 i2c_readbytes() 구현한 내용은 하기 링크 참고하세요.
ArduinoCore-arc32/Wire.cpp at master · arduino/ArduinoCore-arc32 (github.com)
그럼,
공유합니다.
'개발 이야기 > 임베디드 개발' 카테고리의 다른 글
simplicity studio 5버전 ide는 어떤 개선점이 있나요? (0) | 2023.03.23 |
---|---|
efr32xG22 최신 silicon labs 칩의 스펙 (0) | 2023.03.23 |
(팁) debug log 로그 출력 시 색깔 별로 구분할 수 있는 방법 (0) | 2023.02.12 |
납땜이 필요없이 사용가능한 보드 (0) | 2022.10.23 |
디지털 멀티미터 사용법 (0) | 2022.10.01 |