Эх сурвалжийг харах

On Branch_OBS_Debug_XiaoXingHua: IIC_DMA调试

dd 1 долоо хоног өмнө
parent
commit
59d5cba836

+ 3 - 1
1.FrameLayer/Source/main.c

@@ -153,6 +153,8 @@ int  main(void)
     SYSCFG_DL_PWM_0_COPY_init();
     Reset_POWER_LOCK_PORT();
 
+    NVIC_EnableIRQ(I2C_0_INST_INT_IRQN);
+
     //TIMA0  MOTOR_PWM
     DL_Timer_setCaptCompUpdateMethod(MOTOR_PWM_INST,DL_TIMER_CC_UPDATE_METHOD_ZERO_EVT,DL_TIMERA_CAPTURE_COMPARE_0_INDEX);
     DL_Timer_setCaptCompUpdateMethod(MOTOR_PWM_INST,DL_TIMER_CC_UPDATE_METHOD_ZERO_EVT,DL_TIMERA_CAPTURE_COMPARE_1_INDEX);
@@ -280,7 +282,7 @@ int  main(void)
           ACnt++;
 //          Tempe = tmag5273_GetTemp();
 //          DL_GPIO_setPins(GPIO_B_LED_PORT, GPIO_B_LED_PIN_LED_B_EN_PIN);
-//          Tmag5273_out.Angle = tmag5273_GetAngle();
+          Tmag5273_out.Angle = tmag5273_GetAngle();
 //          Tmag5273_out.MagX = tmag5273_GetXData();
 //          Tmag5273_out.MagY = tmag5273_GetYData();
 //          Tmag5273_out.MagZ = tmag5273_GetZData();

+ 1 - 1
1.FrameLayer/Source/tbc.c

@@ -94,7 +94,7 @@ void tbc_voUpIsr(void)
 //      LoadObsTheta_U.IqFbkPu = scm_swIqFdbLpfPu;
 //      LoadObsTheta_U.ThetamPu = switchhall_stOut.uwLowThetaPu;
 //      LoadObsTheta_step();
-    Tmag5273_out.Angle = tmag5273_GetAngle();
+//    Tmag5273_out.Angle = tmag5273_GetAngle();
     /* Full Order Observer: Hall Angle Filter */
     rtU.AngleIn = switchhall_stOut.uwLowThetaPu;
     Trigger();

+ 150 - 32
3.BasicFunction/Source/tmag5273.c

@@ -6,7 +6,7 @@
  */
 
 #include "tmag5273.h"
-#include "i2c_analog.h"
+#include <ti/driverlib/dl_i2c.h>
 #include "ti_msp_dl_config.h"
 
 #define TMAG5273A1_ADDRESS             0x35
@@ -43,29 +43,148 @@
 
 TMAG5273_OUT Tmag5273_out;
 
-void TMAG5273_WriteReg(UBYTE RAddr, UBYTE WData)
+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)
 {
-    I2C_Start();
-    I2C_SendByte(TMAG5273A1_ADDRESS << 1);     // Device Addr + Write (operation)
-    I2C_SendByte(RAddr);
-    I2C_SendByte(WData);
-    I2C_Stop();
+    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 */
+            /* Do nothing here */
+            break;
+        case DL_I2C_IIDX_CONTROLLER_EVENT2_DMA_DONE:
+            /* I2C DMA Done on RX */
+            /* Do nothing here */
+            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);
+
+    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));
+    delay_cycles(1000);
 }
 
-void TMAG5273_ReadData(UBYTE RAddr, UBYTE Num, UBYTE *RData)
+void TMAG5273_ReadData(UBYTE regaddr, UBYTE num, UBYTE* Read)
 {
-    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++)
+    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);
+
+    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))
     {
-        *(RData + i) = I2C_RecvByte();
+        __WFE();
     }
 
-    I2C_Stop();
+    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;
+    gI2cControllerStatus = I2C_STATUS_RX_STARTED;
+
+    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);
+
+    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<num; i++)
+    {
+        Read[i] = gRxPacket[i];
+    }
 }
 
 UBYTE tmag5273_GetDevID(void)
@@ -89,21 +208,20 @@ UWORD tmag5273_GetMANUFACTURER_ID(void)
 
 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);
