diff options
Diffstat (limited to 'firmware/drivers')
| -rw-r--r-- | firmware/drivers/adc-as3514.c | 21 |
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) |