فهرست منبع

硬件I2C,无中断,tbc中运行正常,tbc中运行前需要完成tmag5273的初始化。

dd 1 هفته پیش
والد
کامیت
07b4547f09
4فایلهای تغییر یافته به همراه59 افزوده شده و 52 حذف شده
  1. 8 8
      1.FrameLayer/Source/main.c
  2. 3 1
      1.FrameLayer/Source/tbc.c
  3. 35 30
      3.BasicFunction/Source/tmag5273.c
  4. 13 13
      ti_msp_dl_config.c

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

@@ -158,8 +158,8 @@ int  main(void)
     SYSCFG_DL_PWM_0_COPY_init();
     Reset_POWER_LOCK_PORT();
 
-    NVIC_EnableIRQ(I2C_0_INST_INT_IRQN);
-
+//    NVIC_EnableIRQ(I2C_0_INST_INT_IRQN);
+    tmag5273_Init();
     //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);
@@ -265,7 +265,7 @@ int  main(void)
 //    delay_cycles(DELAY);
 //    delay_cycles(DELAY);
 
-    tmag5273_Init();
+//    tmag5273_Init();
     /* Enter infinite loop */
 #if(JSCOPE_EN!=0)
      Jscope_Init();
@@ -285,13 +285,13 @@ int  main(void)
           AppLoop();
 //          PROFILER_BG();
           ACnt++;
-          Tempe = tmag5273_GetTemp();
+//          Tempe = tmag5273_GetTemp();
           DL_GPIO_setPins(GPIO_B_LED_PORT, GPIO_B_LED_PIN_LED_B_EN_PIN);
-          Angle = tmag5273_GetAngle();
+//          Angle = tmag5273_GetAngle();
           DL_GPIO_clearPins(GPIO_B_LED_PORT, GPIO_B_LED_PIN_LED_B_EN_PIN);
-          MagX = tmag5273_GetXData();
-          MagY = tmag5273_GetYData();
-          MagZ = tmag5273_GetZData();
+//          MagX = tmag5273_GetXData();
+//          MagY = tmag5273_GetYData();
+//          MagZ = tmag5273_GetZData();
 
 //           delay_cycles(DELAY);
 //           DL_TimerA_setCaptureCompareValue(MOTOR_PWM_INST, 1875, DL_TIMER_CC_0_INDEX);

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

@@ -52,6 +52,7 @@ extern ExtU_LoadObsTheta_T LoadObsTheta_U;
  Reference: N/A
 ****************************************************************/
 UWORD tst_CadIO = 0;
+UWORD Angle1 = 0;
 void tbc_voUpIsr(void)
 {
 //    PROFILER_START(1);
@@ -88,7 +89,8 @@ void tbc_voUpIsr(void)
 //     }
 
 
-    switchhall_voPosCalTbc(); //角度获取
+//    switchhall_voPosCalTbc(); //角度获取
+    Angle1 = tmag5273_GetAngle();
     /* Full Order Observer */
 //      LoadObsTheta_U.IqFbkPu = scm_swIqFdbLpfPu;
 //      LoadObsTheta_U.ThetamPu = switchhall_stOut.uwLowThetaPu;

+ 35 - 30
3.BasicFunction/Source/tmag5273.c

@@ -60,7 +60,7 @@ char TMAG5273_WriteReg(UBYTE addr, UBYTE regaddr, UBYTE num, UBYTE *regdata)
 {
     UWORD i;
 
-    gI2cControllerStatus = I2C_STATUS_IDLE;
+//    gI2cControllerStatus = I2C_STATUS_IDLE;
     gTxLen = num+1;
 
     gTxPacket[0] = regaddr;
@@ -70,28 +70,30 @@ char TMAG5273_WriteReg(UBYTE addr, UBYTE regaddr, UBYTE num, UBYTE *regdata)
     }
 
     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;
+//
+//    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 ((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));
+
+    DL_I2C_flushControllerTXFIFO(I2C_0_INST);
     delay_cycles(1000);
 
     return 0;
@@ -102,34 +104,37 @@ char TMAG5273_ReadData(UBYTE addr, UBYTE regaddr, UBYTE num, UBYTE* Read)
     UBYTE data[2], i;
     data[0] = regaddr;
 
-    gI2cControllerStatus = I2C_STATUS_IDLE;
+//    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;
+//    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))
-    {
-        __WFE();
-    }
+//    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);
+    DL_I2C_flushControllerTXFIFO(I2C_0_INST);
 
     gRxLen = num;
     gRxCount = 0;
-    gI2cControllerStatus = I2C_STATUS_RX_STARTED;
+//    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);
+//    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];
+        while (DL_I2C_isControllerRXFIFOEmpty(I2C_0_INST));
+//        Read[i] = gRxPacket[i];
+        Read[i] = DL_I2C_receiveControllerData(I2C_0_INST);
     }
 
     return 0;

+ 13 - 13
ti_msp_dl_config.c

@@ -296,26 +296,26 @@ 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);
+//    DL_I2C_setAnalogGlitchFilterPulseWidth(I2C_0_INST,
+//        DL_I2C_ANALOG_GLITCH_FILTER_WIDTH_50NS);
+    DL_I2C_disableAnalogGlitchFilter(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_EMPTY);
+    /* Set frequency to 800000 Hz*/
+    DL_I2C_setTimerPeriod(I2C_0_INST, 3);
+    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_NACK |
-                           DL_I2C_INTERRUPT_CONTROLLER_RXFIFO_TRIGGER |
-                           DL_I2C_INTERRUPT_CONTROLLER_RX_DONE |
-                           DL_I2C_INTERRUPT_CONTROLLER_TX_DONE);
-    NVIC_SetPriority(I2C_0_INST_INT_IRQN, 0);
+//    DL_I2C_enableInterrupt(I2C_0_INST,
+//                           DL_I2C_INTERRUPT_CONTROLLER_ARBITRATION_LOST |
+//                           DL_I2C_INTERRUPT_CONTROLLER_NACK |
+//                           DL_I2C_INTERRUPT_CONTROLLER_RXFIFO_TRIGGER |
+//                           DL_I2C_INTERRUPT_CONTROLLER_RX_DONE |
+//                           DL_I2C_INTERRUPT_CONTROLLER_TX_DONE);
+//    NVIC_SetPriority(I2C_0_INST_INT_IRQN, 0);
     /* Enable module */
     DL_I2C_enableController(I2C_0_INST);