+    UBYTE tmp[2];
+
+    tmp[0] = 0x00;
+    TMAG5273_WriteReg(DEVICE_CONFIG_1, 1, tmp);
+    tmp[0] = 0x02;
+    TMAG5273_WriteReg(DEVICE_CONFIG_2, 1, tmp);
+    tmp[0] = 0x7C;
+    TMAG5273_WriteReg(SENSOR_CONFIG_1, 1, tmp);
+    tmp[0] = 0x14; //Ax < Ay
+    TMAG5273_WriteReg(SENSOR_CONFIG_2, 1, tmp);
+    tmp[0] = 196;  //Ax = 20.623mT, Ay = 26.873mT, Ax / Ay * 256
+    TMAG5273_WriteReg(MAG_GAIN_CONFIG, 1, tmp);
+    tmp[0] = 0x01;
+    TMAG5273_WriteReg(T_CONFIG, 1, tmp);
 
     return 0;
 }

+ 93 - 3
ti_msp_dl_config.c

@@ -58,6 +58,8 @@ SYSCONFIG_WEAK void SYSCFG_DL_init(void)
     SYSCFG_DL_DEBUG_init();
 #endif
     SYSCFG_DL_SYSCTL_init();
+    SYSCFG_DL_I2C_0_init();
+    SYSCFG_DL_DMA_init();
     SYSCFG_DL_MOTOR_PWM_init();
     SYSCFG_DL_PWM_F_init();
     SYSCFG_DL_HALLTIMER_init();
@@ -75,9 +77,6 @@ SYSCONFIG_WEAK void SYSCFG_DL_init(void)
 	gMOTOR_PWMBackup.backupRdy 	= false;
 	gPWM_FBackup.backupRdy 	= false;
 	gHALLTIMERBackup.backupRdy 	= false;
