summaryrefslogtreecommitdiff
path: root/firmware/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/drivers')
-rw-r--r--firmware/drivers/adc-as3514.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/firmware/drivers/adc-as3514.c b/firmware/drivers/adc-as3514.c
index 3b411a3..9a81a52 100644
--- a/firmware/drivers/adc-as3514.c
+++ b/firmware/drivers/adc-as3514.c
@@ -26,18 +26,35 @@
/* Read 10-bit channel data */
unsigned short adc_read(int channel)
{
- unsigned char buf[2];
+ unsigned short data = 0;
+
+ if ((unsigned)channel >= NUM_ADC_CHANNELS)
+ return 0;
ascodec_lock();
/* Select channel */
ascodec_write(AS3514_ADC_0, (channel << 4));
+ /*
+ * The AS3514 ADC will trigger an interrupt when the conversion
+ * is finished, if the corresponding enable bit in IRQ_ENRD2
+ * is set.
+ * Previously the code did not wait and this apparently did
+ * not pose any problems, but this should be more correct.
+ * Without the wait the data read back may be completely or
+ * partially (first one of the two bytes) stale.
+ */
+ ascodec_wait_adc_finished();
+
+ /* Read data */
+ unsigned char buf[2] = { 0, 0 };
ascodec_readbytes(AS3514_ADC_0, 2, buf);
+ data = (((buf[0] & 0x3) << 8) | buf[1]);
ascodec_unlock();
- return (((buf[0] & 0x3) << 8) | buf[1]);
+ return data;
}
void adc_init(void)