본문 바로가기

개발 이야기/임베디드 개발

아두이노 wire.h wire.c 의 i2c 구현 내용을 mbed (C언어)에서 구현한 내용

728x90

아두이노 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)

 

 

 

 

그럼,

   공유합니다.

 

728x90