-
-
-
 }
 /*
  * User should take care to save and restore register configuration in application.
@@ -110,6 +109,7 @@ SYSCONFIG_WEAK void SYSCFG_DL_initPower(void)
 {
     DL_GPIO_reset(GPIOA);
     DL_GPIO_reset(GPIOB);
+    DL_I2C_reset(I2C_0_INST);
     DL_TimerA_reset(MOTOR_PWM_INST);
     DL_TimerG_reset(PWM_F_INST);
     DL_TimerG_reset(HALLTIMER_INST);
@@ -127,6 +127,7 @@ SYSCONFIG_WEAK void SYSCFG_DL_initPower(void)
 
     DL_GPIO_enablePower(GPIOA);
     DL_GPIO_enablePower(GPIOB);
+    DL_I2C_enablePower(I2C_0_INST);
     DL_TimerA_enablePower(MOTOR_PWM_INST);
     DL_TimerG_enablePower(PWM_F_INST);
     DL_TimerG_enablePower(HALLTIMER_INST);
@@ -150,6 +151,17 @@ SYSCONFIG_WEAK void SYSCFG_DL_GPIO_init(void)
     DL_GPIO_initPeripheralAnalogFunction(GPIO_HFXIN_IOMUX);
     DL_GPIO_initPeripheralAnalogFunction(GPIO_HFXOUT_IOMUX);
 
+    DL_GPIO_initPeripheralInputFunctionFeatures(
+         GPIO_I2C_0_IOMUX_SDA, GPIO_I2C_0_IOMUX_SDA_FUNC,
+         DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
+         DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);
+    DL_GPIO_initPeripheralInputFunctionFeatures(
+         GPIO_I2C_0_IOMUX_SCL, GPIO_I2C_0_IOMUX_SCL_FUNC,
+         DL_GPIO_INVERSION_DISABLE, DL_GPIO_RESISTOR_PULL_UP,
+         DL_GPIO_HYSTERESIS_DISABLE, DL_GPIO_WAKEUP_DISABLE);
+    DL_GPIO_enableHiZ(GPIO_I2C_0_IOMUX_SDA);
+    DL_GPIO_enableHiZ(GPIO_I2C_0_IOMUX_SCL);
+
     DL_GPIO_initPeripheralOutputFunction(GPIO_MOTOR_PWM_C0_IOMUX,GPIO_MOTOR_PWM_C0_IOMUX_FUNC);
     DL_GPIO_enableOutput(GPIO_MOTOR_PWM_C0_PORT, GPIO_MOTOR_PWM_C0_PIN);
     DL_GPIO_initPeripheralOutputFunction(GPIO_MOTOR_PWM_C0_CMPL_IOMUX,GPIO_MOTOR_PWM_C0_CMPL_IOMUX_FUNC);
@@ -273,6 +285,84 @@ SYSCONFIG_WEAK void SYSCFG_DL_SYSCTL_init(void)
 
 }
 
+static const DL_I2C_ClockConfig gI2C_0ClockConfig = {
+    .clockSel = DL_I2C_CLOCK_BUSCLK,
+    .divideRatio = DL_I2C_CLOCK_DIVIDE_1,
+};
+
+SYSCONFIG_WEAK void SYSCFG_DL_I2C_0_init(void) {
+
+    DL_I2C_setClockConfig(I2C_0_INST,
+        (DL_I2C_ClockConfig *) &gI2C_0ClockConfig);
+    DL_I2C_setAnalogGlitchFilterPulseWidth(I2C_0_INST,
+        DL_I2C_ANALOG_GLITCH_FILTER_WIDTH_50NS);
+    DL_I2C_enableAnalogGlitchFilter(I2C_0_INST);
+
+    /* Configure Controller Mode */
+    DL_I2C_resetControllerTransfer(I2C_0_INST);
+    /* Set frequency to 400000 Hz*/
+    DL_I2C_setTimerPeriod(I2C_0_INST, 7);
+    DL_I2C_setControllerTXFIFOThreshold(I2C_0_INST, DL_I2C_TX_FIFO_LEVEL_BYTES_1);
+    DL_I2C_setControllerRXFIFOThreshold(I2C_0_INST, DL_I2C_RX_FIFO_LEVEL_BYTES_1);
+    DL_I2C_enableControllerClockStretching(I2C_0_INST);
+
+    /* Configure Interrupts */
+    DL_I2C_enableInterrupt(I2C_0_INST,
+                           DL_I2C_INTERRUPT_CONTROLLER_ARBITRATION_LOST |
+                           DL_I2C_INTERRUPT_CONTROLLER_EVENT1_DMA_DONE |
+                           DL_I2C_INTERRUPT_CONTROLLER_EVENT2_DMA_DONE |
+                           DL_I2C_INTERRUPT_CONTROLLER_NACK |
+                           DL_I2C_INTERRUPT_CONTROLLER_RX_DONE |
+                           DL_I2C_INTERRUPT_CONTROLLER_TX_DONE);
+    NVIC_SetPriority(I2C_0_INST_INT_IRQN, 0);
+
+    /* Configure DMA Event 1 */
+    DL_I2C_enableDMAEvent(I2C_0_INST, DL_I2C_EVENT_ROUTE_1,
+                          DL_I2C_DMA_INTERRUPT_CONTROLLER_TXFIFO_TRIGGER);
+    /* Configure DMA Event 2 */
+    DL_I2C_enableDMAEvent(I2C_0_INST, DL_I2C_EVENT_ROUTE_2,
+                          DL_I2C_DMA_INTERRUPT_CONTROLLER_RXFIFO_TRIGGER);
+
+    /* Enable module */
+    DL_I2C_enableController(I2C_0_INST);
+
+}
+
+static const DL_DMA_Config gDMA_CH0Config = {
+    .transferMode   = DL_DMA_SINGLE_TRANSFER_MODE,
+    .extendedMode   = DL_DMA_NORMAL_MODE,
+    .destIncrement  = DL_DMA_ADDR_UNCHANGED,
+    .srcIncrement   = DL_DMA_ADDR_INCREMENT,
+    .destWidth      = DL_DMA_WIDTH_BYTE,
+    .srcWidth       = DL_DMA_WIDTH_BYTE,
+    .trigger        = I2C_0_INST_DMA_TRIGGER_0,
+    .triggerType    = DL_DMA_TRIGGER_TYPE_EXTERNAL,
+};
+
+SYSCONFIG_WEAK void SYSCFG_DL_DMA_CH0_init(void)
+{
+    DL_DMA_initChannel(DMA, DMA_CH0_CHAN_ID , (DL_DMA_Config *) &gDMA_CH0Config);
+}
+static const DL_DMA_Config gDMA_CH1Config = {
+    .transferMode   = DL_DMA_SINGLE_TRANSFER_MODE,
+    .extendedMode   = DL_DMA_NORMAL_MODE,
+    .destIncrement  = DL_DMA_ADDR_INCREMENT,
+    .srcIncrement   = DL_DMA_ADDR_UNCHANGED,
+    .destWidth      = DL_DMA_WIDTH_BYTE,
+    .srcWidth       = DL_DMA_WIDTH_BYTE,
+    .trigger        = I2C_0_INST_DMA_TRIGGER_1,
+    .triggerType    = DL_DMA_TRIGGER_TYPE_EXTERNAL,
+};
+
+SYSCONFIG_WEAK void SYSCFG_DL_DMA_CH1_init(void)
+{
+    DL_DMA_initChannel(DMA, DMA_CH1_CHAN_ID , (DL_DMA_Config *) &gDMA_CH1Config);
+}
+SYSCONFIG_WEAK void SYSCFG_DL_DMA_init(void){
+    SYSCFG_DL_DMA_CH0_init();
+    SYSCFG_DL_DMA_CH1_init();
+}
+
 /*
  * Timer clock configuration to be sourced by  / 1 (72000000 Hz)
  * timerClkFreq = (timerClkSrc / (timerClkDivRatio * (timerClkPrescale + 1)))

+ 24 - 0
ti_msp_dl_config.h

@@ -78,6 +78,28 @@ extern "C" {
 #define GPIO_HFXOUT_IOMUX                                        (IOMUX_PINCM11)
 #define CPUCLK_FREQ                                                     72000000
 
+/* Defines for I2C_0 */
+#define I2C_0_INST                                                          I2C1
+#define I2C_0_INST_IRQHandler                                    I2C1_IRQHandler
+#define I2C_0_INST_INT_IRQN                                        I2C1_INT_IRQn
+#define I2C_0_BUS_SPEED_HZ                                                400000
+#define GPIO_I2C_0_SDA_PORT                                                GPIOB
+#define GPIO_I2C_0_SDA_PIN                                         DL_GPIO_PIN_3
+#define GPIO_I2C_0_IOMUX_SDA                                      (IOMUX_PINCM16)
+#define GPIO_I2C_0_IOMUX_SDA_FUNC                       IOMUX_PINCM16_PF_I2C1_SDA
+#define GPIO_I2C_0_SCL_PORT                                                GPIOB
+#define GPIO_I2C_0_SCL_PIN                                         DL_GPIO_PIN_2
+#define GPIO_I2C_0_IOMUX_SCL                                      (IOMUX_PINCM15)
+#define GPIO_I2C_0_IOMUX_SCL_FUNC                       IOMUX_PINCM15_PF_I2C1_SCL
+
+/* Defines for DMA_CH0 */
+#define DMA_CH0_CHAN_ID                                                      (1)
+#define I2C_0_INST_DMA_TRIGGER_0                               (DMA_I2C1_TX_TRIG)
+
+/* Defines for DMA_CH1 */
+#define DMA_CH1_CHAN_ID                                                      (0)
+#define I2C_0_INST_DMA_TRIGGER_1                               (DMA_I2C1_RX_TRIG)
+
 /* Defines for MOTOR_PWM */
 #define MOTOR_PWM_INST                                                     TIMA0
 #define MOTOR_PWM_INST_IRQHandler                               TIMA0_IRQHandler
@@ -424,6 +446,8 @@ void SYSCFG_DL_initPower(void);
 void SYSCFG_DL_GPIO_init(void);
 void SYSCFG_DL_DEBUG_init(void);
 void SYSCFG_DL_SYSCTL_init(void);
+void SYSCFG_DL_I2C_0_init(void);
+void SYSCFG_DL_DMA_init(void);
 void SYSCFG_DL_MOTOR_PWM_init(void);
 void SYSCFG_DL_PWM_F_init(void);
 void SYSCFG_DL_HALLTIMER_init(void);