diff --git a/Project/HC32F460/MDK/HC32F460.uvoptx b/Project/HC32F460/MDK/HC32F460.uvoptx index a29ea74..10bf79a 100644 --- a/Project/HC32F460/MDK/HC32F460.uvoptx +++ b/Project/HC32F460/MDK/HC32F460.uvoptx @@ -103,7 +103,7 @@ 1 0 0 - 4 + 12 @@ -114,13 +114,13 @@ - Segger\JL2CM3.dll + BIN\CMSIS_AGDI.dll 0 JL2CM3 - -U2147483647 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_512K.FLM -FS00 -FL080000 -FP0($$Device:HC32F460JETA$FlashARM\HC32F460_512K.FLM) -FF1HC32F460_otp.FLM -FS13000C00 -FL13FC -FP1($$Device:HC32F460JETA$FlashARM\HC32F460_otp.FLM) + -U12345678 -O78 -S2 -ZTIFSpeedSel5000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8027 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO31 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_512K.FLM -FS00 -FL080000 -FP0($$Device:HC32F460JETA$FlashARM\HC32F460_512K.FLM) -FF1HC32F460_otp.FLM -FS13000C00 -FL13FC -FP1($$Device:HC32F460JETA$FlashARM\HC32F460_otp.FLM) 0 @@ -145,7 +145,7 @@ 0 CMSIS_AGDI - -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("") -D00(00000000) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_512K.FLM -FS00 -FL080000 -FP0($$Device:HC32F460JETA$FlashARM\HC32F460_512K.FLM) -FF1HC32F460_otp.FLM -FS13000C00 -FL13FC -FP1($$Device:HC32F460JETA$FlashARM\HC32F460_otp.FLM) + -X"Any" -UAny -O206 -S0 -C0 -P00000000 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO65554 -TC10000000 -TT10000000 -TP20 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD1FFF8000 -FC1000 -FN2 -FF0HC32F460_512K.FLM -FS00 -FL080000 -FP0($$Device:HC32F460JETA$FlashARM\HC32F460_512K.FLM) -FF1HC32F460_otp.FLM -FS13000C00 -FL13FC -FP1($$Device:HC32F460JETA$FlashARM\HC32F460_otp.FLM) 0 @@ -317,7 +317,7 @@ 0 1 - 0 + 1 0 0 0 diff --git a/Project/HC32F460/MDK/HC32F460.uvprojx b/Project/HC32F460/MDK/HC32F460.uvprojx index a610f11..b89011a 100644 --- a/Project/HC32F460/MDK/HC32F460.uvprojx +++ b/Project/HC32F460/MDK/HC32F460.uvprojx @@ -10,14 +10,14 @@ Debug 0x4 ARM-ADS - 5060960::V5.06 update 7 (build 960)::.\ARMCC - 5060960::V5.06 update 7 (build 960)::.\ARMCC + 5060960::V5.06 update 7 (build 960)::ARMCC + 5060960::V5.06 update 7 (build 960)::ARMCC 0 HC32F460JETA HDSC - HDSC.HC32F460.1.0.11 + HDSC.HC32F460.1.0.12 https://raw.githubusercontent.com/hdscmcu/pack/master/ IRAM(0x1FFF8000,0x2F000) IRAM2(0x200F0000,0x1000) IROM(0x00000000,0x80000) IROM2(0x03000C00,0x003FC) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE @@ -695,7 +695,7 @@ HC32F460PETB HDSC - HDSC.HC32F460.1.0.11 + HDSC.HC32F460.1.0.12 https://raw.githubusercontent.com/hdscmcu/pack/master/ IROM(0x00000000,0x80000) IROM2(0x03000C00,0x3FC) IRAM2(0x200F0000,0x1000) IROM(0x00000000,0x80000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) ELITTLE diff --git a/Project/HC32F460/source/Module/mmc5983/.gitignore b/Project/HC32F460/source/Module/mmc5983/.gitignore new file mode 100644 index 0000000..985988c --- /dev/null +++ b/Project/HC32F460/source/Module/mmc5983/.gitignore @@ -0,0 +1,130 @@ +# ---> uVision +# git ignore file for Keil µVision Project + +# µVision 5 and µVision 4 Project screen layout file +*.uvguix.* +*.uvgui.* + +# Listing Files +*.i +*.lst +*.m51 +*.m66 +*.map + +# Object Files +*.axf +*.b[0-2][0-9] +*.b3[0-1] +*.bak +*.build_log.htm +*.crf +*.d +*.dep +*.elf +*.htm +*.iex +*.lnp +*.o +*.obj +*.sbr + +# Firmware Files +*.bin +*.h86 +*.hex + +# Build Files +.bat + +# Debugger Files +.ini + +# JLink Files +JLinkLog.txt + +# Other Files + +# ---> VisualStudioCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +# ---> IAR +# Compiled binaries +*.o +*.bin +*.elf +*.hex +*.map +*.out +*.obj + +# Trash +*.bak +thumbs.db +*.~* + +# IAR Settings +**/settings/*.crun +**/settings/*.dbgdt +**/settings/*.cspy +**/settings/*.cspy.* +**/settings/*.xcl +**/settings/*.dni +**/settings/*.wsdt +**/settings/*.wspos + +# IAR Debug Exe +**/Exe/*.sim + +# IAR Debug Obj +**/Obj/*.pbd +**/Obj/*.pbd.* +**/Obj/*.pbi +**/Obj/*.pbi.* + +# IAR project "Debug" directory +Debug/ + +# IAR project "Release" directory +Release/ + +# IAR project settings directory +settings/ + +# IAR backup files +Backup* + +# IAR .dep files +*.dep +# ---> IAR_EWARM +# gitignore template for the IAR EWARM +# website: https://www.iar.com/knowledge/support/technical-notes/ide/which-files-should-be-version-controlled/ + +# Some tools will put the EWARM files +# under a subdirectory with the same name +# as the configuration. +# Example +# EWARM/Config1/Obj /List /Exe +# EWARM/Config2/Obj /List /Exe +EWARM/**/Obj +EWARM/**/List +EWARM/**/Exe + +# Autogenerated project files +*.dep +*.ewt + +# Autogenerated folder for debugger +EWARM/settings + diff --git a/Project/HC32F460/source/Module/mmc5983/README.md b/Project/HC32F460/source/Module/mmc5983/README.md new file mode 100644 index 0000000..9803551 --- /dev/null +++ b/Project/HC32F460/source/Module/mmc5983/README.md @@ -0,0 +1,3 @@ +# MMC5983 + +MMC5983驱动代码 \ No newline at end of file diff --git a/Project/HC32F460/source/Module/mmc5983/mmc5983.c b/Project/HC32F460/source/Module/mmc5983/mmc5983.c new file mode 100644 index 0000000..8b03eed --- /dev/null +++ b/Project/HC32F460/source/Module/mmc5983/mmc5983.c @@ -0,0 +1,343 @@ +#include "main.h" +#include "mmc5983.h" +#include "UartDebug.h" +#include "i2c.h" +#include "Algorithm.h" + +static int32_t max_in[XYZ]; +static int32_t min_in[XYZ]; +static bool InitFlag; +static bool MMC5983IntFlag; +static MMC5983Var_t MMC5983Var; + +/***************************************************************************************** +* : MMC5983_Write_Reg +* : MMC5983дĴ +* : reg Ĵַ + val Ĵ +* ֵ: ɹtrueʧܷfalse +*****************************************************************************************/ +static bool MMC5983_Write_Reg(uint8_t reg, uint8_t val) +{ + return I2C_MasterWriteData(M0P_I2C0, MMC5983_ADDRESS, reg, &val, 1); +} + +/***************************************************************************************** +* : MMC5983_Read_Reg +* : MMC5983Ĵ +* : reg Ĵַ +* ֵ: ؼĴֵ +*****************************************************************************************/ +static uint8_t MMC5983_Read_Reg(uint8_t reg) +{ + uint8_t res; + if(I2C_MasterReadData(M0P_I2C0, MMC5983_ADDRESS, reg, &res, 1) == false) + res = 0; + return res; +} + +/***************************************************************************************** +* : MMC5983_Read_Buffer +* : MMC5983 +* : reg Ĵַ + buffer ȡ + len ȡ +* ֵ: ɹtrueʧܷfalse +*****************************************************************************************/ +static bool MMC5983_Read_Buffer(uint8_t reg, void *buffer, uint8_t len) +{ + return I2C_MasterReadData(M0P_I2C0, MMC5983_ADDRESS, reg, buffer, len); +} + +/***************************************************************************************** +* : MMC5983StartCov +* : MMC5983ת +* : +* ֵ: +*****************************************************************************************/ +static void MMC5983StartCov(void) +{ + MMC5983RegCtrl2 Ctrl2Reg; ///رת + Ctrl2Reg.Byte = 0x00; + Ctrl2Reg.Bit.Cm_freq = 0x04; + Ctrl2Reg.Bit.Cmm_en = 1; //10 + Ctrl2Reg.Bit.Prd_set = 3; + Ctrl2Reg.Bit.En_prd_set = 1; //10 + MMC5983_Write_Reg(MMC5983_CTRL_2, Ctrl2Reg.Byte); +} + +/***************************************************************************************** +* : MMC5983_Init +* : MMC5983ʼ +* : +* ֵ: +*****************************************************************************************/ +static void MMC5983_Init(void) +{ + uint8_t id; + + id = MMC5983_Read_Reg(MMC5983_ID); + //DBG_LOG("MMC5983 id=0x%x\r\n",id); + MMC5983Var.MMC5983Delay1mSCnt = 100; + while(id != 0x30){ + if(MMC5983Var.MMC5983Delay1mSCnt <= 0) { + DBG_LOG("LEFT MMC5983 INIT Err...\r\n"); + InitFlag = false; + return; + } + } + + MMC5983RegCtrl1 Ctrl1Reg; + Ctrl1Reg.Byte = 0x00; + Ctrl1Reg.Bit.SW_RST = 1; + MMC5983_Write_Reg(MMC5983_CTRL_1, Ctrl1Reg.Byte); + MMC5983Delay(15); + + MMC5983RegCtrl2 Ctrl2Reg; ///رת + Ctrl2Reg.Byte = 0x00; + Ctrl2Reg.Bit.Cm_freq = 0x04; + Ctrl2Reg.Bit.Cmm_en = 0; //10 + Ctrl2Reg.Bit.Prd_set = 3; + Ctrl2Reg.Bit.En_prd_set = 0; //10 + MMC5983_Write_Reg(MMC5983_CTRL_2, Ctrl2Reg.Byte); + + MMC5983RegCtrl3 Ctrl3Reg; + Ctrl3Reg.Byte = 0x00; + Ctrl3Reg.Bit.St_enm = 1; + Ctrl3Reg.Bit.St_enp = 1; + MMC5983_Write_Reg(MMC5983_CTRL_3, Ctrl3Reg.Byte); + + MMC5983RegCtrl0 Ctrl0Reg; + Ctrl0Reg.Byte = 0x00; + Ctrl0Reg.Bit.TM_M = 1; + Ctrl0Reg.Bit.Auto_SR_en = 1; + Ctrl0Reg.Bit.NT_meas_done_en = 1; + MMC5983_Write_Reg(MMC5983_CTRL_0, Ctrl0Reg.Byte); + + if(InitFlag == false){ + DBG_LOG("MMC5983 INIT OK...\r\n"); + InitFlag = true; + } +} + +/***************************************************************************************** +* : MMC5983_Read +* : MMC5983ȡԭʼ +* : MagAdcX X + MagAdcY Y + MagAdcZ Z +* ֵ: ɹtrueʧܷfalse +*****************************************************************************************/ +static bool MMC5983_Read(int32_t *MagAdcX, int32_t *MagAdcY, int32_t *MagAdcZ) +{ + static uint8_t buff[7]; + + if (MMC5983_Read_Buffer(MMC5983_X_OUT_H, buff, 7) == false) + return false; + + *MagAdcX = (buff[0] << 10) | (buff[1] << 2) | ((buff[6] & 0xC0) >> 6); + *MagAdcY = (buff[2] << 10) | (buff[3] << 2) | ((buff[6] & 0x30) >> 4); + *MagAdcZ = (buff[4] << 10) | (buff[5] << 2) | ((buff[6] & 0x0C) >> 2);// Turn the 18 bits into unsigned 32-bit value + return true; +} + +/***************************************************************************************** +* : MMC5983_Get_Mag +* : ⲿȡMMC5983ųǿ +* : mag ȡ +* ֵ: +*****************************************************************************************/ +void MMC5983_Get_Mag(float *mag) +{ + if(mag == NULL) + return; + + float ADVal[XYZ]; + + ADVal[X] = MMC5983Var.Mag_Original[X] - 131072.0f; + ADVal[Y] = MMC5983Var.Mag_Original[Y] - 131072.0f; + ADVal[Z] = MMC5983Var.Mag_Original[Z] - 131072.0f; + + mag[0] = (float) (ADVal[X] * MMC5983_MAG_SCALE_18BIT); + mag[1] = (float) (ADVal[Y] * MMC5983_MAG_SCALE_18BIT); + mag[2] = (float) (ADVal[Z] * MMC5983_MAG_SCALE_18BIT); +} + +/***************************************************************************************** +* : MMC5983LoopHandler +* : MMC5983ѭ +* : +* ֵ: +*****************************************************************************************/ +extern void MmcDataProcessCallBack(float *Mag); + +void MMC5983LoopHandler(void) +{ + static int32_t mag_array[XYZ][10]; + static uint8_t magcnt; + static uint8_t TimeOutMagcnt; + + switch(MMC5983Var.Status) { + case MMC5983_STATUS_IDLE:{ + break;} + + case MMC5983_STATUS_START:{ + for(int i = 0; i < 10; i++) { + mag_array[X][i] = 0; + mag_array[Y][i] = 0; + mag_array[Z][i] = 0; + } + magcnt = 0; + TimeOutMagcnt = 0; + memset(&MMC5983Var, NULL, sizeof(MMC5983Var)); + MMC5983Var.Status = MMC5983_STATUS_DELAY; + break;} + + case MMC5983_STATUS_DELAY:{ + MMC5983StartRead(); + MMC5983Var.MMC5983Delay1mSCnt = 50; + MMC5983Var.Status = MMC5983_STATUS_WAIT_DELAY; + break;} + + case MMC5983_STATUS_WAIT_DELAY:{ + if(MMC5983Var.MMC5983Delay1mSCnt <= 0){ + MMC5983Var.Status = MMC5983_STATUS_READ; + } + break;} + + case MMC5983_STATUS_READ:{ + MMC5983Var.MMC5983Delay1mSCnt = 50; + MMC5983Var.Status = MMC5983_STATUS_WAIT_READ; + break;} + + case MMC5983_STATUS_WAIT_READ:{ + if(MMC5983Var.MMC5983Delay1mSCnt <= 0){ + MMC5983Var.Status = MMC5983_STATUS_DELAY; + TimeOutMagcnt++; + } + if(MMC5983IntFlag == true){ + MMC5983IntFlag = false; + MMC5983_Read(&mag_array[X][magcnt], &mag_array[Y][magcnt], &mag_array[Z][magcnt]); + magcnt++; + MMC5983Var.Status = MMC5983_STATUS_DELAY; + } + if(TimeOutMagcnt >= 10){ + TimeOutMagcnt = 0; + if(magcnt > 0){ + MMC5983Var.Mag_Original[X] = AverageFilter_32t(mag_array[X], magcnt); + MMC5983Var.Mag_Original[Y] = AverageFilter_32t(mag_array[Y], magcnt); + MMC5983Var.Mag_Original[Z] = AverageFilter_32t(mag_array[Z], magcnt); + magcnt = 0; + MMC5983_Get_Mag(MMC5983Var.Mag); + MmcDataProcessCallBack(MMC5983Var.Mag); + MMC5983Var.Status = MMC5983_STATUS_STOP; + } + else{ + MMC5983Var.Status = MMC5983_STATUS_STOP; +// DBG_LOG("LEFT MMC5983 TimeOut...\r\n"); + } + } + if(magcnt >= 10){ + MMC5983Var.Mag_Original[X] = AverageFilter_32t(mag_array[X], magcnt); + MMC5983Var.Mag_Original[Y] = AverageFilter_32t(mag_array[Y], magcnt); + MMC5983Var.Mag_Original[Z] = AverageFilter_32t(mag_array[Z], magcnt); + magcnt = 0; + MMC5983_Get_Mag(MMC5983Var.Mag); + MmcDataProcessCallBack(MMC5983Var.Mag); + MMC5983Var.Status = MMC5983_STATUS_STOP; + } + break;} + + case MMC5983_STATUS_STOP:{ + MMC5983Stop(); + MMC5983Var.Status = MMC5983_STATUS_IDLE; + //MMC5983Var.Status = MMC5983_STATUS_START;// + break;} + } +} + +/***************************************************************************************** +* : LeftMMC59831mSRoutine +* : MMC59831msʱѭ +* : +* ֵ: +*****************************************************************************************/ +void MMC59831mSRoutine(void) +{ + if(MMC5983Var.MMC5983Delay1mSCnt > 0) + MMC5983Var.MMC5983Delay1mSCnt--; +} + +/***************************************************************************************** +* : LeftMMC5983Init +* : MMC5983ʼ +* : +* ֵ: +*****************************************************************************************/ +void MMC5983Init(void) +{ + if(!InitFlag){ + MMC5983_Init(); + return; + } + + MMC5983Var.Status = MMC5983_STATUS_START; +} + +/***************************************************************************************** +* : LeftMMC5983Start +* : MMC5983 +* : +* ֵ: +*****************************************************************************************/ +void MMC5983Start(void) +{ + if(!InitFlag){ + MMC5983_Init(); + return; + } + + MMC5983Var.Status = MMC5983_STATUS_START; +} + +/***************************************************************************************** +* : LeftMMC5983StartRead +* : MMC5983ȡ +* : +* ֵ: +*****************************************************************************************/ +void MMC5983StartRead(void) +{ + MMC5983_Init();//ȡʱ³ʼ +} + +/***************************************************************************************** +* : MMC5983Stop +* : MMC5983ֹͣ +* : +* ֵ: +*****************************************************************************************/ +void MMC5983Stop(void) +{ + MMC5983RegCtrl0 Ctrl0Reg; + Ctrl0Reg.Byte = 0x00; + MMC5983_Write_Reg(MMC5983_CTRL_0, Ctrl0Reg.Byte); + + MMC5983RegStatus StatusReg; + StatusReg.Byte = MMC5983_Read_Reg(MMC5983_STATUS); + if(StatusReg.Bit.Meas_M_Done == 1){ + MMC5983_Write_Reg(MMC5983_STATUS, StatusReg.Byte); + } +} + +/***************************************************************************************** +* : LeftMMC5983IntCallBack +* : MMC5983жϻص +* : +* ֵ: +*****************************************************************************************/ +void MMC5983IntCallBack(void) +{ + MMC5983IntFlag = true; +} + diff --git a/Project/HC32F460/source/Module/mmc5983/mmc5983.h b/Project/HC32F460/source/Module/mmc5983/mmc5983.h new file mode 100644 index 0000000..9023e88 --- /dev/null +++ b/Project/HC32F460/source/Module/mmc5983/mmc5983.h @@ -0,0 +1,140 @@ +/** + ***************************************************************************** + * @file ak8975.h + * @author WWJ + * @version v1.0 + * @date 2019/04/09 + * @environment stm32f407 + * @brief + ***************************************************************************** +**/ + +#ifndef _MMC5983_H +#define _MMC5983_H +#include "bsp.h" + +#define X 0 +#define Y 1 +#define Z 2 +#define XYZ 3 + +#define MAX(A, B) (A > B) ? A : B; +#define MIN(A, B) (A < B) ? A : B; + +#define MMC5983_X_OUT_H 0X00 //Device ID = 0x48 +#define MMC5983_X_OUT_L 0X01 +#define MMC5983_Y_OUT_H 0X02 +#define MMC5983_Y_OUT_L 0X03 +#define MMC5983_Z_OUT_H 0X04 +#define MMC5983_Z_OUT_L 0X05 +#define MMC5983_XYZ_OUT 0X06 +#define MMC5983_TMP_OUT 0X07 +#define MMC5983_STATUS 0X08 +#define MMC5983_CTRL_0 0X09 +#define MMC5983_CTRL_1 0X0A +#define MMC5983_CTRL_2 0X0B +#define MMC5983_CTRL_3 0X0C +#define MMC5983_ID 0X2F + +#define MMC5983_ADDRESS 0x30 +#define MMC5983_MAG_SCALE_16BIT 0.24414f +#define MMC5983_MAG_SCALE_18BIT 0.061035f + +#define MMC5983Delay(x) delay_ms(x) + +typedef union { + struct { + uint8_t Meas_M_Done: 1; + uint8_t Meas_T_Done: 1; + uint8_t Res0: 2; + uint8_t OTP_Read_Done: 1; + uint8_t Res1: 3; + }Bit; + uint8_t Byte; +}MMC5983RegStatus; + +typedef union { + struct { + uint8_t TM_M: 1; + uint8_t TM_T: 1; + uint8_t NT_meas_done_en: 1; + uint8_t Set: 1; + uint8_t Reset: 1; + uint8_t Auto_SR_en: 1; + uint8_t OTP_Read: 1; + uint8_t Res0: 1; + }Bit; + uint8_t Byte; +}MMC5983RegCtrl0; + +typedef union { + struct { + uint8_t BW: 2; + uint8_t X_Inhibit: 1; + uint8_t YZ_Inhibit: 2; + uint8_t Res0: 2; + uint8_t SW_RST: 1; + }Bit; + uint8_t Byte; +}MMC5983RegCtrl1; + +typedef union { + struct { + uint8_t Cm_freq: 3; + uint8_t Cmm_en: 1; + uint8_t Prd_set: 3; + uint8_t En_prd_set: 1; + }Bit; + uint8_t Byte; +}MMC5983RegCtrl2; + +typedef union { + struct { + uint8_t Res0: 1; + uint8_t St_enp: 1; + uint8_t St_enm: 1; + uint8_t Res1: 3; + uint8_t Spi_3w: 1; + uint8_t Res2: 1; + }Bit; + uint8_t Byte; +}MMC5983RegCtrl3; + +typedef enum{ + MMC5983_STATUS_IDLE, + MMC5983_STATUS_START, + MMC5983_STATUS_DELAY, + MMC5983_STATUS_WAIT_DELAY, + MMC5983_STATUS_READ, + MMC5983_STATUS_WAIT_READ, + MMC5983_STATUS_STOP, +}MMC5983Status_m; + + +typedef struct { + MMC5983Status_m Status; + uint16_t MMC5983Delay1mSCnt; + float Mag[3]; + int32_t Mag_Original[XYZ]; +}MMC5983Var_t; + +void MMC5983LoopHandler(void); +void MMC59831mSRoutine(void); +void MMC5983Init(void); +void MMC5983Start(void); +void MMC5983Stop(void); +void MMC5983IntCallBack(void); + +void MMC5983Calib(void); +void MMC5983GetADValue(int32_t *Mag); +void MMC5983_Get_Mag(float *mag); +MMC5983Status_m GetMMC5983Status(void); +void MMC5983StartRead(void); +bool GetMMC5983CalibStatus(void); +#endif + + + +/* end of ak8975.h */ + +