LIS2MDL磁力计驱动
生活随笔
收集整理的這篇文章主要介紹了
LIS2MDL磁力计驱动
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? 之前使用STM32的硬件IIC(基于HAL庫)調試了ST的LIS2MDL磁力計,現將寫的驅動文件記錄下來,并分享給有需要的同學。
/* *********************************************************************************************** * LIS2MDL磁力計驅動 * * 實現LIS2MDL底層驅動 * * Filename : LIS2MDL.c * Version : V1.00 * Programmer(s) : FengDuo * *********************************************************************************************** */ #define LIS2MDL_MOUDLE //文件聲明 /* *********************************************************************************************** * INCLUDE FILES *********************************************************************************************** */ #include "includes.h" /* *********************************************************************************************** * LOCAL DEFINES *********************************************************************************************** */ static LIS2MDL_SAMPLE_DEF LIS2MDLSample; /* *********************************************************************************************** * LOCAL FUNCTION PROTOTYPES *********************************************************************************************** */ static void LIS2MDL_IOInit(void); static CPU_INT08U LIS2MDL_Register_Read(CPU_INT08U addr); static void LIS2MDL_Register_Write(CPU_INT08U addr,CPU_INT08U val); static void LIS2MDL_Read_XYZ(CPU_INT16S *x,CPU_INT16S *y,CPU_INT16S *z); static void LIS2MDL_Read_Offset(CPU_INT16S *x_offset,CPU_INT16S *y_offset,CPU_INT16S *z_offset); static void LIS2MDL_Write_Offset(CPU_INT16S x_offset,CPU_INT16S y_offset,CPU_INT16S z_offset); static void LIS2MDL_Clean_Offset(void); static CPU_BOOLEAN LIS2MDL_Wait_Data_Update(CPU_INT08U max_cnt); static CPU_BOOLEAN LIS2MDL_Read_Average(CPU_INT16S *x,CPU_INT16S *y,CPU_INT16S *z,CPU_INT08U times); #ifdef LIS2MDL_READ_TEMP static void LIS2MDL_Read_TEMP(CPU_INT16S *temp); #endif /* ***********************************************************************************************LOCAL FUNCTIONS *********************************************************************************************** */ /* *********************************************************************************************** * LIS2MDL_IOInit * * Description: LIS2MDL磁力計 IO初始化 * * Argument(s): 無 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ static void LIS2MDL_IOInit(void) {GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;GPIO_InitStruct.Pin = LIS2MDL_PIN_SCL |LIS2MDL_PIN_SDA;GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;HAL_GPIO_Init(LIS2MDL_PORT_SDA_SCL, &GPIO_InitStruct); }/* *********************************************************************************************** * LIS2MDL_Register_Write * * Description: 寫LIS2MDL寄存器 * * Argument(s): * addr: IN, 寄存器地址 * val: IN, 要寫入的值 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ static void LIS2MDL_Register_Write(CPU_INT08U addr,CPU_INT08U val) {CPU_INT08U len = 0x01;LIS2MDL_HardI2C_Register_Write(LIS2MDL_ADDR_WRITE, addr, &val, len); } /* *********************************************************************************************** * LIS2MDL_Register_Read * * Description: 讀LIS2MDL寄存器 * * Argument(s): * addr: IN, 寄存器地址 * * Return(s) : 寄存器讀取值 * * Caller(s) : * *********************************************************************************************** */ static CPU_INT08U LIS2MDL_Register_Read(CPU_INT08U addr) {CPU_INT08U temp = 0x00, len = 0x01;LIS2MDL_HardI2C_Register_Read(LIS2MDL_ADDR_READ, addr, &temp, len);return temp; } /* *********************************************************************************************** * LIS2MDL_Read_XYZ * * Description: LIS2MDL讀取XYZ三軸磁場強度 * * Argument(s): * x: OUT, X軸數據地址 * y: OUT, Y軸數據地址 * z: OUT, Z軸數據地址 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ static void LIS2MDL_Read_XYZ(CPU_INT16S *x,CPU_INT16S *y,CPU_INT16S *z) {CPU_INT08U buf[LIS2MDL_XYZBUF_LEN];LIS2MDL_HardI2C_Register_Read(LIS2MDL_ADDR_READ, LIS2MDL_ADDR_XOUTL, buf, LIS2MDL_XYZBUF_LEN);*x=(CPU_INT16S)((buf[1]<<8)+buf[0]);*y=(CPU_INT16S)((buf[3]<<8)+buf[2]);*z=(CPU_INT16S)((buf[5]<<8)+buf[4]); }#ifdef LIS2MDL_READ_TEMP /* *********************************************************************************************** * LIS2MDL_Read_TEMP * * Description: LIS2MDL讀取溫度值 * * Argument(s): * temp: OUT, 溫度數據地址 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ static void LIS2MDL_Read_TEMP(CPU_INT16S *temp) {CPU_INT08U buf[LIS2MDL_TEMBUF_LEN];CPU_INT16S dataT;LIS2MDL_HardI2C_Register_Read(LIS2MDL_ADDR_READ, LIS2MDL_ADDR_TEMPL, buf, LIS2MDL_TEMBUF_LEN);dataT = (CPU_INT16S)((buf[1]<<8)+buf[0]);*temp= dataT/8+25; } #endif/* *********************************************************************************************** * LIS2MDL_Read_Offset * * Description: LIS2MDL讀取XYZ三軸OFFSET * * Argument(s): * x_offset: OUT, X軸OFFSET數據地址 * y_offset: OUT, Y軸OFFSET數據地址 * z_offset: OUT, Z軸OFFSET數據地址 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ static void LIS2MDL_Read_Offset(CPU_INT16S *x_offset,CPU_INT16S *y_offset,CPU_INT16S *z_offset) { CPU_INT08U buf[LIS2MDL_OFFSETBUF_LEN];LIS2MDL_HardI2C_Register_Read(LIS2MDL_ADDR_READ, LIS2MDL_ADDR_OFFSETX_L, buf, LIS2MDL_OFFSETBUF_LEN);*x_offset = (CPU_INT16S)((buf[1]<<8)+buf[0]);*y_offset = (CPU_INT16S)((buf[3]<<8)+buf[2]);*z_offset = (CPU_INT16S)((buf[5]<<8)+buf[4]); }/* *********************************************************************************************** * LIS2MDL_Clean_Offset * * Description: 將LIS2MDL XYZ三軸OFFSET清0 * * Argument(s): 無 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ static void LIS2MDL_Clean_Offset(void) {CPU_INT08U i;for(i = 0x00;i < LIS2MDL_OFFSETBUF_LEN;i++){LIS2MDL_Register_Write(LIS2MDL_ADDR_OFFSETX_L+i,0x00); }HAL_Delay(100); }/* *********************************************************************************************** * LIS2MDL_Write_Offset * * Description: 寫入LIS2MDL XYZ三軸OFFSET * * Argument(s): * x_offset: OUT, X軸OFFSET * y_offset: OUT, Y軸OFFSET * z_offset: OUT, Z軸OFFSET * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ static void LIS2MDL_Write_Offset(CPU_INT16S x_offset,CPU_INT16S y_offset,CPU_INT16S z_offset) {CPU_INT08U buf[LIS2MDL_OFFSETBUF_LEN];buf[0] = x_offset & 0xFF;buf[1] = (x_offset >> 8) & 0xFF;buf[2] = y_offset & 0xFF;buf[3] = (y_offset >> 8) & 0xFF;buf[4] = z_offset & 0xFF;buf[5] = (z_offset >> 8) & 0xFF;LIS2MDL_HardI2C_Register_Write(LIS2MDL_ADDR_WRITE, LIS2MDL_ADDR_OFFSETX_L, buf, LIS2MDL_OFFSETBUF_LEN); } /* *********************************************************************************************** * LIS2MDL_Wait_Data_Update * * Description: LIS2MDL查詢寄存器數據就緒 * * Argument(s): * max_cnt: IN, 最大輪詢次數 * * Return(s) : 成功:TRUE,失敗:FALSE * * Caller(s) : * *********************************************************************************************** */ static CPU_BOOLEAN LIS2MDL_Wait_Data_Update(CPU_INT08U max_cnt) {for(; max_cnt>0x00; max_cnt--){if(LIS2MDL_Register_Read(LIS2MDL_ADDR_STATUS) & 0x08){return TRUE;}HAL_Delay(1);}return FALSE; }/* *********************************************************************************************** * LIS2MDL_Read_Average * * Description: LIS2MDL讀取XYZ三軸磁場強度平均值 * * Argument(s): * x: IN, X軸數據地址 * y: IN, Y軸數據地址 * z: IN, Z軸數據地址 * times: IN, 讀取次數 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ static CPU_BOOLEAN LIS2MDL_Read_Average(CPU_INT16S *x,CPU_INT16S *y,CPU_INT16S *z,CPU_INT08U times) {CPU_INT08U i,j;CPU_INT16S tx,ty,tz;CPU_INT08U temp_serial[10],tmp_serial;CPU_INT16S temp_x[10],temp_y[10],temp_z[10];CPU_INT32S tmp = 0;*x=0;*y=0;*z=0;if(times){for(i=0;i<times;i++){if(!LIS2MDL_Wait_Data_Update(15)){return FALSE;}LIS2MDL_Read_XYZ(&tx,&ty,&tz);temp_x[i]=tx;temp_y[i]=ty;temp_z[i]=tz;}}/**********************************計算X軸*********************************/for(j=0; j<times; j++) { temp_serial[j] = j; }for(i=times; i>0; i--){for(j=0; j<(i-1); j++){if(temp_x[temp_serial[j]] > temp_x[temp_serial[j+1]]){tmp_serial = temp_serial[j];temp_serial[j] = temp_serial[j+1];temp_serial[j+1] = tmp_serial; }}} for(i=1;i<times-1;i++) { tmp += temp_x[temp_serial[i]];}*x = tmp/(times-2);/**********************************計算Y軸*********************************/tmp = 0;for(j=0; j<times; j++) { temp_serial[j] = j; }for(i=times; i>0; i--){for(j=0; j<(i-1); j++){if(temp_y[temp_serial[j]] > temp_y[temp_serial[j+1]]){tmp_serial = temp_serial[j];temp_serial[j] = temp_serial[j+1];temp_serial[j+1] = tmp_serial; }}} for(i=1;i<times-1;i++) { tmp += temp_y[temp_serial[i]];}*y = tmp/(times-2);/**********************************計算Z軸*********************************/tmp = 0;for(j=0; j<times; j++) { temp_serial[j] = j; }for(i=times; i>0; i--){for(j=0; j<(i-1); j++){if(temp_z[temp_serial[j]] > temp_z[temp_serial[j+1]]){tmp_serial = temp_serial[j];temp_serial[j] = temp_serial[j+1];temp_serial[j+1] = tmp_serial; }}} for(i=1;i<times-1;i++) { tmp += temp_z[temp_serial[i]];}*z = tmp/(times-2);return TRUE; } /* *********************************************************************************************** * GLOBAL FUNCTIONS *********************************************************************************************** */ /* *********************************************************************************************** * QMC5883L_Init * * Description: QMC5883L磁力計初始化 * * Argument(s): 無 * * Return(s) : 初始化結果, 成功TRUE,失敗FALSE * * Caller(s) : * *********************************************************************************************** */ CPU_BOOLEAN LIS2MDL_Init(void) {CPU_INT08U i,uErrTime = 0x00;CPU_INT08U uRegCheck[3]= {LIS2MDL_CFGA_VALUE_IDLE,LIS2MDL_CFGB_VALUE,LIS2MDL_CFGC_VALUE};LIS2MDL_IOInit();LIS2MDL_POWER_ON();HAL_Delay(50);while (LIS2MDL_Register_Read(LIS2MDL_ADDR_CHIPID) != LIS2MDL_CHIPID_VALUE) /* 讀取器件ID */{uErrTime++;if(uErrTime>250){return FALSE;}}LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGA,LIS2MDL_CFGA_VALUE_IDLE);LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGB,LIS2MDL_CFGB_VALUE);LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGC,LIS2MDL_CFGC_VALUE);for(i = 0x00;i < 0x03;i++) /* 回讀寄存器校驗 */{if(LIS2MDL_Register_Read(LIS2MDL_ADDR_CFGA + i)!=uRegCheck[i]){return FALSE;}}/* 傳感器初始化后需重寫OFFSET */LIS2MDL_Write_Offset(LIS2MDLSave.X_Offset,LIS2MDLSave.Y_Offset,LIS2MDLSave.Z_Offset);return TRUE; }/* *********************************************************************************************** * LIS2MDL_Soft_Reset * * Description: LIS2MDL磁力計軟復位 * * Argument(s): 無 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ void LIS2MDL_Soft_Reset(void) {LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGA, LIS2MDL_CFGA_SOFT_RST);HAL_Delay(2);LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGA, LIS2MDL_CFGA_REBOOT);HAL_Delay(20); }/* *********************************************************************************************** * LIS2MDL_Hard_Reset * * Description: LIS2MDL磁力計硬復位 * * Argument(s): 無 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ void LIS2MDL_Hard_Reset(void) {LIS2MDL_POWER_OFF();HAL_Delay(1000);LIS2MDL_POWER_ON(); }/* *********************************************************************************************** * LIS2MDL_Adjust_Magnetic * * Description: LIS2MDL校準 * * Argument(s): 無 * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ CPU_BOOLEAN LIS2MDL_Adjust_Magnetic(void) {CPU_INT08U err;CPU_BOOLEAN res;CPU_INT16S x,y,z;x = 0x00;y = 0x00;z = 0x00;OSSemPend(App_SensorSem, OS_TICKS_PER_SEC, &err); /* 請求信號量 */if(err == OS_ERR_NONE){/* LIS2MDL開啟連續模式 */LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGA, LIS2MDL_CFGA_VALUE_CONTINUE);LIS2MDL_Clean_Offset(); /* 清除磁力計原OFFSET *//* 讀取10組X,Y,Z三個方向的磁場強度值,并對其取平均 */if(!LIS2MDL_Read_Average(&x,&y,&z,10)){OSSemPost(App_SensorSem); /* 釋放信號量 */res = FALSE;}else{LIS2MDL_Write_Offset(x,y,z); /* 寫入新的OFFSET */}LIS2MDL_Read_Offset(&x,&y,&z); /* 讀出OFFSET */LIS2MDLSave.X_Offset = x;LIS2MDLSave.Y_Offset = y;LIS2MDLSave.Z_Offset = z;/* LIS2MDL開啟空閑模式 */LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGA, LIS2MDL_CFGA_VALUE_IDLE);OSSemPost(App_SensorSem); /* 釋放信號量 */res = TRUE;}else{res = FALSE;}return res; }/* *********************************************************************************************** * LIS2MDL_Read_MagDensity * * Description: LIS2MDL讀取磁場強度 * * Argument(s): 無 * * Return(s) : 傳感器讀取數據結果 * * Caller(s) : * *********************************************************************************************** */ LIS2MDL_RESULT_SAMPLE LIS2MDL_Read_MagDensity(void) {CPU_INT08U i,param_vali;CPU_INT16U MagDensity = 0x00;CPU_INT16S fx = 0x00, fy = 0x00, fz = 0x00;CPU_INT16S x = 0x00, y = 0x00, z = 0x00;CPU_INT16S Temp = 0x00;SENSOR_DATA_ELEMENT_T Q_Sample;/* 檢查傳感器 */if (LIS2MDL_Register_Read(LIS2MDL_ADDR_CHIPID) != LIS2MDL_CHIPID_VALUE){LIS2MDLSample.HardFault = TRUE;return LIS2MDL_DATA_ERROR_ADDR;}else{LIS2MDLSample.HardFault = FALSE;}/* LIS2MDL開啟連續模式 */LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGA, LIS2MDL_CFGA_VALUE_CONTINUE);for(i=0;i<2;i++){if (LIS2MDL_Wait_Data_Update(15)){LIS2MDL_Read_XYZ(&x,&y,&z);}else{LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGA, LIS2MDL_CFGA_VALUE_IDLE);return LIS2MDL_DATA_ERROR_TIMEOUT;}}/* LIS2MDL開啟空閑模式 */LIS2MDL_Register_Write(LIS2MDL_ADDR_CFGA ,LIS2MDL_CFGA_VALUE_IDLE);#ifdef LIS2MDL_READ_TEMPLIS2MDL_Read_TEMP(&Temp); #endifif ((x == 0) && (y == 0) && (z == 0)){param_vali = FALSE;LIS2MDLSample.DetectInvalid = TRUE;}else{param_vali = TRUE;LIS2MDLSample.DetectInvalid = FALSE;}LIS2MDLSample.X_Data = (CPU_INT16S)(x * LIS2MDL_SENSITIVITY);LIS2MDLSample.Y_Data = (CPU_INT16S)(y * LIS2MDL_SENSITIVITY);LIS2MDLSample.Z_Data = (CPU_INT16S)(z * LIS2MDL_SENSITIVITY);fx = LIS2MDLSample.X_Data;fy = LIS2MDLSample.Y_Data;fz = LIS2MDLSample.Z_Data;MagDensity = (CPU_INT16U)(sqrt(fx*fx+fy*fy+fz*fz));Q_Sample.Bx = fx;Q_Sample.By = fy;Q_Sample.Bz = fz;Q_Sample.Temp = Temp;Q_Sample.BNorm = MagDensity;Q_Enqueue(&Q_Sample,&Q_CtlM);if (!param_vali){return LIS2MDL_DATA_ERROR_VALUE;}return LIS2MDL_DATA_SUCCESS; }/* *********************************************************************************************** * LIS2MDL_HardState * * Description: 讀取傳感器硬件是否損壞 * * Argument(s): 無 * * Return(s) : 傳感器硬件損壞結果 * * Caller(s) : * *********************************************************************************************** */ CPU_BOOLEAN LIS2MDL_HardState(void) {return LIS2MDLSample.HardFault; }/* *********************************************************************************************** * LIS2MDL_DetectState * * Description: 讀取傳感器采集是否失效 * * Argument(s): 無 * * Return(s) : 傳感器采集失效結果 * * Caller(s) : * *********************************************************************************************** */ CPU_BOOLEAN LIS2MDL_DetectState(void) {return LIS2MDLSample.DetectInvalid; }/* *********************************************************************************************** * LIS2MDL_ManualAdjustMag * * Description: LIS2MDL磁力計手動更新磁場校準值 * * Argument(s): 無 * x_offset: OUT, X軸OFFSET * y_offset: OUT, Y軸OFFSET * z_offset: OUT, Z軸OFFSET * * Return(s) : 無 * * Caller(s) : * *********************************************************************************************** */ void LIS2MDL_ManualAdjustMag(CPU_INT16S x_offset,CPU_INT16S y_offset,CPU_INT16S z_offset) {LIS2MDL_Write_Offset(x_offset,y_offset,z_offset); } /* *********************************************************************************************** * LIS2MDL磁力計驅動 * * 實現LIS2MDL底層驅動 * * Filename : LIS2MDL.h * Version : V1.00 * Programmer(s) : FengDuo * *********************************************************************************************** *///文件聲明 #ifndef _LIS2MDL_H_ #define _LIS2MDL_H_#ifdef LIS2MDL_MOUDLE #define LIS2MDL_EXT #else #define LIS2MDL_EXT extern #endif /* *********************************************************************************************** * INCLUDE FILES *********************************************************************************************** */ //...... /* *********************************************************************************************** * DEFINES *********************************************************************************************** */ /* 器件地址:設備從地址+讀寫選擇 */ #define LIS2MDL_ADDR_WRITE 0x3C #define LIS2MDL_ADDR_READ 0x3D/* 設備寄存器地址 */ #define LIS2MDL_ADDR_CFGA 0x60 #define LIS2MDL_ADDR_CFGB 0x61 #define LIS2MDL_ADDR_CFGC 0x62 #define LIS2MDL_ADDR_INTCRTL 0x63 #define LIS2MDL_ADDR_INTSOURCE 0x64 #define LIS2MDL_ADDR_INTTHSL 0x65 #define LIS2MDL_ADDR_INTTHSH 0x66 #define LIS2MDL_ADDR_STATUS 0x67#define LIS2MDL_ADDR_XOUTL 0x68 #define LIS2MDL_ADDR_XOUTH 0x69 #define LIS2MDL_ADDR_YOUTHL 0x6A #define LIS2MDL_ADDR_YOUTH 0x6B #define LIS2MDL_ADDR_ZOUTL 0x6C #define LIS2MDL_ADDR_ZOUTH 0x6D#define LIS2MDL_ADDR_TEMPL 0x6E #define LIS2MDL_ADDR_TEMPH 0x6F#define LIS2MDL_ADDR_OFFSETX_L 0x45 #define LIS2MDL_ADDR_OFFSETX_H 0x46 #define LIS2MDL_ADDR_OFFSETY_L 0x47 #define LIS2MDL_ADDR_OFFSETY_H 0x48 #define LIS2MDL_ADDR_OFFSETZ_L 0x49 #define LIS2MDL_ADDR_OFFSETZ_H 0x4A#define LIS2MDL_ADDR_CHIPID 0x4F/* 設備寄存器參數值 */ #define LIS2MDL_CFGA_TEMP_EN (1 << 7) #define LIS2MDL_CFGA_REBOOT (1 << 6) #define LIS2MDL_CFGA_SOFT_RST (1 << 5) #define LIS2MDL_CFGA_LP (1 << 4) #define LIS2MDL_CFGA_ODR_10HZ (0 << 3) | (0 << 2) #define LIS2MDL_CFGA_ODR_20HZ (0 << 3) | (1 << 2) #define LIS2MDL_CFGA_ODR_50HZ (1 << 3) | (0 << 2) #define LIS2MDL_CFGA_ODR_100HZ (1 << 3) | (1 << 2) #define LIS2MDL_CFGA_MODE_CONTINUE (0 << 1) | (0 << 0) #define LIS2MDL_CFGA_MODE_SINGLE (0 << 1) | (1 << 0) #define LIS2MDL_CFGA_MoDE_IDLE (1 << 1) | (1 << 0)#define LIS2MDL_CFGB_OFF_CANC_ONE_SHOT_EN (1 << 4) #define LIS2MDL_CFGB_INT_EN (1 << 3) #define LIS2MDL_CFGB_SET_FREQ (1 << 2) #define LIS2MDL_CFGB_OFF_CANC_EN (1 << 1) #define LIS2MDL_CFGB_LPF_EN (1 << 0)#define LIS2MDL_CFGC_INT_ON_PIN (1 << 6) #define LIS2MDL_CFGC_I2C_DIS (1 << 5) #define LIS2MDL_CFGC_BDU (1 << 4) #define LIS2MDL_CFGC_BLE (1 << 3) #define LIS2MDL_CFGC_SPI (1 << 2) #define LIS2MDL_CFGC_SELF_TEST (1 << 1) #define LIS2MDL_CFGC_DRDY_ON_PIN (1 << 0)#define LIS2MDL_CHIPID_VALUE 0x40 /* 器件標識 */#define LIS2MDL_CFGA_VALUE_CONTINUE ( LIS2MDL_CFGA_TEMP_EN \| LIS2MDL_CFGA_ODR_100HZ \| LIS2MDL_CFGA_MODE_CONTINUE ) /* 溫度補償,100HZ,連續模式 */#define LIS2MDL_CFGA_VALUE_IDLE ( LIS2MDL_CFGA_TEMP_EN \| LIS2MDL_CFGA_ODR_100HZ \| LIS2MDL_CFGA_MoDE_IDLE ) /* 溫度補償,100HZ,空閑模式 */#define LIS2MDL_CFGB_VALUE ( LIS2MDL_CFGB_OFF_CANC_EN \| LIS2MDL_CFGB_LPF_EN ) /* 偏移抵消,啟用低通濾波 */#define LIS2MDL_CFGC_VALUE ( LIS2MDL_CFGC_BDU ) /* 開啟數據完整性保護 */#define LIS2MDL_XYZBUF_LEN 0x06 #define LIS2MDL_TEMBUF_LEN 0x02 #define LIS2MDL_OFFSETBUF_LEN 0x06#define LIS2MDL_SENSITIVITY ( 1.5 ) /* 磁力計靈敏度 */#define LIS2MDL_CUM_REBOOT_MAXCNT ( 100 ) /* 磁力計累計重啟最大次數 */ #define LIS2MDL_CON_REBOOT_MAXCNT LIS2MDL_CUM_REBOOT_MAXCNT /* 磁力計連續重啟最大次數 *//* LIS2MDL 供電控制 */ #define LIS2MDL_POWER_ON() BSP_SNR_PWR_H() #define LIS2MDL_POWER_OFF() BSP_SNR_PWR_L()/* LIS2MDL 管腳 */ #define LIS2MDL_PIN_SCL BSP_IIC1_PIN_SCL #define LIS2MDL_PIN_SDA BSP_IIC1_PIN_SDA #define LIS2MDL_PORT_SDA_SCL BSP_IIC1_PORT_SDA_SCL//#define LIS2MDL_READ_TEMP /* 使用LIS2MDL內部溫度 */typedef struct {CPU_INT16S X_Data; /* 磁力計X軸數據 */CPU_INT16S Y_Data; /* 磁力計Y軸數據 */CPU_INT16S Z_Data; /* 磁力計Z軸數據 */CPU_INT16S T_Data; /* 磁力計內部溫度 */CPU_INT16U MagDensity; /* 磁力計總磁擾強度 */CPU_FP32 XY_Angle; /* 磁力計X軸Y軸夾角 */CPU_FP32 XZ_Angle; /* 磁力計X軸Z軸夾角 */CPU_FP32 YZ_Angle; /* 磁力計Y軸Z軸夾角 */CPU_INT16S X_Offset; /* 磁力計X軸OFFSET */CPU_INT16S Y_Offset; /* 磁力計Y軸OFFSET */CPU_INT16S Z_Offset; /* 磁力計Z軸OFFSET */CPU_BOOLEAN HardFault; /* 傳感器硬件損壞 */CPU_BOOLEAN DetectInvalid; /* 傳感器檢測失效 */ }LIS2MDL_SAMPLE_DEF;typedef struct {CPU_INT16S X_Offset; /* 磁力計X軸OFFSET */CPU_INT16S Y_Offset; /* 磁力計Y軸OFFSET */CPU_INT16S Z_Offset; /* 磁力計Z軸OFFSET */ }LIS2MDL_Save_DEF;typedef enum{LIS2MDL_DATA_SUCCESS, /* 獲取數據成功 */LIS2MDL_DATA_ERROR_ADDR, /* 傳感器通信地址錯誤 */LIS2MDL_DATA_ERROR_TIMEOUT, /* 傳感器讀取超時 */LIS2MDL_DATA_ERROR_VALUE, /* 傳感器數值錯誤 */ }LIS2MDL_RESULT_SAMPLE; /* *********************************************************************************************** * EXTERNS *********************************************************************************************** */ LIS2MDL_EXT LIS2MDL_Save_DEF LIS2MDLSave; /* *********************************************************************************************** * GLOBAL FUNCTION PROTOTYPES *********************************************************************************************** */ LIS2MDL_EXT void LIS2MDL_Soft_Reset(void); LIS2MDL_EXT void LIS2MDL_Hard_Reset(void); LIS2MDL_EXT CPU_BOOLEAN LIS2MDL_Init(void); LIS2MDL_EXT CPU_BOOLEAN LIS2MDL_HardState(void); LIS2MDL_EXT CPU_BOOLEAN LIS2MDL_DetectState(void); LIS2MDL_EXT CPU_BOOLEAN LIS2MDL_Adjust_Magnetic(void); LIS2MDL_EXT LIS2MDL_RESULT_SAMPLE LIS2MDL_Read_MagDensity(void); LIS2MDL_EXT void LIS2MDL_ManualAdjustMag(CPU_INT16S x_offset,CPU_INT16S y_offset,CPU_INT16S z_offset); #endif有需要下載源文件的同學可以去該地址下載:https://download.csdn.net/download/yekui6254/12109416
總結
以上是生活随笔為你收集整理的LIS2MDL磁力计驱动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USB设备路径是什么,是什么格式的?
- 下一篇: 做了一个仿吃鸡游戏,可多人联网,算是学习