Difference between revisions of "ADC max1027"
m |
m |
||
Line 1: | Line 1: | ||
=Introduction= | =Introduction= | ||
− | The MAX1027 is an 8 channels 10 bits analog-to-digital converter (ADC) with an internal reference and an internal temperature sensor. | + | The MAX1027 is an 8 channels 10 bits analog-to-digital converter (ADC) with an internal reference and an internal temperature sensor. |
− | + | Only 7 channels have to be used (AIN0-AIN6) because AIN7 is configured as "start of conversion". | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
=Driver= | =Driver= | ||
Line 24: | Line 8: | ||
* for slow signals (temperature or battery level monitoring), the driver can be strictly controlled from its ''/sys'' interface: ''/sys/bus/spi/devices/spiN.0/'' (N depending on the number of SPI devices declared for your target). Moreover, if needed (lm-sensors & Co), you can add it a [http://lxr.linux.no/source/Documentation/hwmon/sysfs-interface?v=2.6.18 Linux Hardware Monitoring API (hwmon)] compatible/standardized interface: ''/sys/class/hwmon/hwmonN/device/'' (N depending on the ID given by hwmon). This interface mimics the ''/sys/bus/spi/devices/'' one. | * for slow signals (temperature or battery level monitoring), the driver can be strictly controlled from its ''/sys'' interface: ''/sys/bus/spi/devices/spiN.0/'' (N depending on the number of SPI devices declared for your target). Moreover, if needed (lm-sensors & Co), you can add it a [http://lxr.linux.no/source/Documentation/hwmon/sysfs-interface?v=2.6.18 Linux Hardware Monitoring API (hwmon)] compatible/standardized interface: ''/sys/class/hwmon/hwmonN/device/'' (N depending on the ID given by hwmon). This interface mimics the ''/sys/bus/spi/devices/'' one. | ||
* for "fast" signals, the driver has a ''/dev'' interface which can be configured through ''/sys/bus/spi/devices/spiX.0/''. | * for "fast" signals, the driver has a ''/dev'' interface which can be configured through ''/sys/bus/spi/devices/spiX.0/''. | ||
+ | |||
+ | '''in the following chapters, spiN.0 refers to spi1.0 in case of an APF9328 and to spi0.0 in case of the APF27Dev. | ||
+ | |||
==Installation== | ==Installation== | ||
− | {{Note|Max1027 driver is now by default installed on standard rootfs so following instructions are only given as reference.}} | + | {{Note|Max1027 driver is now by default installed on standard rootfs. so following instructions are only given as reference.}} |
*From the ''armadeus/'' top directory: | *From the ''armadeus/'' top directory: | ||
Line 70: | Line 57: | ||
Several interfaces in ''/sys/bus/spi/devices/spi...'' are created in order to: | Several interfaces in ''/sys/bus/spi/devices/spi...'' are created in order to: | ||
− | * read the | + | * read the 7 analog inputs values: ''inx_input'' (in mV) |
* read the temperature: ''temp1_input'' (in m°C) | * read the temperature: ''temp1_input'' (in m°C) | ||
* modify the max1027 registers: ''conversion, setup & averaging'' | * modify the max1027 registers: ''conversion, setup & averaging'' | ||
− | <pre class="apf"> | + | |
− | # ls /sys/bus/spi/devices/ | + | '''<pre class="apf"> |
+ | # ls /sys/bus/spi/devices/spiN.0/ | ||
averaging driver in2_input in5_input modalias temp1_input | averaging driver in2_input in5_input modalias temp1_input | ||
bus in0_input in3_input in6_input setup uevent | bus in0_input in3_input in6_input setup uevent | ||
Line 82: | Line 70: | ||
An input can be read like that: | An input can be read like that: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # cat /sys/bus/spi/devices/ | + | # cat /sys/bus/spi/devices/spiN.0/in0_input (apf9328) |
</pre> | </pre> | ||
The temperature can be read like that: | The temperature can be read like that: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # cat /sys/bus/spi/devices/ | + | # cat /sys/bus/spi/devices/spiN.0/temp1_input |
</pre> | </pre> | ||
Line 93: | Line 81: | ||
Example: | Example: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # let set=0x62; echo $set > /sys/bus/spi/devices/ | + | # let set=0x62; echo $set > /sys/bus/spi/devices/spiN.0/setup |
− | # let conv=0x87; echo $conv > /sys/bus/spi/devices/ | + | # let conv=0x87; echo $conv > /sys/bus/spi/devices/spiN.0/conversion (launch 1 conversion of temp & AN0) |
− | # cat /sys/bus/spi/devices/ | + | # cat /sys/bus/spi/devices/spiN.0/temp1_input |
32750 (m°C) | 32750 (m°C) | ||
− | # cat /sys/bus/spi/devices/ | + | # cat /sys/bus/spi/devices/spiN.0/in0_input |
1135 (mV) | 1135 (mV) | ||
</pre> | </pre> | ||
Line 103: | Line 91: | ||
==="Fast" interface (frequencies > 10Hz)=== | ==="Fast" interface (frequencies > 10Hz)=== | ||
− | |||
In that case you can use /dev interface (using blocking read to wait end of conversion). To create ''/dev'' nodes you can use the ''loadmax.sh'' script located in armadeus/target/linux/modules/max1027. As driver MAJOR number is dynamically allocated, you may need to update ''/dev'' depending on the drivers loaded on you system. | In that case you can use /dev interface (using blocking read to wait end of conversion). To create ''/dev'' nodes you can use the ''loadmax.sh'' script located in armadeus/target/linux/modules/max1027. As driver MAJOR number is dynamically allocated, you may need to update ''/dev'' depending on the drivers loaded on you system. | ||
+ | |||
+ | <pre class="apf"> | ||
+ | # modprobe spi_imx | ||
+ | # modprobe hwmon | ||
+ | # sh loadmax.sh (previously installed) | ||
+ | max1027 v0.3 successfully probed ! | ||
+ | </pre> | ||
+ | |||
* first, the conversion mode has to be chosen (channel 0->6 and temp): | * first, the conversion mode has to be chosen (channel 0->6 and temp): | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # let set=0xb1; echo $set > /sys/bus/spi/devices/ | + | # let set=0xb1; echo $set > /sys/bus/spi/devices/spiN.0/conversion |
</pre> | </pre> | ||
* and eventually the averaging and setup registers as well (refer to the max1027 documentation for more details): | * and eventually the averaging and setup registers as well (refer to the max1027 documentation for more details): | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # let set=0x48; echo $set > /sys/bus/spi/devices/ | + | # let set=0x48; echo $set > /sys/bus/spi/devices/spiN.0/setup |
− | # let set=0x20; echo $set > /sys/bus/spi/devices/ | + | # let set=0x20; echo $set > /sys/bus/spi/devices/spiN.0/averaging |
</pre> | </pre> | ||
* repeatedly read value of analog input 0 (variable sampling rate = depends on system load): | * repeatedly read value of analog input 0 (variable sampling rate = depends on system load): | ||
Line 127: | Line 122: | ||
This mode is activated by default in the Max1027 driver. If you switched to "slow" mode you can activate "fast" mode again with: | This mode is activated by default in the Max1027 driver. If you switched to "slow" mode you can activate "fast" mode again with: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # let set=0x48; echo $set > /sys/bus/spi/devices/ | + | # let set=0x48; echo $set > /sys/bus/spi/devices/spiN.0/setup |
</pre> | </pre> | ||
Line 133: | Line 128: | ||
Independent of the mode, ''/sys'' interfaces allow direct access to the corresponding register in the MAX1027: | Independent of the mode, ''/sys'' interfaces allow direct access to the corresponding register in the MAX1027: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # let conv=0xb1; echo $conv > /sys/bus/spi/devices/ | + | # let conv=0xb1; echo $conv > /sys/bus/spi/devices/spiN.0/conversion |
</pre> | </pre> | ||
You can also get current (hexadecimal) values of conversion, averaging and setup registers with (for example): | You can also get current (hexadecimal) values of conversion, averaging and setup registers with (for example): | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # cat /sys/bus/spi/devices/ | + | # cat /sys/bus/spi/devices/spiN.0/setup |
0x62 | 0x62 | ||
</pre> | </pre> | ||
Line 147: | Line 142: | ||
* Get channel 0 and temperature values: | * Get channel 0 and temperature values: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # let conv=0x87; echo $conv > /sys/bus/spi/devices/ | + | # let conv=0x87; echo $conv > /sys/bus/spi/devices/spiN.0/conversion |
# cat /sys/class/hwmon/hwmon0/device/temp1_input | # cat /sys/class/hwmon/hwmon0/device/temp1_input | ||
# cat /sys/class/hwmon/hwmon0/device/in0_input | # cat /sys/class/hwmon/hwmon0/device/in0_input | ||
Line 154: | Line 149: | ||
* Get channels [0-6] and temperature values: | * Get channels [0-6] and temperature values: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # let conv=0xb1; echo $conv > /sys/bus/spi/devices/ | + | # let conv=0xb1; echo $conv > /sys/bus/spi/devices/spiN.0/conversion |
</pre> | </pre> | ||
* Get 4 average values (of 32 conversions) for channel 0: | * Get 4 average values (of 32 conversions) for channel 0: | ||
<pre class="apf"> | <pre class="apf"> | ||
− | # let avg=0x3c; echo $avg > /sys/bus/spi/devices/ | + | # let avg=0x3c; echo $avg > /sys/bus/spi/devices/spiN.0/averaging |
− | # let conv=0x84; echo $conv > /sys/bus/spi/devices/ | + | # let conv=0x84; echo $conv > /sys/bus/spi/devices/spiN.0/conversion |
</pre> | </pre> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | =MAX1027 on APF27Dev board= | ||
+ | The MAX1027 is optionnaly mounted on the APF27Dev board. It is ready to use and the ADC inputs can be accessed through J6 | ||
+ | |||
+ | |||
+ | =MAX1027 on APF9328 board= | ||
+ | It is mounted (in option) on the [[APF9328]] boards.''' To know if you have one on your board, take a look at the connectors side:''' | ||
+ | [[image:APF9328_with_MAX1027.jpg|center|frame|'''figure 1''' - ''MAX1027 localisation'']] | ||
+ | |||
+ | If you don't have one and are a good electrician, you can order a sample at [http://www.maxim-ic.com Maxim's website] and solder it directly on your board (footprint is available). | ||
+ | |||
+ | ==Hardware interface== | ||
+ | {{Warning|The 8 inputs voltage range is [0 - 3,3V]. Don't try to put higher voltage on ADC inputs.}} | ||
+ | By default internal reference voltage is used ('''2,5V'''), so if you apply analog values > 2,5V, they will be truncated. | ||
+ | The i.MXL SPI_1 interface is used to communicate with the device. | ||
+ | |||
+ | [[image:MAX1027_connections.png|center|frame|'''figure 2''' - ''MAX1027 connections'']] | ||
+ | |||
+ | If you want to use the MAX1027 then you will have to connect #EOC pin (End Of Conversion) and #CNVST pin (conversion start) to two i.MXL GPIOs. By default the driver is using: | ||
+ | * PA13 (CSI_HSYNC) for #EOC | ||
+ | * and PA14 (CSI_PIXCLK) for #CNVST | ||
+ | So for example on the [[APF9328DevFull]] board you will have to connect: | ||
+ | * pin 11 of ADC connector (right of the Ethernet one) to pin 12 of CSI connector (below RS232 one) | ||
+ | * and pin 10 of the ADC connector to pin 14 of the CSI connector | ||
+ | |||
=Links= | =Links= |
Revision as of 14:12, 23 February 2009
Contents
Introduction
The MAX1027 is an 8 channels 10 bits analog-to-digital converter (ADC) with an internal reference and an internal temperature sensor. Only 7 channels have to be used (AIN0-AIN6) because AIN7 is configured as "start of conversion".
Driver
Depending on your needs (ie sampling slow or fast signals) there are 2 ways to use the max1027 Linux driver:
- for slow signals (temperature or battery level monitoring), the driver can be strictly controlled from its /sys interface: /sys/bus/spi/devices/spiN.0/ (N depending on the number of SPI devices declared for your target). Moreover, if needed (lm-sensors & Co), you can add it a Linux Hardware Monitoring API (hwmon) compatible/standardized interface: /sys/class/hwmon/hwmonN/device/ (N depending on the ID given by hwmon). This interface mimics the /sys/bus/spi/devices/ one.
- for "fast" signals, the driver has a /dev interface which can be configured through /sys/bus/spi/devices/spiX.0/.
in the following chapters, spiN.0 refers to spi1.0 in case of an APF9328 and to spi0.0 in case of the APF27Dev.
Installation
Note: Max1027 driver is now by default installed on standard rootfs. so following instructions are only given as reference. |
- From the armadeus/ top directory:
$ make linux26-menuconfig
- Then select in
Device Drivers ---> [*] SPI support ---> <M> Freescale iMX SPI controller
- If you want to have the hwmon compatible interface, select in
Device Drivers ---> <M> Hardware Monitoring support (Module)
- and then choose MAX1027 driver in
Device Drivers ---> Armadeus specific drivers <M> Armadeus Max1027 ADC driver (fast version)
- Once the new configuration saved, rebuild your system:
$ make
and copy hwmon.ko and max1027.ko driver to your target or reflash your rootfs.
Usage
On the target, the driver can be started like this:
# modprobe spi_imx # modprobe max1027 max1027 v0.3 successfully probed !
"Slow" & configuration interface
Several interfaces in /sys/bus/spi/devices/spi... are created in order to:
- read the 7 analog inputs values: inx_input (in mV)
- read the temperature: temp1_input (in m°C)
- modify the max1027 registers: conversion, setup & averaging
# ls /sys/bus/spi/devices/spiN.0/ averaging driver in2_input in5_input modalias temp1_input bus in0_input in3_input in6_input setup uevent conversion in1_input in4_input in7_input subsystem
An input can be read like that:
# cat /sys/bus/spi/devices/spiN.0/in0_input (apf9328)
The temperature can be read like that:
# cat /sys/bus/spi/devices/spiN.0/temp1_input
"Fast" interface (frequencies > 10Hz)
In that case you can use /dev interface (using blocking read to wait end of conversion). To create /dev nodes you can use the loadmax.sh script located in armadeus/target/linux/modules/max1027. As driver MAJOR number is dynamically allocated, you may need to update /dev depending on the drivers loaded on you system.
# modprobe spi_imx # modprobe hwmon # sh loadmax.sh (previously installed) max1027 v0.3 successfully probed !
- first, the conversion mode has to be chosen (channel 0->6 and temp):
# let set=0xb1; echo $set > /sys/bus/spi/devices/spiN.0/conversion
- and eventually the averaging and setup registers as well (refer to the max1027 documentation for more details):
# let set=0x48; echo $set > /sys/bus/spi/devices/spiN.0/setup # let set=0x20; echo $set > /sys/bus/spi/devices/spiN.0/averaging
- repeatedly read value of analog input 0 (variable sampling rate = depends on system load):
# cat /dev/max1027/AIN0
- read analog input 0 once:
# time dd if=/dev/max1027/AIN0 bs=2 count=1 > tmp.bin # hexdump tmp.bin
This mode is activated by default in the Max1027 driver. If you switched to "slow" mode you can activate "fast" mode again with:
# let set=0x48; echo $set > /sys/bus/spi/devices/spiN.0/setup
Chip registers configuration
Independent of the mode, /sys interfaces allow direct access to the corresponding register in the MAX1027:
# let conv=0xb1; echo $conv > /sys/bus/spi/devices/spiN.0/conversion
You can also get current (hexadecimal) values of conversion, averaging and setup registers with (for example):
# cat /sys/bus/spi/devices/spiN.0/setup 0x62
For more details on how to use these registers, take a look at the datasheet.
Shell examples
- Get channel 0 and temperature values:
# let conv=0x87; echo $conv > /sys/bus/spi/devices/spiN.0/conversion # cat /sys/class/hwmon/hwmon0/device/temp1_input # cat /sys/class/hwmon/hwmon0/device/in0_input
- Get channels [0-6] and temperature values:
# let conv=0xb1; echo $conv > /sys/bus/spi/devices/spiN.0/conversion
- Get 4 average values (of 32 conversions) for channel 0:
# let avg=0x3c; echo $avg > /sys/bus/spi/devices/spiN.0/averaging # let conv=0x84; echo $conv > /sys/bus/spi/devices/spiN.0/conversion
MAX1027 on APF27Dev board
The MAX1027 is optionnaly mounted on the APF27Dev board. It is ready to use and the ADC inputs can be accessed through J6
MAX1027 on APF9328 board
It is mounted (in option) on the APF9328 boards. To know if you have one on your board, take a look at the connectors side:
If you don't have one and are a good electrician, you can order a sample at Maxim's website and solder it directly on your board (footprint is available).
Hardware interface
By default internal reference voltage is used (2,5V), so if you apply analog values > 2,5V, they will be truncated. The i.MXL SPI_1 interface is used to communicate with the device.
If you want to use the MAX1027 then you will have to connect #EOC pin (End Of Conversion) and #CNVST pin (conversion start) to two i.MXL GPIOs. By default the driver is using:
- PA13 (CSI_HSYNC) for #EOC
- and PA14 (CSI_PIXCLK) for #CNVST
So for example on the APF9328DevFull board you will have to connect:
- pin 11 of ADC connector (right of the Ethernet one) to pin 12 of CSI connector (below RS232 one)
- and pin 10 of the ADC connector to pin 14 of the CSI connector
Links
Other languages: | |
---|---|
English • Français |