#include "ak9757w.h" #include "ak9757w_def.h" #include "app_i2c_master.h" #include "app_log.h" #include "sw_timer.h" static AK9757W_HANDLER AK9757W_Handler; static AK9757W_HANDLER* pHandler = &AK9757W_Handler; const uint8_t default_cntl_reg_data[] = {0x20, 0xFF, 0xFE, 0x4A, 0xE1, 0x00, 0x00, 0x00, 0xDF, 0xE0}; static bool AK9757W_Check_CompanyCode(void); static bool AK9757W_Set_Operation_Mode(AK9757W_MODE mode); static bool AK9757W_Set_ADC_Inverter(AK9757W_MODE mode); static bool AK9757W_Process(void); bool AK9757W_Initialization(void) { SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 10, AK9757W_Process); return true; #if 0 if(AK9757W_Check_CompanyCode() == false) { return false; } if(AK9757_Set_Mode(AK9757W_MODE_CONTINUOUS_MODE) == false) { return false; } Delay_ms(200); if(AK9757_Get_SensorID() == false) { return false; } AK9757W_Handler.isInitComplete = true; #endif } static bool AK9757W_Process(void) { switch(pHandler->Step) { case STEP_INIT: AK9757W_Handler.isInitComplete = false; AK9757W_Handler.SensorID = 0xFFFFFFFF; pHandler->Step = STEP_CHECK_COMPANY; break; case STEP_CHECK_COMPANY: if(AK9757W_Check_CompanyCode() == false){ pHandler->Step = STEP_ERROR; }else{ pHandler->Step = STEP_CHECK_ID_POWER_ON; } break; case STEP_CHECK_ID_POWER_ON: if(AK9757_Set_Mode(AK9757W_MODE_CONTINUOUS_MODE) == false){ pHandler->Step = STEP_ERROR; }else{ pHandler->TickCount = millis(); AK9757W_Handler.Step = STEP_CHECK_ID_POWER_ON_WAIT; } break; case STEP_CHECK_ID_POWER_ON_WAIT: if((millis() - pHandler->TickCount) >= AK9757W_CHIPID_READ_WAIT_TIME) pHandler->Step = STEP_CHECK_ID_READ; break; case STEP_CHECK_ID_READ: if(AK9757_Get_SensorID() == false){ pHandler->Step = STEP_ERROR; } else{ pHandler->Step = STEP_CHECK_ID_POWER_OFF; } break; case STEP_CHECK_ID_POWER_OFF: if(AK9757_Set_Mode(AK9757W_MODE_STAND_BY_MODE) == false){ pHandler->Step = STEP_ERROR; } else{ AK9757W_Handler.Step = STEP_WRITE_CNTL1_9; } break; case STEP_WRITE_CNTL1_9: if(AK9757_Set_CTL1_9_Parameter() == false){ } else{ } break; case STEP_ERROR: break; } } static bool AK9757W_Check_CompanyCode(void) { int error; uint8_t TxBuff; uint8_t RxBuff[10]; TxBuff = AK9757W_REG_RO_COMPANY_CODE; error = I2C_Master_Write(TEMP_I2C_ADDRESS, &TxBuff, 1); if(error != E_NO_ERROR) { dbg_printf(LOG_LEVEL_DEBUG, "I2C Write Error %d\r\n", error); return false; } error = I2C_Master_Read(TEMP_I2C_ADDRESS, &RxBuff[0], 2); if(error != E_NO_ERROR) { dbg_printf(LOG_LEVEL_DEBUG, "I2C Read Error %d\r\n", error); return false; } if(!(RxBuff[0] == AK9757W_COMPANY_CODE_VALUE && RxBuff[1] == AK9757W_DEVICE_ID_VALUE)) { dbg_printf(LOG_LEVEL_DEBUG, "Read Data %X, %X\r\n", RxBuff[0], RxBuff[1]); return false; } dbg_printf(LOG_LEVEL_DEBUG, "Company %XH, %XH\r\n", RxBuff[0], RxBuff[1]); return true; } bool AK9757_Set_Mode(AK9757W_MODE mode) { int error; uint8_t TxBuff[10]; uint8_t RxBuff[10]; TxBuff[0] = AK9757W_REG_RW_CNTL9; error = I2C_Master_WriteRead(TEMP_I2C_ADDRESS, &TxBuff[0], 1, &RxBuff[0], 1); if(error != E_NO_ERROR) { dbg_printf(LOG_LEVEL_DEBUG, "I2C Read Error %d\r\n", error); return false; } //#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<Cntl_Info.CNTL_Buff[0], &default_cntl_reg_data[0], sizeof(default_cntl_reg_data)); error = I2C_Master_Write(TEMP_I2C_ADDRESS, &pHandler->Cntl_Info.CNTL_Buff[0], sizeof(default_cntl_reg_data)); if(error != E_NO_ERROR) { dbg_printf(LOG_LEVEL_DEBUG, "I2C CNTL1~9 write Error %d\r\n", error); return false; } return true; } bool AK9757_Get_SensorID(void) { int error; uint8_t TxBuff; uint8_t RxBuff[10]; TxBuff = AK9757W_REG_RO_CHIPID; error = I2C_Master_WriteRead(TEMP_I2C_ADDRESS, &TxBuff, 1, &RxBuff[0], 4); if(error != E_NO_ERROR) { dbg_printf(LOG_LEVEL_DEBUG, "I2C Read Error %d\r\n", error); return false; } AK9757W_Handler.SensorID = (RxBuff[0] << 24) | (RxBuff[1] << 16) | (RxBuff[2] << 8) | (RxBuff[3] << 0); dbg_printf(LOG_LEVEL_DEBUG, "Read ChipID %XH\r\n", AK9757W_Handler.SensorID); return true; }