예제 #1
0
/*! \brief  Detect Board Revision
  *
  * @retval Version Number of Board
*/
uint8_t BOARD_Detect_Revision(void)
{
  ADC_Result  result;
  uint16_t    revision_value;
  uint8_t     i;
  
  PGA_SetChannel(SPI_DEVICE_AMP_V_I_DCBUS, CHANNEL1);
  
  ADC_Enable(TSB_ADB);  
  ADC_SetClk(TSB_ADB, ADC_HOLD_FIX, ADC_FC_DIVIDE_LEVEL_2);
  ADC_SetSWTrg(TSB_ADB, ADC_REG2, TRG_ENABLE(ADC_REG2));
  ADC_Start(TSB_ADB, ADC_TRG_SW);
  while (ADC_GetConvertState(TSB_ADB, ADC_TRG_SW) == BUSY);
  result=ADC_GetConvertResult(TSB_ADB, ADC_REG2);
  ADC_Disable(TSB_ADB);  

  PGA_SetChannel(SPI_DEVICE_AMP_V_I_DCBUS, CHANNEL0);
  
  for (i=0;i<sizeof(revisions)/sizeof(revisions[0]);i++)
  {
    revision_value = result.Bit.ADResult*10/gaintable[ChannelValues[1].gain_current_measure];
    if (abs((revisions[i][0]-revision_value)<100))
      break;
  }
  return revisions[i][1];
}
예제 #2
0
void Example_ADC_ReadData(void)
{
    /* 1. set ADC clock */
    ADC_SetClk(TSB_ADB, ADC_HOLD_FIX, ADC_FC_DIVIDE_LEVEL_2);

    /* 2. select trigger and AD channel, this time we use sofeware trigger, */
    /*    the VR1 is connected to  ADC unit B channel 2, remember to input with macro TRG_ENABLE() */
    ADC_SetSWTrg(TSB_ADB, ADC_REG0, TRG_ENABLE(ADC_AIN2));

    /* 3. enable ADC module */
    ADC_Enable(TSB_ADB);

    /* 4. now start ADC */
    ADC_Start(TSB_ADB, ADC_TRG_SW);

    /* initialize LEDs on M374-SK board before display something */
    LED_Init();

    while (1U) {
        /* check ADC module state */
        adcState = ADC_GetConvertState(TSB_ADB, ADC_TRG_SW);

        if (adcState == DONE) {
            /* read ADC result when it is finished */
            result = ADC_GetConvertResult(TSB_ADB, ADC_REG0);

            /* get the real ADC result without other information */
            /* "/16" is to limit the range of AD value */
            myResult = result.Bit.ADResult / 16U;

            /* software trigger, need to trigger it again */
            ADC_Start(TSB_ADB, ADC_TRG_SW);
        }
        myDelay(myResult);  
        if(idx) 
        {
          LED_Off(LEDs[idx-1]);
        }
        idx &= 0x03U;
        myDelay(myResult); 
        LED_On(LEDs[idx]);
        idx++;
    }
}
예제 #3
0
/**
  * @brief  main function to run CAN demo
  * @param  None.
  * @retval result to retun to system.
  */
void CAN_TestLoopBack(void)
{
    CAN_GlobalState globalstate;
    CAN_INTFactor intmask;
    WorkState adc_state = BUSY;
    ADC_ResultTypeDef adc_value;
    CAN_BitTimingTypeDef bittiming =
        { BAUDRATE_PRESCALER, CAN_TIMING_TSEG1_7TQ, CAN_TIMING_TSEG2_4TQ, CAN_SINGLE_SAMPLING,
        CAN_TIMING_SJW_1TQ
    };
    CAN_MsgTypeDef msgtx = { 0U };
    CAN_MsgTypeDef msgrx = { 0U };

    CAN_PortInit();
    ADC_Init();
	
    /* CAN bit timing setting */
    CAN_ConfigBitTiming(&bittiming);

    /* CAN Tx mailbox0 setting */
    msgtx.MsgID = MSG_ID;
    msgtx.MsgDataLen = 1U;      /* data length: 1 byte */
    CAN_SetMbxMsg(CAN_MBX_0, &msgtx);
    CAN_SetMbxDirection(CAN_MBX_0, CAN_MBX_TX); /* mailbox0: Tx */

    /* CAN Rx mailbox10 setting */
    msgrx.MsgID = msgtx.MsgID;  /* ID of mailbox10 = ID of mailbox0 */
    CAN_SetMbxMsg(CAN_MBX_10, &msgrx);
    CAN_SetMbxDirection(CAN_MBX_10, CAN_MBX_RX);        /* mailbox10: Rx */

    CAN_SetTxOrder(CAN_TX_ORDER_MBX_NUM);       /* Tx order: by mailbox number */    

    globalstate.All = 0U;

    /* Enter suspend mode */
    CAN_SetMode(CAN_SUSPEND_MODE);
    while (globalstate.Bit.SuspendModeAck == 0U) {
        globalstate = CAN_GetGlobalState();
    }

    /* Set test loop back mode */
    CAN_SetTestMode(CAN_TEST_LOOP_BACK_MODE, ENABLE);

    /* Return normal mode */
    CAN_SetMode(CAN_NORMAL_MODE);
    while (globalstate.Bit.SuspendModeAck == 1U) {
        globalstate = CAN_GetGlobalState();
    }

    /* Enable mailbox10 Rx interrupt */
    intmask.MbxBit.Mbx10 = 1U;
    CAN_SetINTMask(CAN_INT_MBX_MASK, &intmask);
    NVIC_EnableIRQ(INTCANRX_IRQn);

    /* Enable mailbox0 and 10 */
    CAN_EnableMbx(CAN_MBX_0 | CAN_MBX_10);      
    /* ADC start to run */
    ADC_Start();

    while (1) {
        adc_state = ADC_GetConvertState();
        if (DONE == adc_state) {        /* ADC convertion finished */
            adc_state = BUSY;
            adc_value = ADC_GetConvertResult(ADC_REG_08);
            msgtx.MsgData[0] = (uint8_t) adc_value.ADCResultValue;

            CAN_SetMbxMsg(CAN_MBX_0, &msgtx);   /* Put the ADC result into mailbox0 */
            CAN_SetTxReq(CAN_MBX_0, ENABLE);    /* Start to send */

        } else {
            /* Do nothing */
        }
        delay(50000U);
    }
}