|
@@ -6,7 +6,7 @@
|
|
|
*/
|
|
|
|
|
|
#include "tmag5273.h"
|
|
|
-#include <ti/driverlib/dl_i2c.h>
|
|
|
+#include "i2c_analog.h"
|
|
|
#include "ti_msp_dl_config.h"
|
|
|
|
|
|
#define TMAG5273A1_ADDRESS 0x35
|
|
@@ -41,156 +41,36 @@
|
|
|
#define MAGNITUDE_RESULT 0x1B
|
|
|
#define DEVICE_STATUS 0x1C
|
|
|
|
|
|
-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;
|
|
|
-
|
|
|
-ULONG gTxLen, gTxCount, gRxCount, gRxLen;
|
|
|
-UBYTE gTxPacket[128];
|
|
|
-UBYTE gRxPacket[128];
|
|
|
-
|
|
|
-char TMAG5273_WriteReg(UBYTE addr, UBYTE regaddr, UBYTE num, UBYTE *regdata)
|
|
|
+void TMAG5273_WriteReg(UBYTE RAddr, UBYTE WData)
|
|
|
{
|
|
|
- UWORD i;
|
|
|
-
|
|
|
- gI2cControllerStatus = I2C_STATUS_IDLE;
|
|
|
- gTxLen = num+1;
|
|
|
-
|
|
|
- gTxPacket[0] = regaddr;
|
|
|
- for(i=1; i<=num; i++)
|
|
|
- {
|
|
|
- gTxPacket[i] = (UBYTE)regdata[i-1];
|
|
|
- }
|
|
|
-
|
|
|
- gTxCount = DL_I2C_fillControllerTXFIFO(I2C_0_INST, &gTxPacket[0], gTxLen);
|
|
|
-
|
|
|
- if (gTxCount < gTxLen)
|
|
|
- {
|
|
|
- DL_I2C_enableInterrupt(I2C_0_INST, DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- DL_I2C_disableInterrupt(I2C_0_INST, DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER);
|
|
|
- }
|
|
|
-
|
|
|
- gI2cControllerStatus = I2C_STATUS_TX_STARTED;
|
|
|
- while (!(DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE));
|
|
|
- DL_I2C_startControllerTransfer(I2C_0_INST, addr, 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));
|
|
|
- delay_cycles(1000);
|
|
|
-
|
|
|
- return 0;
|
|
|
+ I2C_Start();
|
|
|
+ I2C_SendByte(TMAG5273A1_ADDRESS << 1); // Device Addr + Write (operation)
|
|
|
+ I2C_SendByte(RAddr);
|
|
|
+ I2C_SendByte(WData);
|
|
|
+ I2C_Stop();
|
|
|
}
|
|
|
|
|
|
-char TMAG5273_ReadData(UBYTE addr, UBYTE regaddr, UBYTE num, UBYTE* Read)
|
|
|
+void TMAG5273_ReadData(UBYTE RAddr, UBYTE Num, UBYTE *RData)
|
|
|
{
|
|
|
- UBYTE data[2], i;
|
|
|
- data[0] = regaddr;
|
|
|
-
|
|
|
- gI2cControllerStatus = I2C_STATUS_IDLE;
|
|
|
- DL_I2C_fillControllerTXFIFO(I2C_0_INST, &data[0], 1);
|
|
|
- DL_I2C_disableInterrupt(I2C_0_INST, DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER);
|
|
|
- gI2cControllerStatus = I2C_STATUS_TX_STARTED;
|
|
|
- while (!(DL_I2C_getControllerStatus(I2C_0_INST) & DL_I2C_CONTROLLER_STATUS_IDLE));
|
|
|
- DL_I2C_startControllerTransfer(I2C_0_INST, addr, DL_I2C_CONTROLLER_DIRECTION_TX, 1);
|
|
|
- while ((gI2cControllerStatus != I2C_STATUS_TX_COMPLETE) && (gI2cControllerStatus != I2C_STATUS_ERROR))
|
|
|
+ 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++)
|
|
|
{
|
|
|
- __WFE();
|
|
|
+ *(RData + i) = I2C_RecvByte();
|
|
|
}
|
|
|
- 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));
|
|
|
- // delay_cycles(1000);
|
|
|
|
|
|
- gRxLen = num;
|
|
|
- gRxCount = 0;
|
|
|
- gI2cControllerStatus = I2C_STATUS_RX_STARTED;
|
|
|
- DL_I2C_startControllerTransfer(I2C_0_INST, addr, 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<num; i++)
|
|
|
- {
|
|
|
- Read[i] = gRxPacket[i];
|
|
|
- }
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
-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:
|
|
|
- DL_I2C_disableInterrupt(
|
|
|
- I2C_0_INST, DL_I2C_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER);
|
|
|
- gI2cControllerStatus = I2C_STATUS_TX_COMPLETE;
|
|
|
- break;
|
|
|
- case DL_I2C_IIDX_CONTROLLER_RXFIFO_TRIGGER:
|
|
|
- gI2cControllerStatus = I2C_STATUS_RX_INPROGRESS;
|
|
|
- /* Receive all bytes from target */
|
|
|
- while (DL_I2C_isControllerRXFIFOEmpty(I2C_0_INST) != true) {
|
|
|
- if (gRxCount < gRxLen) {
|
|
|
- gRxPacket[gRxCount++] =
|
|
|
- DL_I2C_receiveControllerData(I2C_0_INST);
|
|
|
- } else {
|
|
|
- /* Ignore and remove from FIFO if the buffer is full */
|
|
|
- DL_I2C_receiveControllerData(I2C_0_INST);
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- case DL_I2C_IIDX_CONTROLLER_TXFIFO_TRIGGER:
|
|
|
- gI2cControllerStatus = I2C_STATUS_TX_INPROGRESS;
|
|
|
- /* Fill TX FIFO with next bytes to send */
|
|
|
- if (gTxCount < gTxLen) {
|
|
|
- gTxCount += DL_I2C_fillControllerTXFIFO(
|
|
|
- I2C_0_INST, &gTxPacket[gTxCount], gTxLen - gTxCount);
|
|
|
- }
|
|
|
- break;
|
|
|
- /* Not used for this example */
|
|
|
- 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;
|
|
|
- }
|
|
|
- case DL_I2C_IIDX_CONTROLLER_RXFIFO_FULL:
|
|
|
- case DL_I2C_IIDX_CONTROLLER_TXFIFO_EMPTY:
|
|
|
- case DL_I2C_IIDX_CONTROLLER_START:
|
|
|
- case DL_I2C_IIDX_CONTROLLER_STOP:
|
|
|
- case DL_I2C_IIDX_CONTROLLER_EVENT1_DMA_DONE:
|
|
|
- case DL_I2C_IIDX_CONTROLLER_EVENT2_DMA_DONE:
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
+ I2C_Stop();
|
|
|
}
|
|
|
|
|
|
UBYTE tmag5273_GetDevID(void)
|
|
|
{
|
|
|
UBYTE Result;
|
|
|
|
|
|
- TMAG5273_ReadData(TMAG5273A1_ADDRESS, DEVICE_ID, 1, &Result);
|
|
|
+ TMAG5273_ReadData(DEVICE_ID, 1, &Result);
|
|
|
return Result;
|
|
|
}
|
|
|
|
|
@@ -199,26 +79,27 @@ UWORD tmag5273_GetMANUFACTURER_ID(void)
|
|
|
UWORD Result;
|
|
|
UBYTE Rs1, Rs2;
|
|
|
|
|
|
- TMAG5273_ReadData(TMAG5273A1_ADDRESS, MANUFACTURER_ID_LSB, 1, &Rs1);
|
|
|
- TMAG5273_ReadData(TMAG5273A1_ADDRESS, MANUFACTURER_ID_MSB, 1, &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[2];
|
|
|
-
|
|
|
- tmp[0] = 0x00;
|
|
|
- TMAG5273_WriteReg(TMAG5273A1_ADDRESS, DEVICE_CONFIG_1, 1, tmp);
|
|
|
- tmp[0] = 0x02;
|
|
|
- TMAG5273_WriteReg(TMAG5273A1_ADDRESS, DEVICE_CONFIG_2, 1, tmp);
|
|
|
- tmp[0] = 0x7C;
|
|
|
- TMAG5273_WriteReg(TMAG5273A1_ADDRESS, SENSOR_CONFIG_1, 1, tmp);
|
|
|
- tmp[0] = 0x04;
|
|
|
- TMAG5273_WriteReg(TMAG5273A1_ADDRESS, SENSOR_CONFIG_2, 1, tmp);
|
|
|
- tmp[0] = 0x01;
|
|
|
- TMAG5273_WriteReg(TMAG5273A1_ADDRESS, T_CONFIG, 1, tmp);
|
|
|
+ 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 = 0x04;
|
|
|
+ TMAG5273_WriteReg(SENSOR_CONFIG_2, tmp);
|
|
|
+ tmp = 0x01;
|
|
|
+ TMAG5273_WriteReg(T_CONFIG, tmp);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -229,7 +110,7 @@ SLONG tmag5273_GetXData(void) //uT
|
|
|
UWORD xData = 0;
|
|
|
SLONG Out = 0;
|
|
|
|
|
|
- TMAG5273_ReadData(TMAG5273A1_ADDRESS, X_MSB_RESULT, 2, xMLSB);
|
|
|
+ TMAG5273_ReadData(X_MSB_RESULT, 2, xMLSB);
|
|
|
|
|
|
xData = xMLSB[1] + (xMLSB[0] << 8);
|
|
|
if(xData & 0x8000)
|
|
@@ -246,7 +127,7 @@ SLONG tmag5273_GetYData(void) //uT
|
|
|
SWORD yData = 0;
|
|
|
SLONG Out = 0;
|
|
|
|
|
|
- TMAG5273_ReadData(TMAG5273A1_ADDRESS, Y_MSB_RESULT, 2, yMLSB);
|
|
|
+ TMAG5273_ReadData(Y_MSB_RESULT, 2, yMLSB);
|
|
|
|
|
|
yData = yMLSB[1] + (yMLSB[0] << 8);
|
|
|
if(yData & 0x8000)
|
|
@@ -263,7 +144,7 @@ SLONG tmag5273_GetZData(void) //uT
|
|
|
SWORD zData = 0;
|
|
|
SLONG Out = 0;
|
|
|
|
|
|
- TMAG5273_ReadData(TMAG5273A1_ADDRESS, Z_MSB_RESULT, 2, zMLSB);
|
|
|
+ TMAG5273_ReadData(Z_MSB_RESULT, 2, zMLSB);
|
|
|
|
|
|
zData = zMLSB[1] + (zMLSB[0] << 8);
|
|
|
if(zData & 0x8000)
|
|
@@ -280,7 +161,7 @@ SWORD tmag5273_GetTemp(void) //0.01℃
|
|
|
UWORD tData = 0;
|
|
|
SWORD Result;
|
|
|
|
|
|
- TMAG5273_ReadData(TMAG5273A1_ADDRESS, T_MSB_RESULT, 2, tMLSB);
|
|
|
+ TMAG5273_ReadData(T_MSB_RESULT, 2, tMLSB);
|
|
|
|
|
|
tData = tMLSB[1] + (tMLSB[0] << 8);
|
|
|
Result = 2500 + (((tData - 17508) * 213) >> 7); //100 * 60.1 * 128
|
|
@@ -288,14 +169,22 @@ SWORD tmag5273_GetTemp(void) //0.01℃
|
|
|
return Result;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-UWORD tmag5273_GetAngle(void) //x16
|
|
|
+#define ZeroOffset 1469
|
|
|
+UWORD tmag5273_GetAngle(void) //Q15
|
|
|
{
|
|
|
UBYTE agMLSB[2] = {0, 0};
|
|
|
UWORD Result;
|
|
|
|
|
|
- TMAG5273_ReadData(TMAG5273A1_ADDRESS, ANGLE_RESULT_MSB, 2, agMLSB);
|
|
|
- Result = agMLSB[1] + (agMLSB[0] << 8);
|
|
|
+ TMAG5273_ReadData(ANGLE_RESULT_MSB, 2, agMLSB);
|
|
|
+ Result = 32767 - (((agMLSB[1] + (agMLSB[0] << 8)) * 728) >> 7);
|
|
|
+
|
|
|
+ if(Result < 1469)
|
|
|
+ {
|
|
|
+ return (Result + 32767 - 1469);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return (Result - 1469);
|
|
|
+ }
|
|
|
|
|
|
- return Result;
|
|
|
}
|