#include "i2c.h" #include "delay.h" #include "uart.h" #include volatile uint8_t i2c_tx_done = 0; volatile uint8_t i2c_rx_done = 0; uint8_t g_i2c_last_command[3] = {0}; uint8_t g_i2c_command_valid = 0; /** * 함수명: disable * 목적: I2C 장치에 비활성화(disable) 명령을 전송 * * 매개변수: 없음 * * 반환값: 없음 (void) * * 동작 방식: * 1) 전송할 데이터 준비 * - dis 배열에 {0x01, 0x02} 값 저장 * * 2) I2C 송신 * - R_IICA0_Master_Send() 호출하여 슬레이브 주소로 데이터 전송 * - 전송 성공 시 다음 단계로 진행 * - 전송 실패 시 UART로 "I2C Send Failed" 메시지 출력 후 함수 종료 * * 참고: * - SLAVE_ADDR는 전송 대상 I2C 장치 주소 * - sizeof(dis)를 통해 전송할 데이터 길이 자동 계산 * - 전송 타임아웃은 100ms */ void disable(void){ static uint8_t dis[] = {0x01, 0x02}; //static uint8_t tx[] = {0xT0, 0x00, 0x00}; // I2C 마스터 송신 if (R_IICA0_Master_Send(SLAVE_ADDR << 1, dis, sizeof(dis), 100) != MD_OK) { HOST_PRINT("I2C Send Failed\r\n"); return; } } /** * 함수명: I2C_EnablePower * 목적: I2C 장치 전원을 켠다. * * 매개변수: 없음 * * 반환값: 없음 (void) * * 동작 방식: * 1) P7 레지스터의 특정 비트를 설정하여 전원 출력 HIGH 상태로 변경 * - _02_Pn1_OUTPUT_1 : P7 포트의 1번 핀을 출력 모드로 HIGH 설정 * * 참고: * - I2C 장치 전원 공급용 핀을 제어 * - 출력 HIGH 상태로 전원이 켜짐 */ void I2C_EnablePower(void) { P7 = _02_Pn1_OUTPUT_1; } /** * 함수명: I2C_DisablePower * 목적: I2C 장치 전원을 끈다. * * 매개변수: 없음 * * 반환값: 없음 (void) * * 동작 방식: * 1) P7 레지스터의 특정 비트를 클리어하여 전원 출력 LOW 상태로 변경 * - _00_Pn1_OUTPUT_0 : P7 포트의 1번 핀을 출력 모드로 LOW 설정 * * 참고: * - I2C 장치 전원 공급용 핀을 제어 * - 출력 LOW 상태로 전원이 꺼짐 */ void I2C_DisablePower(void) { P7 = _00_Pn1_OUTPUT_0; } /** * 함수명: I2C_T_Command_Mode_receiveData * 목적: I2C 장치에 명령(tx_data) 전송 후, 상태를 UART로 출력 * * 매개변수: * - tx_data : I2C로 전송할 데이터 버퍼 * - tx_len : 전송할 데이터 길이 (바이트) * - id : I2C 슬레이브 장치 주소 * * 반환값: 없음 (void) * * 동작 방식: * 1) I2C 하드웨어 초기화 * - R_IICA0_Create()를 호출하여 I2C 모듈 초기화 * - I2C 장치에 전원 공급 (I2C_EnablePower()) * - 전원 안정화를 위해 약간의 delay(1초) * * 2) I2C 명령 전송 * - R_IICA0_Master_Send()로 장치에 tx_data 전송 * - 전송 실패 시 UART로 "I2C Send Failed" 출력하고 함수 종료 * * 3) UART 출력 * - 전송 성공 여부와 상관없이 "51" 문자열을 UART로 출력 * * 참고: * - 이 함수는 읽기(read) 기능 없이 명령 전송만 수행 * - UART 출력 "51"은 전송 완료 신호/디버깅용 */ void I2C_T_Command_Mode_receiveData(const uint8_t *tx_data, uint8_t tx_len,uint8_t id ) { char uart_buf[16]; int j; uint8_t rx[3] = {0}; R_IICA0_Create(); I2C_EnablePower(); delay(10000); if (R_IICA0_Master_Send((id << 1), tx_data, tx_len, 100) != MD_OK) { HOST_PRINT("I2C Send Failed\r\n"); return; } HOST_PRINT("51\r\n"); } /** * 함수명: I2C_Command_Mode_receiveData * 목적: I2C 장치에 명령(tx_data)을 전송하고, 상태를 UART로 출력 * * 매개변수: * - tx_data : I2C로 전송할 데이터 버퍼 * - tx_len : 전송할 데이터 길이 (바이트) * - id : I2C 슬레이브 장치 주소 * * 반환값: 없음 (void) * * 동작 방식: * 1) I2C 명령 전송 * - R_IICA0_Master_Send()로 지정한 슬레이브(id)에 tx_data 전송 * - 전송 실패 시 UART로 "I2C Send Failed" 출력 후 함수 종료 * * 2) UART 출력 * - 전송 성공 시 "51" 문자열을 UART로 전송 * - 디버깅 또는 전송 완료 신호용 * * 참고: * - 읽기 기능 없이 명령 전송만 수행 * - I2C 전원 제어나 초기화는 포함되어 있지 않음 */ void I2C_Command_Mode_receiveData(const uint8_t *tx_data, uint8_t tx_len,uint8_t id ) { char uart_buf[16]; int j; uint8_t rx[3] = {0}; if (R_IICA0_Master_Send((id << 1), tx_data, tx_len, 100) != MD_OK) { HOST_PRINT("I2C Send Failed\r\n"); return; } HOST_PRINT("51\r\n"); } /** * 함수명: I2C_Command_Mode_Send * 목적: I2C 슬레이브 장치로부터 데이터를 읽고, UART로 출력 * * 매개변수: * - tx_len : 읽을 데이터 길이 (바이트) * - id : I2C 슬레이브 장치 주소 * * 반환값: 없음 (void) * * 동작 방식: * 1) I2C 데이터 수신 * - R_IICA0_Master_Receive()를 사용하여 지정된 슬레이브(id)로부터 tx_len 바이트 읽기 * - 실패 시 UART로 "I2C Receive Failed" 출력 후 함수 종료 * * 2) UART 출력 * - 첫 번째 바이트는 "%02X " 형식으로 바로 출력 * - 그 다음 바이트들은 2바이트씩 묶어서 "%02X%02X " 형식으로 출력 * - 마지막에 남은 1바이트는 단독으로 "%02X" 출력 * - 모든 출력 후 줄바꿈("\r\n") 추가 * * 3) delay * - 각 출력 사이에 delay를 넣어 UART 전송 안정화 * * 참고: * - I2C 전원 제어나 초기화는 포함되어 있지 않음 * - 출력 포맷은 디버깅 또는 로그용 */ void I2C_Command_Mode_Send(uint8_t tx_len, uint8_t id) { static uint8_t rx[600]; static char out[2*600 + 3]; uint16_t i; uint16_t p = 0; uint32_t guard = 0; if (tx_len == 0) return; if (tx_len > 600) tx_len = 600; memset(rx, 0x00, sizeof(rx)); i2c_rx_done = 0; // ✅ 수신 시작 전 클리어 if (R_IICA0_Master_Receive((id << 1), rx, tx_len, 1000) != MD_OK) { HOST_PRINT("I2C Receive Failed\r\n"); return; } /* ✅ 수신 완료까지 대기 (delay로 때우지 말고 플래그로) */ while (!i2c_rx_done) { if (guard++ > 3000000UL) { // 타임아웃 (환경 맞게 조절) HOST_PRINT("I2C RX Timeout\r\n"); return; } } /* ✅ OWI처럼: 공백 없이 붙여서 출력 */ for (i = 0; i < tx_len; i++) { uint8_t b = rx[i]; out[p++] = "0123456789ABCDEF"[b >> 4]; out[p++] = "0123456789ABCDEF"[b & 0x0F]; } out[p++] = '\r'; out[p++] = '\n'; out[p] = '\0'; HOST_PRINT(out); }