/******************************************************************************* * @file i2c_manager.c * @brief Reliable HW↔SW I2C Switching Logic (with Mode Set Logging) ******************************************************************************/ #include "i2c_manager.h" #include "debug_print.h" #include "nrf_delay.h" #include "mcp4725_i2c.h" #include "nrf_drv_twi.h" #include "cat_interface.h" bool HW_I2C_FRQ = true; bool SW_I2C_FRQ = false; /* 외부 EEPROM TWI 인스턴스 */ extern const nrf_drv_twi_t m_eeprom; /* -------------------------------------------------------------------------- */ /* HW (TWI) 초기화 */ /* -------------------------------------------------------------------------- */ void hw_i2c_init_once(void) { // SW 모드일 경우 강제 해제 후 HW 전환 if (SW_I2C_FRQ) { //DBG_PRINTF("[I2C]SW→HW\r\n"); // SW 리소스 해제 (필요 시 추가) SW_I2C_FRQ = false; nrf_delay_ms(2); } // 이미 HW면 스킵 if (HW_I2C_FRQ) { // DBG_PRINTF("[I2C] HW I2C set\r\n"); return; } // 실제 HW 초기화 // eeprom_initialize(); /* vivaMayo: No EEPROM */ nrf_delay_ms(2); HW_I2C_FRQ = true; SW_I2C_FRQ = false; // DBG_PRINTF("[I2C] HW I2C Mode set!\r\n"); } /* -------------------------------------------------------------------------- */ /* SW (Port Bang-Bang) 초기화 */ /* -------------------------------------------------------------------------- */ void sw_i2c_init_once(void) { // HW 모드일 경우 강제 해제 후 SW 전환 if (HW_I2C_FRQ) { //DBG_PRINTF("[I2C]HW→SW\r\n"); nrf_drv_twi_disable(&m_eeprom); nrf_drv_twi_uninit(&m_eeprom); nrf_delay_ms(2); HW_I2C_FRQ = false; } // 이미 SW 모드면 재실행 금지 if (SW_I2C_FRQ) { // DBG_PRINTF("[I2C] SWI2C already initialized\r\n"); return; } // 실제 SW 초기화 // eeprom_uninitialize(); // TWI 라인 해제 /* vivaMayo: No EEPROM */ nrf_delay_ms(1); mcp4725_init(); // Port BangBang 방식 DAC init SW_I2C_FRQ = true; HW_I2C_FRQ = false; // DBG_PRINTF("[I2C] SW I2C Mode set!\r\n"); } /* -------------------------------------------------------------------------- */ /* 전체 리셋 */ /* -------------------------------------------------------------------------- */ void i2c_reset_state(void) { HW_I2C_FRQ = false; SW_I2C_FRQ = false; DBG_PRINTF("Flags reset\r\n"); }