본문으로 건너뛰기

tkl i2c | I2C 드라이버

TKL I2C 인터페이스는 센서, 디스플레이, IO 확장기 및 기타 주변 장치를위한 마스터 또는 노예로 I2C 버스를 구동합니다. 당신은 버스를 초기화 (TUYA_I2C_NUM_E) 역할, 속도 및 주소 폭을 가진, 그 후에 각 장치 주소, 선택적으로 중단 몬 사건 callbacks에 대하여 바이트를 보내고 받으십시오.

I2C는 두 배 철사 동시 직렬 버스입니다: 양방향 데이터 선 (SDA)와 모든 장치에 의해 공유되는 시계 선 (SCL). 마스터는 시계를 생성, 시작 및 중지 조건을 문제, 그리고 각각의 노예를 고유 7 비트 또는 10 비트 주소. 시작 상태 후에, 모든 노예는 그것의 자신의에 대하여 버스에 주소를 비교하고 일치한 장치는 반응합니다.

사이트맵

OPERATE_RET tkl_i2c_init(TUYA_I2C_NUM_E port, const TUYA_IIC_BASE_CFG_T *cfg);

주어진 역할, 속도 및 주소 폭을 가진 I2C 버스를 초기화하십시오.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 인덱스, 시작TUYA_I2C_NUM_0.
cfgconst TUYA_IIC_BASE_CFG_T *버스 구성.

구성 구조는:

typedef struct {
TUYA_IIC_ROLE_E role;
TUYA_IIC_SPEED_E speed;
TUYA_IIC_ADDR_MODE_E addr_width;
} TUYA_IIC_BASE_CFG_T;

role버스 역할 선택:

주요 특징이름 *
TUYA_IIC_MODE_MASTER마스터 모드
TUYA_IIC_MODE_SLAVE노예 모드

speed버스 속도 선택:

주요 특징이름 *
TUYA_IIC_BUS_SPEED_100K표준 속도 (100 kHz)
TUYA_IIC_BUS_SPEED_400K빠른 속도 (400 kHz)
TUYA_IIC_BUS_SPEED_1M빠른 속도 (1 MHz)
TUYA_IIC_BUS_SPEED_3_4M고속 (3.4 MHz)

addr_width주소 모드 선택:

주요 특징이름 *
TUYA_IIC_ADDRESS_7BIT7 비트 주소 모드
TUYA_IIC_ADDRESS_10BIT10 비트 주소 모드

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

사이트맵

OPERATE_RET tkl_i2c_deinit(TUYA_I2C_NUM_E port);

I2C 버스를 분리하고 소프트웨어 및 하드웨어 리소스를 중지합니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c irq init의 경우

OPERATE_RET tkl_i2c_irq_init(TUYA_I2C_NUM_E port, TUYA_I2C_IRQ_CB cb);

I2C 중단 콜백 등록 이 호출은 중단을 활성화하지 않습니다; 전화tkl_i2c_irq_enable뒤로.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.
cbTUYA_I2C_IRQ_CBInterrupt 콜백.

콜백 타입은:

typedef void (*TUYA_I2C_IRQ_CB)(TUYA_I2C_NUM_E port, TUYA_IIC_IRQ_EVT_E event);

event다음 중 하나입니다:

주요 특징이름 *
TUYA_IIC_EVENT_TRANSFER_DONE전송 완료
TUYA_IIC_EVENT_TRANSFER_INCOMPLETE로그인
TUYA_IIC_EVENT_SLAVE_TRANSMIT노예 전송 요청
TUYA_IIC_EVENT_SLAVE_RECEIVE노예 요청
TUYA_IIC_EVENT_ADDRESS_NACK노예에 의해 인정되지 않는 주소
TUYA_IIC_EVENT_GENERAL_CALL일반 전화 (주소 0) 수신
TUYA_IIC_EVENT_ARBITRATION_LOST마스터 분실 중재
TUYA_IIC_EVENT_BUS_ERROR버스 오류 검출
TUYA_IIC_EVENT_BUS_CLEAR버스 명확한 완성

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c irq enable의 경우

