You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

271 lines
5.5 KiB

#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<<BIT))
dbg_printf(LOG_LEVEL_DEBUG, "read data %x\r\n", RxBuff[0]);
TxBuff[1] = RxBuff[0] & ~(AK9757W_CNTL9_MODE_MSK << AK9757W_CNTL9_MODE_POS);
TxBuff[1] |= (mode << AK9757W_CNTL9_MODE_POS);
dbg_printf(LOG_LEVEL_DEBUG, "write data %x\r\n", TxBuff[1]);
error = I2C_Master_Write(TEMP_I2C_ADDRESS, &TxBuff[0], 2);
if(error != E_NO_ERROR)
{
dbg_printf(LOG_LEVEL_DEBUG, "I2C write Error %d\r\n", error);
return false;
}
return true;
}
bool AK9757_Set_AD_OutputDataTyte(AK9757W_IR_ADC_INVERT type)
{
}
bool AK9757_Set_CTL1_9_Parameter(void)
{
int error;
uint8_t i;
memcpy(&pHandler->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;
}