/* * tmag5273.c * * Created on: 2025��1��10�� * Author: zhouxiong9 */ #include "tmag5273.h" #include "i2c_analog.h" #include "ti_msp_dl_config.h" #define TMAG5273A1_ADDRESS 0x35 #define DEVICE_CONFIG_1 0x00 #define DEVICE_CONFIG_2 0x01 #define SENSOR_CONFIG_1 0x02 #define SENSOR_CONFIG_2 0x03 #define X_THR_CONFIG 0x04 #define Y_THR_CONFIG 0x05 #define Z_THR_CONFIG 0x06 #define T_CONFIG 0x07 #define INT_CONFIG_1 0x08 #define MAG_GAIN_CONFIG 0x09 #define MAG_OFFSET_CONFIG_1 0x0A #define MAG_OFFSET_CONFIG_2 0x0B #define I2C_ADDRESS 0x0C #define DEVICE_ID 0x0D #define MANUFACTURER_ID_LSB 0x0E #define MANUFACTURER_ID_MSB 0x0F #define T_MSB_RESULT 0x10 #define T_LSB_RESULT 0x11 #define X_MSB_RESULT 0x12 #define X_LSB_RESULT 0x13 #define Y_MSB_RESULT 0x14 #define Y_LSB_RESULT 0x15 #define Z_MSB_RESULT 0x16 #define Z_LSB_RESULT 0x17 #define CONV_STATUS 0x18 #define ANGLE_RESULT_MSB 0x19 #define ANGLE_RESULT_LSB 0x1A #define MAGNITUDE_RESULT 0x1B #define DEVICE_STATUS 0x1C TMAG5273_OUT Tmag5273_out; void TMAG5273_WriteReg(UBYTE RAddr, UBYTE WData) { I2C_Start(); I2C_SendByte(TMAG5273A1_ADDRESS << 1); // Device Addr + Write (operation) I2C_SendByte(RAddr); I2C_SendByte(WData); I2C_Stop(); } void TMAG5273_ReadData(UBYTE RAddr, UBYTE Num, UBYTE *RData) { UBYTE i; I2C_Start(); I2C_SendByte(TMAG5273A1_ADDRESS << 1); // Device Addr + Write (operation) I2C_SendByte(RAddr); I2C_Start(); I2C_SendByte((TMAG5273A1_ADDRESS << 1) + 1); // Device Addr + Write (operation) for(i = 0; i < Num; i++) { *(RData + i) = I2C_RecvByte(); } I2C_Stop(); } UBYTE tmag5273_GetDevID(void) { UBYTE Result; TMAG5273_ReadData(DEVICE_ID, 1, &Result); return Result; } UWORD tmag5273_GetMANUFACTURER_ID(void) { UWORD Result; UBYTE Rs1, Rs2; TMAG5273_ReadData(MANUFACTURER_ID_LSB, 1, &Rs1); TMAG5273_ReadData(MANUFACTURER_ID_MSB, 1, &Rs2); Result = (Rs2 << 8) + Rs1; return Result; } SBYTE tmag5273_Init(void) { UBYTE tmp; I2C_Init(); tmp = 0x00; TMAG5273_WriteReg(DEVICE_CONFIG_1, tmp); tmp = 0x02; TMAG5273_WriteReg(DEVICE_CONFIG_2, tmp); tmp = 0x7C; TMAG5273_WriteReg(SENSOR_CONFIG_1, tmp); tmp = 0x14; //Ax < Ay TMAG5273_WriteReg(SENSOR_CONFIG_2, tmp); tmp = 196; //Ax = 20.623mT, Ay = 26.873mT, Ax / Ay * 256 TMAG5273_WriteReg(MAG_GAIN_CONFIG, tmp); tmp = 0x01; TMAG5273_WriteReg(T_CONFIG, tmp); return 0; } SLONG tmag5273_GetXData(void) //uT { UBYTE xMLSB[2]; UWORD xData = 0; SLONG Out = 0; TMAG5273_ReadData(X_MSB_RESULT, 2, xMLSB); xData = xMLSB[1] + (xMLSB[0] << 8); if(xData & 0x8000) Out = ((-32768 + (xData & 0x7FFF)) * 40000) >> 15; else Out = ((xData & 0x7FFF) * 40000) >> 15; return Out; } SLONG tmag5273_GetYData(void) //uT { UBYTE yMLSB[2]; SWORD yData = 0; SLONG Out = 0; TMAG5273_ReadData(Y_MSB_RESULT, 2, yMLSB); yData = yMLSB[1] + (yMLSB[0] << 8); if(yData & 0x8000) Out = ((-32768 + (yData & 0x7FFF)) * 40000) >> 15; else Out = ((yData & 0x7FFF) * 40000) >> 15; return Out; } SLONG tmag5273_GetZData(void) //uT { UBYTE zMLSB[2]; SWORD zData = 0; SLONG Out = 0; TMAG5273_ReadData(Z_MSB_RESULT, 2, zMLSB); zData = zMLSB[1] + (zMLSB[0] << 8); if(zData & 0x8000) Out = ((-32768 + (zData & 0x7FFF)) * 40000) >> 15; else Out = ((zData & 0x7FFF) * 40000) >> 15; return Out; } SWORD tmag5273_GetTemp(void) //0.01℃ { UBYTE tMLSB[2]; UWORD tData = 0; SWORD Result; TMAG5273_ReadData(T_MSB_RESULT, 2, tMLSB); tData = tMLSB[1] + (tMLSB[0] << 8); Result = 2500 + (((tData - 17508) * 213) >> 7); //100 * 60.1 * 128 return Result; } #define ZeroOffset 1469 UWORD tmag5273_GetAngle(void) //Q15 { UBYTE agMLSB[2] = {0, 0}; UWORD anData = 0; UWORD Result; TMAG5273_ReadData(ANGLE_RESULT_MSB, 2, agMLSB); anData = agMLSB[1] + (agMLSB[0] << 8); if(anData > 5760) anData = 5760; Result = 32767 - ((anData * 728) >> 7); return Result; // if(Result < 1469) // { // return (Result + 32767 - 1469); // } // else // { // return (Result - 1469); // } }