/* * tmag5273.c * * Created on: 2025��1��10�� * Author: zhouxiong9 */ #include "tmag5273.h" #include #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; enum I2cControllerStatus { I2C_STATUS_IDLE = 0, I2C_STATUS_TX_STARTED, I2C_STATUS_TX_INPROGRESS, I2C_STATUS_TX_COMPLETE, I2C_STATUS_RX_STARTED, I2C_STATUS_RX_INPROGRESS, I2C_STATUS_RX_COMPLETE, I2C_STATUS_ERROR } gI2cControllerStatus; void I2C_0_INST_IRQHandler(void) { switch (DL_I2C_getPendingInterrupt(I2C_0_INST)) { case DL_I2C_IIDX_CONTROLLER_RX_DONE: gI2cControllerStatus = I2C_STATUS_RX_COMPLETE; break; case DL_I2C_IIDX_CONTROLLER_TX_DONE: gI2cControllerStatus = I2C_STATUS_TX_COMPLETE; break; case DL_I2C_IIDX_CONTROLLER_RXFIFO_TRIGGER: /* Not used for this example */ case DL_I2C_IIDX_CONTROLLER_TXFIFO_TRIGGER: /* Not used for this example */ break; case DL_I2C_IIDX_CONTROLLER_ARBITRATION_LOST: case DL_I2C_IIDX_CONTROLLER_NACK: if ((gI2cControllerStatus == I2C_STATUS_RX_STARTED) || (gI2cControllerStatus == I2C_STATUS_TX_STARTED)) { /* NACK interrupt if I2C Target is disconnected */ gI2cControllerStatus = I2C_STATUS_ERROR; } break; case DL_I2C_IIDX_CONTROLLER_RXFIFO_FULL: /* Not used for this example */ case DL_I2C_IIDX_CONTROLLER_TXFIFO_EMPTY: /* Not used for this example */ case DL_I2C_IIDX_CONTROLLER_START: /* Not used for this example */ case DL_I2C_IIDX_CONTROLLER_STOP: /* Not used for this example */ break; case DL_I2C_IIDX_CONTROLLER_EVENT1_DMA_DONE: /* I2C DMA Done on TX */ break; case DL_I2C_IIDX_CONTROLLER_EVENT2_DMA_DONE: /* I2C DMA Done on RX */ break; default: break; } } ULONG gTxLen, gRxLen, gRxCount; UBYTE gTxPacket[128]; UBYTE gRxPacket[128]; void TMAG5273_WriteReg(UBYTE regaddr, UBYTE num, UBYTE *regdata) { UWORD i; gI2cControllerStatus = I2C_STATUS_IDLE; gTxLen = num + 1; gTxPacket[0] = regaddr; for(i=1; i<=num; i++) { gTxPacket[i] = (UBYTE)regdata[i-1]; } /* Fill the FIFO using DMA */ DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (ULONG)(&gTxPacket[0])); DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (ULONG)(&I2C_0_INST->MASTER.MTXDATA)); DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, gTxLen); DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID); delay_cycles(10); gI2cControllerStatus = I2C_STATUS_TX_STARTED; while (!( DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE)) ; DL_I2C_startControllerTransfer(I2C_0_INST, TMAG5273A1_ADDRESS, DL_I2C_CONTROLLER_DIRECTION_TX, gTxLen); while ((gI2cControllerStatus != I2C_STATUS_TX_COMPLETE) && (gI2cControllerStatus != I2C_STATUS_ERROR)) { __WFE(); } while (DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS); while (!(DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE)); } void TMAG5273_ReadData(UBYTE regaddr, UBYTE num, UBYTE* Read) { UBYTE data[2], i; data[0] = regaddr; /* Fill the FIFO using DMA */ DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID, (ULONG)(&data[0])); DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (ULONG)(&I2C_0_INST->MASTER.MTXDATA)); DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, 1); DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID); delay_cycles(10); gI2cControllerStatus = I2C_STATUS_TX_STARTED; while (!( DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE)) ; DL_I2C_startControllerTransfer(I2C_0_INST, TMAG5273A1_ADDRESS, DL_I2C_CONTROLLER_DIRECTION_TX, 1); while ((gI2cControllerStatus != I2C_STATUS_TX_COMPLETE) && (gI2cControllerStatus != I2C_STATUS_ERROR)) { __WFE(); } while (DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS); while (!(DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE)); gRxLen = num; gRxCount = 0; DL_DMA_setSrcAddr(DMA, DMA_CH1_CHAN_ID, (ULONG)(&I2C_0_INST->MASTER.MRXDATA)); DL_DMA_setDestAddr(DMA, DMA_CH1_CHAN_ID, (uint32_t)(&gRxPacket[0])); DL_DMA_setTransferSize(DMA, DMA_CH1_CHAN_ID, gRxLen); DL_DMA_enableChannel(DMA, DMA_CH1_CHAN_ID); delay_cycles(10); gI2cControllerStatus = I2C_STATUS_RX_STARTED; DL_I2C_startControllerTransfer(I2C_0_INST, TMAG5273A1_ADDRESS, DL_I2C_CONTROLLER_DIRECTION_RX, gRxLen); while (gI2cControllerStatus != I2C_STATUS_RX_COMPLETE) { __WFE(); } while (DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_BUSY_BUS); for(i=0; i> 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); // } }