728x90
아래는 아두이노 i2c 라이브러리인 Wire 라이브러리를 사용하지 않고, hali2cwritebytes() 및 hali2creadbytes() 함수를 이용하여 I2C 통신을 구현하는 예시 코드입니다.
#include <Wire.h>
#define SDA_PIN 20
#define SCL_PIN 21
void i2c_init() {
pinMode(SDA_PIN, OUTPUT);
pinMode(SCL_PIN, OUTPUT);
}
void i2c_start() {
digitalWrite(SDA_PIN, HIGH);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SDA_PIN, LOW);
digitalWrite(SCL_PIN, LOW);
}
void i2c_stop() {
digitalWrite(SDA_PIN, LOW);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SDA_PIN, HIGH);
}
bool i2c_write(uint8_t data) {
for (uint8_t i = 0; i < 8; i++) {
digitalWrite(SDA_PIN, (data & (1 << (7 - i))) != 0);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SCL_PIN, LOW);
}
pinMode(SDA_PIN, INPUT);
digitalWrite(SCL_PIN, HIGH);
bool ack = digitalRead(SDA_PIN) == LOW;
digitalWrite(SCL_PIN, LOW);
pinMode(SDA_PIN, OUTPUT);
return ack;
}
uint8_t i2c_read(bool ack) {
uint8_t data = 0;
pinMode(SDA_PIN, INPUT);
for (uint8_t i = 0; i < 8; i++) {
digitalWrite(SCL_PIN, HIGH);
data |= digitalRead(SDA_PIN) << (7 - i);
digitalWrite(SCL_PIN, LOW);
}
pinMode(SDA_PIN, OUTPUT);
digitalWrite(SDA_PIN, !ack);
digitalWrite(SCL_PIN, HIGH);
digitalWrite(SCL_PIN, LOW);
digitalWrite(SDA_PIN, HIGH);
return data;
}
void hali2cwritebytes(uint8_t address, uint8_t* data, uint8_t length) {
i2c_start();
i2c_write(address << 1);
for (uint8_t i = 0; i < length; i++) {
i2c_write(data[i]);
}
i2c_stop();
}
void hali2creadbytes(uint8_t address, uint8_t* data, uint8_t length) {
i2c_start();
i2c_write((address << 1) | 0x01);
for (uint8_t i = 0; i < length; i++) {
bool ack = i < length - 1;
data[i] = i2c_read(ack);
}
i2c_stop();
}
(출처1)
출처는 Free ChatGPT 입니다.
그럼,
공유합니다.
728x90
'개발 이야기 > 임베디드 개발' 카테고리의 다른 글
C/C++ 소스 코드 내에서 어셈블리를 인라인으로 사용하는 방법 (0) | 2023.04.18 |
---|---|
gecko sdk의 i2c 함수인 halI2cWrytebytes / halI2cReadbytes 로 아두이노 wire 라이브러리 구현 (0) | 2023.04.15 |
[KOCW] 오픈소스 드론 - 드론의 개념과 이론, 제작, 운용, 항공법규의 이해 (0) | 2023.04.06 |
빙챗이나 ChatGPT로 제안받은 아두이노 코드의 활용 방법 (0) | 2023.04.05 |
화웨이 자체적으로 14nm EDA개발 완료 (0) | 2023.03.27 |