OPERATE_RET tkl_i2c_irq_enable(TUYA_I2C_NUM_E port);

I2C 중단을 등록할 수 있습니다.tkl_i2c_irq_init.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c irq disable의 경우

OPERATE_RET tkl_i2c_irq_disable(TUYA_I2C_NUM_E port);

I2C 중단을 비활성화합니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c master send의

OPERATE_RET tkl_i2c_master_send(TUYA_I2C_NUM_E port, uint16_t dev_addr, const void *data, uint32_t size, BOOL_T xfer_pending);

버스가 마스터 모드에서 있을 때 노예에 데이터를 보냅니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.
dev_addruint16_t노예 장치 주소.
dataconst void *전송하는 자료.
sizeuint32_t보낼 바이트 수.
xfer_pendingBOOL_TTRUE버스를 지키려면 (정지 조건 없음),FALSE정지 상태를 보내려면.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c master receive의

OPERATE_RET tkl_i2c_master_receive(TUYA_I2C_NUM_E port, uint16_t dev_addr, void *data, uint32_t size, BOOL_T xfer_pending);

버스가 마스터 모드에서 있을 때 노예로부터 데이터를 수신합니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.
dev_addruint16_t노예 장치 주소.
datavoid *산출: 주어진 자료를 위한 완충기.
sizeuint32_t받는 바이트 수.
xfer_pendingBOOL_TTRUE버스를 지키려면 (정지 조건 없음),FALSE정지 상태를 보내려면.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c set slave addr에

OPERATE_RET tkl_i2c_set_slave_addr(TUYA_I2C_NUM_E port, uint16_t dev_addr);

버스가 노예로 작동 할 때 사용되는 장치 주소를 설정합니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.
dev_addruint16_t응답 할 노예 주소.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

프로젝트

OPERATE_RET tkl_i2c_slave_send(TUYA_I2C_NUM_E port, const void *data, uint32_t size);

버스가 노예 모드에서 있을 때 데이터를 전송합니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.
dataconst void *전송하는 자료.
sizeuint32_t보낼 바이트 수.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c slave receive의

OPERATE_RET tkl_i2c_slave_receive(TUYA_I2C_NUM_E port, void *data, uint32_t size);

버스가 노예 모드에서 있을 때 데이터를 수신합니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.
datavoid *산출: 주어진 자료를 위한 완충기.
sizeuint32_t받는 바이트 수.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c get status의

OPERATE_RET tkl_i2c_get_status(TUYA_I2C_NUM_E port, TUYA_IIC_STATUS_T *status);

I2C 버스의 현재 상태를 읽습니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.
statusTUYA_IIC_STATUS_T *산출: 버스 상태.

상태 구조는:

typedef struct {
uint32_t busy : 1; // transmitter/receiver busy (1 = busy)
uint32_t mode : 1; // 0 = slave, 1 = master
uint32_t direction : 1; // 0 = transmitter, 1 = receiver
uint32_t general_call : 1; // general call indication
uint32_t arbitration_lost : 1; // master lost arbitration
uint32_t bus_error : 1; // bus error detected
} TUYA_IIC_STATUS_T;

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c reset의 경우

OPERATE_RET tkl_i2c_reset(TUYA_I2C_NUM_E port);

I2C 버스를 재설정합니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

tkl i2c get data count의 경우

int32_t tkl_i2c_get_data_count(TUYA_I2C_NUM_E port);

가장 최근의 작업에 의해 전송 된 데이터 항목의 번호를 반환합니다.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.

** 카운트 **>= 0성공에, 또는 오류에 부정적인 값. 카운트는 전송된 바이트이며 인정됩니다.tkl_i2c_master_send, 받아지는tkl_i2c_master_receive, 전송tkl_i2c_slave_send, 그리고 받아지고 인정하는tkl_i2c_slave_receive.

사이트맵

OPERATE_RET tkl_i2c_ioctl(TUYA_I2C_NUM_E port, uint32_t cmd, void *args);

