Chip_ADC_Init(LPC_ADC1, ADC_SEQA_IDX);
Chip_ADC_SetClockRate(LPC_ADC1, ADC_MAX_SAMPLE_RATE);
Chip_ADC_SetupSequencer(LPC_ADC1, ADC_SEQA_IDX,
(ADC_SEQ_CTRL_CHANSEL(0) | // AD1[0] P1.1 = Batt 1 current
ADC_SEQ_CTRL_CHANSEL(9) | // AD1[9] P0.16 = Batt 2 current
ADC_SEQ_CTRL_CHANSEL(8) | // AD1[8] P0.15 = VBUS sense
ADC_SEQ_CTRL_CHANSEL(4) | // AD1[4] P1.2 = Batt 1 voltage
ADC_SEQ_CTRL_CHANSEL(5) | // AD1[5] P1.3 = Batt 2 voltage
ADC_SEQ_CTRL_MODE_EOS)); // We want interrupt on end of sequence
Chip_ADC_SetTrim(LPC_ADC1, ADC_TRIM_VRANGE_HIGHV);
// Disables pullups/pulldowns and disable digital mode
Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 1, IOCON_MODE_INACT);
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 16, IOCON_MODE_INACT);
Chip_IOCON_PinMuxSet(LPC_IOCON, 0, 15, IOCON_MODE_INACT);
Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 2, IOCON_MODE_INACT);
Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 3, IOCON_MODE_INACT);
// Assign AD channels to their pins via SWM (fixed pins)
Chip_SWM_EnableFixedPin(SWM_FIXED_ADC1_0); // P1.1
Chip_SWM_EnableFixedPin(SWM_FIXED_ADC1_9); // P0.16
Chip_SWM_EnableFixedPin(SWM_FIXED_ADC1_8); // P0.15
Chip_SWM_EnableFixedPin(SWM_FIXED_ADC1_4); // P1.2
Chip_SWM_EnableFixedPin(SWM_FIXED_ADC1_5); // P1.3
// Start calibration
Chip_ADC_StartCalibration(LPC_ADC1);
while (!(Chip_ADC_IsCalibrationDone(LPC_ADC1))) OS_WAIT(10);
// Clear any pending interrupts
Chip_ADC_ClearFlags(LPC_ADC1, Chip_ADC_GetFlags(LPC_ADC1));
// Enable sequence A completion
Chip_ADC_EnableInt(LPC_ADC1, ADC_INTEN_SEQA_ENABLE);
NVIC_EnableIRQ(ADC1_SEQA_IRQn);
// Enable sequence A, will be started by thAD thread
Chip_ADC_EnableSequencer(LPC_ADC1, ADC_SEQA_IDX);
|