Device-specific 제어 작업을 수행합니다. 예를 들어,I2C_IOCTL_SET_REGADDR_WIDTH등록 주소 너비 설정REGADDR_WIDTH_T인수.

제품 설명제품정보이름 *
portTUYA_I2C_NUM_EI2C 버스 색인.
cmduint32_t제어 명령.
argsvoid *명령과 관련된 Argument.

**리턴 **OPRT_OK성공에. 다른 값의 경우,OS_ADAPTER_I2C이름 *tuya_error_code.h.

이름 *

중단 콜백이있는 마스터 모드 :

static uint16_t cb_transfer_flag = 0xff;

static void i2c_event_cb_fun(TUYA_I2C_NUM_E port, TUYA_IIC_IRQ_EVT_E event)
{
if (port == TUYA_I2C_NUM_0) {
cb_transfer_flag = event;
}
}

void tuya_i2c_master_test(void)
{
OPERATE_RET ret;
TUYA_IIC_BASE_CFG_T cfg;
char rcv_buf[10];
char send_buf[10] = {0,1,2,3,4,5,6,7,8,9};

tkl_io_pinmux_config(TUYA_IO_PIN_0, TUYA_IIC0_SCL);
tkl_io_pinmux_config(TUYA_IO_PIN_1, TUYA_IIC0_SDA);

cfg.role = TUYA_IIC_MODE_MASTER;
cfg.speed = TUYA_IIC_BUS_SPEED_100K;
cfg.addr_width = TUYA_IIC_ADDRESS_7BIT;

ret = tkl_i2c_init(TUYA_I2C_NUM_0, &cfg);
if (ret != OPRT_OK) {
return;
}

tkl_i2c_irq_init(TUYA_I2C_NUM_0, i2c_event_cb_fun);
tkl_i2c_irq_enable(TUYA_I2C_NUM_0);

tkl_i2c_master_send(TUYA_I2C_NUM_0, 0x57, send_buf, sizeof(send_buf), FALSE);
while (cb_transfer_flag == 0xff);
cb_transfer_flag = 0xff;

tkl_i2c_master_receive(TUYA_I2C_NUM_0, 0x57, rcv_buf, sizeof(rcv_buf), FALSE);
while (cb_transfer_flag == 0xff);

tkl_i2c_irq_disable(TUYA_I2C_NUM_0);
tkl_i2c_deinit(TUYA_I2C_NUM_0);
}

노예 모드, 완료를 기다리는 상태를 polling:

void tuya_i2c_slave_test(void)
{
OPERATE_RET ret;
TUYA_IIC_BASE_CFG_T cfg;
TUYA_IIC_STATUS_T st;
char rcv_buf[10];
char send_buf[10] = {0,1,2,3,4,5,6,7,8,9};
int32_t cnt;

tkl_io_pinmux_config(TUYA_IO_PIN_0, TUYA_IIC0_SCL);
tkl_io_pinmux_config(TUYA_IO_PIN_1, TUYA_IIC0_SDA);

cfg.role = TUYA_IIC_MODE_SLAVE;
cfg.speed = TUYA_IIC_BUS_SPEED_100K;
cfg.addr_width = TUYA_IIC_ADDRESS_7BIT;

ret = tkl_i2c_init(TUYA_I2C_NUM_0, &cfg);
if (ret != OPRT_OK) {
return;
}

tkl_i2c_set_slave_addr(TUYA_I2C_NUM_0, 0x57);

tkl_i2c_slave_send(TUYA_I2C_NUM_0, send_buf, sizeof(send_buf));
cnt = 100;
while (cnt--) {
tkl_system_sleep(1);
tkl_i2c_get_status(TUYA_I2C_NUM_0, &st);
if (st.busy == 0) {
break;
}
}

tkl_i2c_slave_receive(TUYA_I2C_NUM_0, rcv_buf, sizeof(rcv_buf));
cnt = 100;
while (cnt--) {
tkl_system_sleep(1);
tkl_i2c_get_status(TUYA_I2C_NUM_0, &st);
if (st.busy == 0) {
break;
}
}

tkl_i2c_deinit(TUYA_I2C_NUM_0);
}

더 보기