The following tips are a result of the many technical support questions that have been asked about using our OBD Interpreters. If you are having trouble, then there is likely an answer here. Note that this section deals with OBD related help only – be sure to also see our Help > Construction Tips section for general circuit help.
Components & Design Choices
Where can I buy a circuit board for my ELM IC?
Elm Electronics does not sell any circuit boards, but several vendors do offer boards and kits. You may find one from the links on our OBD links page, or possibly prefer to make your own.
If making your own pcb, we can help get you started for the ELM327 only. We’ve posted some of the design information for our (3″x4″ single-sided) demonstration board that was used for the original beta testing:
Here are the supporting files for you to download:
- The schematic (Figure 9 from the very first data sheet)
- Some info on connections and jumpers
- PDF versions of the foil and silkscreen patterns:
- Gerber files (.zip) to have the 3″x4″ boards made for you
You are free to use these files as you wish, but Elm Electronics Inc. makes no claims, and offers no guarantees as to the circuits’ performance.
Another option has been provided by Bart Kuijper. He has created an Eagle printed circuit board project for the ELM327 and placed it up on GitHub to share. It’s for a Bluetooth interface, but even if that is not what you want, he’s done 98% of the work for you. Have a look at:
I can not find a 0.3″ wide 28 pin socket. Can you help?
Why not use two 14 pin sockets, end-to-end? Many brands can be connected this way, will work fine, and are likely a lot less expensive than a 28 pin one.
My OBD cable uses pin 2 for common, but I see that your demo board uses pin 1. Is that OK?
Yes – the demonstration board was only created for testing the IC, and was not meant to cover all situations. We used cables from OBD2Cables.com for our testing, but you may obtain your cables from anywhere (and modify the board connections to suit). Perhaps you may wish to use both pins 1 and 2 of the connector for your circuit common.
Where do I get a male J1962 connector?
This is difficult as they are not that easily found. Have you tried OBD2AllInOne? They carry components for you to assemble your own, as does OBD2Cables. For complete cables, you may wish to try OBD2Cables, ScanTool.net, B&B Electronics, and Multiplex Engineering. There are others – just Search the web for J1962 OBD cable vendors.
Your other OBD ICs use a 3.58 MHz crystal. Can I use that frequency for the ELM327 as well?
No, and do not use a 4.096 MHz crystal either, as the frequency error is too great for the protocol timing. The ELM327 must use a 4.000 MHz crystal, as shown in the data sheet.
Do I have to use a Microchip MCP2551 transceiver chip with the ELM327?
No – a CAN transceiver is a very common product that most of the major IC manufacturers make – you can choose as you like. To get you started, have a look at the 82C251 from Philips, the SN65LBC031 from Texas Instruments, and the LT1796 from Linear Technology. We only show the Microchip MCP2551 as one possible example.
Connectivity – RS232, Bluetooth, etc.
Can I use a MAX232 IC for the RS232 interface?
Yes, it can be used but you need to be aware that the RS232 Rx inputs on the ELM320, ELM322, and ELM323 are inverted from what they should be (for a standard interface). This means that the Rx input needs to have an inverter connected in series for the levels to be correct. One of the RS232 drivers inside the Maxim interface IC can be used for this, as shown here:
Note that the ELM327 does not need to have its Rx input inverted, as it uses standard (high at idle) levels. If you wish to use a MAX232 with the ELM327, simply connect the IC as follows:
I would like to connect directly to my microprocessor. Can I do that?
Sure. You don’t need the RS232 voltage levels to transfer data if it is going to another circuit on your board. RS232 voltages are really for going longer distances.
The RS232 Receive inputs on the ELM320, 322, and 323 are inverted from what they should be (for a standard RS232 interface), so to correct for that you need to add another inverter. If you have a spare one on your circuit board, then use it. If you do not have an inverter, you can make one. A simple circuit such as this will work well:
This one transistor circuit is placed between your microprocessor transmit output, and the ELM IC’s receive input to invert the signal for you. Your microprocessor receive input can be connected directly to the ELM’s transmit, and your RS232 is all set. Note that the circuits must all be powered by the same supply (so that you don’t try to backfeed through the protection diodes).
The ELM327 does not need to have its’ Rx input inverted, as it uses conventional levels at both of the RS232 pins – see the ‘Microprocessor Interfaces’ section of the ELM327 data sheet for more information.
I want to use a PDA to talk to my vehicle, how do I do this?
Some PDAs can be used – the biggest problem is in finding one that has a serial interface. If it has only USB, it can not be used unless it is capable of USB OTG (on the go).
We can’t possibly provide advice on all of the devices out there, but we can get you started by showing how to use some of the once popular Palm series of handhelds.
Many of the early Palm models (M100, etc.) used a serial port connection for HotSyncing. You can use the HotSync cable that was supplied with these Palms to talk to your vehicle.
Newer Palms (Tungstens, etc) use a USB connection for HotSyncing. What to do with them? Well, it turns out that many of them have both USB and RS232 available at their 16 pin “Universal Connector”. For these devices, you will only need to purchase Palm’s “HotSync Cable-Serial” (part number P10804U). When you connect this cable, you will then have a standard looking 9 pin (F) connector coming from your Palm.
Now that you have this 9 pin (F) connector coming from your Palm, you need to connect to it. This is not as difficult as many would think, as Palm has followed convention so that their devices can be easily connected to any PC. They have made the connection so that the Palm appears as a modem (DCE) device. The ELM IC is expecting to be talking to a PC however, so in order change how the Palm appears, you will need to reverse the wires to it.
This is done by either putting a “null modem” cable between your ELM IC and your PDA, or by using a standard cable and a “null modem adapter” at one end of the cable. If you wish to make your own “null modem” cable, it’s not very difficult. All that you really need is a cable wired like this:
Having made the connection, you will now need software. There are several terminal programs available for the Palm – take your pick. We use the free and very stable “ptelnet” here at ELM. It will log your sessions to a memo, and the one really good feature that we enjoy is its ability to assign macros (up to 12) to menu items so you don’t need to remember those commands. Here a few macros that we use:
Don’t forget to turn the serial port on and off using the ‘On’ box in the bottom left corner of the screen. It seems that some of the earlier models needed the port turned on and off manually, and if left on, they would continue to use battery power even if the Palm was off. We think that Márcio Migueletto de Andrade has provided a nice product here. If you think so too, don’t forget to tell him.
I would like to connect to my ELM327 circuit using Bluetooth. Can this be done?
Certainly. We actually prefer to use Bluetooth for connections – either using a directly connected 3.3V module (an LMX9838 from National Semiconductor), or with our GBS301 Serial Adapter (from IOGEAR). For more information on using these, see our Application Note ‘AN04 – ELM327 and Bluetooth‘.
Testing & Troubleshooting
I’d prefer to not connect my OBD board to my vehicle for initial testing. Can I test it on the bench?
Certainly. We find that a 9V ‘transistor radio’ battery works very well. Besides being small and convenient, this type of battery will limit the current available (which is what you want for testing). Try not to use car batteries or power supplies that do not have current limiting until you are sure that your circuit has no wiring problems.
My circuit doesn’t work, and I’m not sure where to start troubleshooting. Is there anything with typical voltages on it that I can use to narrow down the location of the problem?
If you are working with the ELM327, have you seen the Application Note ‘AN02 – ELM327 Circuit Construction‘? It provides help with building an ELM327 circuit, and provides schematics with typical voltages shown on them. We do not have anything similar for the other chips at this time, but the next section (Connecting to a PC) does have some typical voltages for the RS232 circuitry.
My ELM327 circuit is acting strangely. All I have connected is the ISO 9141 circuitry, and I’ve checked the wiring many times. Is the chip bad? What next?
All of the ELM ICs are made with a process called CMOS. These are great low-power and fast devices, but one of the problems with CMOS is that it will not tolerate a ‘floating’ input. That is, all inputs must be either directly connected to either the positive supply or circuit common, or they must be connected (‘terminated’) through a resistor. If you do not do this, very unpredictable things can happen, and you might possibly damage the chip.
It sounds like you may have a floating input. Check all of your pin connections to be sure that every input is terminated. (Pins designated as outputs can be left open-circuited.)
I can see pulses going out and in, but the ELM IC says NO DATA.
The bit timing is very critical, particularly with the ELM320 as it operates at a higher speed. By adding test equipment, you are adding extra capacitance that changes the pulses (one edge of the pulse depends on a resistor to provide decay so adding C increases the R-C time constant). Remove your test equipment to ensure that everything’s working properly, before trying to measure and analyze what is happening.
I’ve removed my test equipment, but the ELM IC still says NO DATA.
Not all requests are supported by every vehicle. Yours may not have data to give, or was never designed to respond to this PID (or SID). If you are sure that the vehicle should be responding to this request, then check that the ELM IC’s timeout has not been set too short. Try issuing a AT ST FF command so the chip waits a full second before declaring there is no data available. Maybe your ECU just has higher priority things to attend to, and it is taking longer for it to answer you.
I can see pulses going out, and my car still won’t talk to me. What next?
There can be many reasons for your problem. Consider these:
- You may have selected the wrong interface standard for your vehicle. There are no guarantees that your vehicle uses the standard that is generally attributed to it. For example, much of the literature states that Daimler Chrysler vehicles use the ISO standard, and while many do, as of the MY2000 many of them started to use the J1850 VPW standard. Check with your manufacturer to be sure.
- In line with the above, we once had a person who carefully built an ELM320 circuit only to find that it did not talk to his diesel powered vehicle. We tried everything, and he ended up putting it on the shelf. Eventually though, he tried it on a gasoline engine version of the same vehicle and the circuit worked. Always verify the standard used by your vehicle if you can not communicate with it.
- You may have a wiring error. These occasionally become more obvious after taking a break (why not put this down for a day or two and then come back to it?).
- You may have a component error. Be careful with substitition of component values. For example, changing the 4.7K resistor on pin 4 of an ELM320 circuit to a 47K resistor, will almost guarantee failure (as the R-C time constant will change, altering signal pulse widths).
- Check that your ignition switch is turned fully on. Even though there is 12V at the interface, most ECUs will not respond unless the ignition is on. We’ve all made this mistake more than once!
Connecting to a PC
I’ve connected the RS232 but get nothing from my ELM IC. What should I do now?
All of the ELM OBD chips will power up and then send a message saying its device name and the version number. Before even trying to control something with your ELM IC, you need to see this message.
Some of the ELM RS232 Example Applications show RS232 connections for an older style 25 pin connector. This connection was very common for external modems and other computer peripherals, but is now almost extinct. Be sure that you are using the correct pinouts for the type of connector that you are using. Here is a pin cross-reference for you:
|Transmit Data (from PC)||2||3|
|Receive Data (to PC)||3||2|
|Request to Send (from PC)||4||7|
|Clear to Send (to PC)||5||8|
|DCE Ready (to PC)||6||6|
|Data Carrier Detect (to PC)||8||1|
|DTE Ready (from PC)||20||4|
|Ring Indicator (to PC)||22||9|
If you are sure that you have connected the correct pins (there should be a tiny little number beside the pins), then perhaps you have a component problem. The following shows the typical voltages that you should see in your ELM320, ELM322, or ELM323 circuit – simply compare them to what you measure:
The Example Application for the ELM327 shows a slightly different circuit. Here are typical voltages that you might measure with the ELM327 circuit:
If you have a multimeter available (you should if you’re building an electronic circuit) then connect it with the negative lead to circuit common and probe around this circuit. The typical voltages that you would expect (if all connections are correct) are shown in red in the above diagrams. Don’t worry if your voltage is a little different as each computer is a little different – it is the relative magnitude and the polarity of the voltage that is important. Any significant differences need to be checked, as the different voltage might be caused by a component problem.
Several people have pointed out that for the ELM320, ELM322, and ELM323, the Rx pin actually sits at a negative voltage. Since voltages less than Vss are not recommended for an IC, people were worried that damage might result. Actually, it is not recommended if there is no means of limiting the current through the input pin (as it could cause a problem known as ‘latchup’). In this case a large series resistor limits the current to a safe level, so the -0.5V measured is quite acceptable.
I’ve connected the RS232 but get random characters from my ELM IC. What should I do now? Random characters almost certainly mean that ELM device and the terminal software are not set to the same baud rate. All of our OBD products power up and transmit a message like this:
If your terminal software baud rate is set too low, you will see a shorter message, typically like this:
and if your terminal software baud rate is set too high, the message will appear longer than it should, typically like this:
The ELM ICs normally use 9600 baud or 38400 baud, so if you have set your software to one of these, then try the other.
I see the powerup message, but I get nothing when I send commands.
There are two types of commands – internal and OBD. Send an internal command (try AT E1) and make sure you receive an ‘OK’ in response.
If you do not, there may be a few reasons:
- The fact that you see the powerup message says that the IC is functioning, your baud rate is correct, and the transmit wire from the ELM IC to the PC Rx input is correct.
- The common wire from the ELM circuit to the PC’s RS232 port may be incorrect. Check that the two are properly referenced to each other (you must connect common to pin 5 on a 9 pin connector, or to pin 7 on a 25 pin connector)
- Make sure you do not have any handshaking selected. Your PC may be waiting for a signal that the ELM IC is ready to receive data, and this will never happen. No hardware handshaking, no XOn XOff handshaking. Don’t worry, almost any PC ever made should be able to handle 9600 baud.
- Your system may not allow you to avoid handshaking entirely. Some RS232 ports (or USB adapters) require signals such as Carrier Detect (DCD) and DCE Ready (DSR) to be asserted before they will function properly. If you have one of these, you will have to add jumpers between some of your RS232 pins. For 25 pin systems, short pins 6, 8, and 20 to each other, and also connect pin 4 to pin 5. If you have a 9 pin connector, short pins 1, 4, and 6 to each other, and then short pin 7 to pin 8.
- Check your wiring again to the ELM IC’s receive input. The ELM IC can talk to your PC or PDA, but is not seeing your commands, so something is likely wrong with the components between the PC and the ELM IC. Note that the input is inverted, so if you have deviated from the Example Application, you may have to add an extra inversion to compensate.
I have built the circuit, and am testing it on an Ozen Elektronik ISO 9142 ECU simulator. All I get is ‘UNABLE TO CONNECT’ – why?
You must have an ELM327 v1.3a or older. When searching, the ELM327 looks to see what inputs are active, if any. If none are active, it tries protocol 5 (KWP fast) first, then looks for others if that fails. It turns out that the Ozen simulator needs about 2 seconds after one of these attempts before it is able to respond to others.
In order to connect to the Ozen simulator, either add time (make PP13 > BC) or use an ELM327 v1.4b or newer IC.
Talking to a Vehicle
What software do I need in order to talk to my ELM IC?
All of our ELM OBD Interpreter integrated circuits ‘talk’ in plain ASCII. This means that virtually any terminal program can be used with them, and no special software is required (but if you want to try some, we have a listing at Help > OBD > Software).
Terminal software gives you complete control of the Elm chip, allowing you to control what is sent, and see everything that it responds with. It is generally quite easy to use once you have established the connection. Here are a few popular programs:
- goSerial by Andreas Mayer is a nice bit of free software. It provides a simple terminal interface, that automatically logs your sessions for you.
- ZTerm by Dave Alverson has been the standard shareware program for years. It’s available for Mac OS X, as well as the older systems 8 and 9.
Windows 95, 98, XP
- Have a look at the Hercules SETUP utility by the folks at HW group. It’s a free download, and works well with Windows 7 (not sure about 8 or 10).
- The older Windows systems have a free terminal program included – “HyperTerminal” by Hilgraeve Inc./Microsoft. It’s a good one to start with, if you’re trying to do some basic testing.
- Terminal 1.9b by Bray is a great little free program if you can find it. For some reason, it’s disappeared off the net recently.
- RealTerm is another great free program that is certainly worth a try.
- VBHexTerm by Chris Schroeder is another great little free program. It allows you to transmit actual binary data which may handy (but not for the ELM interfaces – they only need ASCII).
- Tera Term Pro by T. Teranishi is yet another free program. It hasn’t been updated for a while, but should still work fine on many systems.
- If that version of Tera Term seems a little outdated, you may want to try the SourceForge TeraTerm Project. The software is open source, costs nothing, and seems to be kept fairly current – certainly worth a try.
- One other suggestion is for a (free) product by CompuPhase, called Termite. It is easy to set up, and is very fast at finding the COM port for you. It does support plugins, so can be customized if you wish (they give the source code, so you can write your own, too). The “Time Stamp” filter was a little disappointing in that it seemed to intersperse time stamps almost randomly thoughout the ELM chip responses (but could be very useful if it were to time-stamp the beginning of each line that is received). Click here to go to the Termite web page.
- WGSoft, makers of the popular ScanMaster-ELM software have created a nice little basic terminal – the “COM Port Terminal”, and best of all, it’s free. Click here to download a copy (it’s about 600KB).
- RealTerm is reported to work well with Vista, and it’s also a free download.
- Pocket Tera Term by T. Teranishi is yet another free program. We have not tested it yet, so can’t say if it works well or not (but like Tera TermPro, it’s free).
- ptelnet by Marcio Migueletto de Andrade is free and works well, if you are doing basic testing. It allows you to define macros for common functions, which is handy.
I’d prefer a graphic interface. Is that type at software available?
Yes, many organizations have created software for the ELM OBD ICs. Some provide it at no cost, while others charge only a moderate fee. See our OBD links page for a list.
Every time I use certain free software, I need to reset my OBD chip before it will accept commands. Why?
You should not have to reset the IC. Some software turns the character echo off, and leaves it that way on exit. Try sending AT E1 to turn the echo back on instead of resetting everything.
The received data keeps overwriting on itself. What is wrong?
Your ELM chip is not generating linefeeds after carriage returns. Either set your ELM chip to provide linefeeds (AT L1) or set your terminal software to automatically add linefeeds after each carriage return (some software calls this ‘Append line feeds to incoming line ends’).
Can I use my ELM32x software with the ELM327?
In general, no. You may have some success depending on what type of vehicle that you use the IC with, but as soon as you begin talking to a CAN vehicle, most of the older packages will ‘break’. Many of the software companies are working hard to update their software though, and should be ready soon.
Terminal programs such as HyperTerm, ZTerm, etc. still work fine with all of our RS232 products – they need no changes to work with the ELM327.
Can I use my ELM323 or ELM327 with VAG-COM software?
No, we do not currently support the VAG interface.
I have a scan tool that is connected to a vehicle, and I wish to monitor the data flow with an ELM. As soon as I connect my ELM circuit in parallel, I begin seeing errors. Why?
One reason might be a wiring problem in your ELM circuit. Assuming that there is none, are you trying to monitor either the ISO9141-2 or the KWP (ISO14230-4) protocols? If so, you may be placing too big a load on the data bus circuit. These protocols were only designed for one scan tool at a time, each with a 510 ohm resistor inside. By connecting two, you have doubled the loading by effectively connecting a 255 ohm resistor in the circuit.
We advise that if connecting your ELM327 or ELM323 like this, you replace both the 510 ohm resistors in the ELM circuit with 10K ohm resistors. You do not have to modify any of the other circuits (just leave them as they are.)
My ELM323 starts to initialize the bus, then aborts!
If you have set linefeeds off in the ELM323, but have them on in the computer software, you may be inadvertently causing this problem. In this case, every command you send to the ELM323 will be followed by both a carriage return character and then a linefeed character. When the ELM323 receives the carriage return character, it immediately begins executing your command (since linefeeds are off, it doesn’t wait for any more characters). When the linefeed character does eventually arrive, it is interpreted as an interrupt (any received character will stop a command in progress) and the ELM323 will abort whatever action was in progress.
Often the display looks like this:
BUS INIT: ...
The solution is to either turn on the linefeeds in the ELM chip (AT L1), or to turn off the linefeeds that are being generated when your computer sends commands. In HyperTerm, the option is something like “send line ends with line feeds”, while in Zterm it is “auto line feed”.
Similar problems can occur with the other ELM chips too, if you are not consistent with your settings. When weird things are happening, check your settings to make sure both the ELM chip and your computer/PDA are set the same way.
Where can I obtain lists of vehicle modes and PIDs?
These are described by SAE (Society of Automotive Engineers, Inc.) standards J1979 (E/E Diagnostic Test Modes) and J2190 (Enhanced E/E Diagnostic Test Modes). Copies of these can be purchased from the SAE web site.
What is an In-Frame Response?
They are reply bytes that are sent during a message, usually as an acknowledgement of data received, or as a short reply to a request. They occur during specific time slots within the data frame, so are given the In-Frame name. The ELM320 always sends a single response byte, while the ELM322 and the ELM323 never do, and the ELM327 will send one if the header says that it is required.
How can I obtain updates at a faster rate?
There is a chance that you may not be able to, as several factors (not just the ELM interface) all work together to set the data rate. Occasionally, the vehicle’s ECU is the limiting factor, but it is often the OBD standards that actually limit the maximum polling rate (so that you do not overburden the ECU). The early standards required that scan tools not request information more often than every 100msec.
If you aren’t happy with the present data rate, then here are some tips that may help:
- If you are monitoring only one quantity (eg RPM), are you aware that you do not have to keep sending the complete command over and over? Simply sending a ‘return’ character causes the ELM IC to repeat the last command that it received.
- Have you experimented with your vehicle to see just what ‘NO DATA’ timeout value is appropriate? Even when data has been received, the ELM IC waits the amount of time set by AT ST before it decides that there is no more data coming (unless you have the newest ELM327, and have the Adaptive Timing enabled). If you know that your ECU always responds in 50 msec, then it doesn’t make much sense to always wait the default 200 msec to be sure no more data is coming.
- Have you turned the headers off? If you do not require that information, then why ask the ELM IC to repeatedly send it?
- If you are using a computer program to manipulate the information then display it (as opposed to a terminal program that only displays what it receives), have you turned the linefeeds off with AT L0? This will reduce the number of bytes being sent on the RS232 bus, saving some more time.
- Speaking of saving time, you can triple data flow rates if you use the Packed Data mode of transfer (AT PD) with the ELM320, ELM322 or ELM323. Of course it will be unreadable on a terminal program, but if you have written your own interface program, then why have the ELM IC send three ASCII bytes for every data byte, if you can use the data bytes directly?
- The ELM327 does not support the Packed Data mode, but the latest version does allow space characters to be eliminated from the ECU responses. This will typically save 33% in time to transfer data, and
will allow more characters to be buffered for sending, reducing the chance of BUFFER FULLs.
How do I convert the Hex numbers for trouble codes to decimal?
You don’t. The responses should be read directly as received, without manipulating. At least this applies to the ones that begin with a ‘0’ or a ‘1’. For the others, you’ll have to refer to the data sheet (as the first digit does double duty in those cases).
Here is an example conversation with one vehicle:
41 01 81 07 65 00
>02 00 00
42 00 00 7E 18 00 00
43 01 33 00 00 00 00
After asking for the trouble codes (the ’03’), a ’43’ (response from an ’03’) is received followed by three trouble codes, which are combined into pairs giving 0133 0000 and 0000. The 0133 is what you want, and you read it directly without any need for a hex conversion. The 0000’s are just filler bytes and should be ignored.
Note that the ’04’ that was sent actually cleared the trouble code, and reset the check engine light. This should never be done until the problem that caused the code has been repaired.
Why do I get DATA ERRORs when in the Monitor All mode?
Some vehicles use a single byte header format for a few of their messages, to keep transmission times down and allow for the rapid updating of information. The ELM ICs follow the OBD standards however, and always expect a three byte header, one or more data bytes, and a checksum byte. If a received message does not appear to follow the OBD standard, it will be deemed to be in error, and the DATA ERROR message will be shown. If the headers are off, you may not see any data at all.
If you would like to see the complete message as received, try using the AT H1 command to show the extra bytes. With the headers on, the IC will not try to remove four bytes from it, and if the message is less than four bytes long, it will be displayed properly.
Do you offer a ‘version history’ or list of ‘release notes’ for the ELM327?
No, not a list of every change and fix. We do provide a list of the AT Commands and Programmable Parameters for each version, though (see the next question), and we also provide the following outline:
Initial public release, the ELM327 v1.0 supported:
– SAEJ1850 PWM and VPW,-
– ISO 9141-2 (10.4 and 9.6 kbps),
– ISO 14230-4 (10.4 and 9.6 kbps),
– ISO 15765-4 CAN (250 and 500 kbps)-
The RS232 baud rates were only 9.6 kbps or 38.4 kbps
– J1850 VPW timing adjustment for some ’99 – ’00 GM trucks.
– Introduced Programmable Parameters
– Added Flow Control commands
– RS232 baud rates are adjustable to 500 kbps
– Programmable Parameters can be reset with a jumper
– Introduced Adaptive Timing
– Added SAE J1939 support (protocol A)
– Added user defined CAN protocols B and C
– Modified KWP protocols to allow four byte headers
– Changed error detection to catch KWP 4 byte headers if no data or checksum
– Added check to prevent CAN mask corruption on certain Flow Control sends
– Adaptive Timing tuned a little differently
– Several J1939 improvements
– New CAN CRA commands to help setting masks and filters
– New CAN D0/D1 commands for printing of message dlc
– New CAN RTR command for sending same
– Added space character control in responses
– New STOPPED message for user interrupts during searches
– Introduced LV RESET message for resets from low voltage
– New @2 and @3 commands for storing of unique identifier
– Added ability to state the number of responses desired
v1.3a (still available)
– Added wiring checks for when the J1962 CAN pins are used for other functions
– Added Low Power mode (‘sleep’ function)
– Added extended addressing mode for CAN protocols
– Added 4800 baud ISO 9141 and ISO 14230 support
– Allow manual control over ISO 9141 and ISO 14230 initiation
– Provided a single EEPROM byte for user data storage
– All interrupts now say STOPPED (not just when searching)
– Many new Programmable Parameters and additions
Elm Electronics never made a v1.4a
v1.4b (still available)
– New CSM command to have active or passive CAN monitoring
– New CRA command to quickly reset changed masks and filters
– Several SAE J1939 updates
Elm Electronics never made a v1.5
– New Activity Monitor watches OBD pins
– Wake from Low Power now retains settings
– AT CRAs accept ‘don’t care’s (X’s)
– New PP’s provide extensive ISO/KWP control
– Increased the RS232 Tx buffer to 512 bytes
– Brownout reset voltage reduced to 2.8V
– Speed increases
– Processes ‘Response Pending’ (7F xx 78) replies
– CAN searches now measure frequency and require a match
v2.2 (latest release)
– AT CS command now shows CAN frequency
– Added 12500 and 15625 bps ISO/KWP baud rates
– New AT CER hh command allows defining the CEA Rx address
– New IFR modes 4,5,6 control J1850 IFR sending while monitoring
– Added PP 1F to allow KWP length to include the checksum byte
– Increased PP19 from 31 to 4F
Commands and Responses
What AT commands does each version of the ELM327 support?
The ELM327 has evolved over time. With each update, we have added several new features – the main ones are listed in the previous section (and also in the ‘Version History’ section of the latest data sheet).
Associated with the feature changes, there have been several new commands and settings (Programmable Parameters). The following are PDF summaries of these changes.
The AT commands, by firmware version:
and the Programmable Parameters:
How do I use the AT WS command with the ELM327?
The Warm Start command is used exactly like the ‘AT Z’ command that is used to reset our other ICs. It is considerably faster than the ‘AT Z’ command, as it bypasses the LED test sequence (it does refresh everything else, however).
I have heard that the ‘AT SP 0’ command is not recommended. Why?
There is nothing wrong with the ‘AT SP 0’ command, but there may be a better way to search for protocols if you are creating a software interface. Telling the ELM327 to use protocol 0 is an easy way to enable automatic protocol searching, when you do not know what protocol to use. Although the ELM327 is very fast (and intelligent) in its searches, you don’t want to go through a slow 5 baud initiation if you don’t have to.
As a way to improve on the search speed, you might take advantage of the fact that many users will often be needing the same protocol that they used last. Why not try that last-used protocol first, and then allow searching if that protocol doesn’t respond?
That is, rather than ‘erasing’ the last used protocol with an ‘AT SP 0’ at the start of your routine, first perform an ‘AT DP’ or ‘AT DPN’ to see if the ELM327 is set for automatic searching, should the memorized protocol fail to connect. If it is, then do not send an AT SP 0, as a failure to connect (with the last-used protocol) will result in an automatic search anyway. If the ‘AT DP’ or ‘AT DPN’ told you it was not in automatic search on fail mode, then still allow the ELM327 to try. Then if it fails to connect, use ‘AT SP 0’ and repeat the request again.
I have updated to the ELM327 v1.3a, and am suddenly seeing ‘LV RESET’s. What are these?
The ELM327 monitors the 5V supply for what is known as ‘brown-out’s, or low voltage conditions. If the voltage should drop below a minimum value, a low voltage reset is initiated to protect against possible random behaviour, and the IC will print the ‘LV RESET’ message. Prior to version 1.3, the ELM327 still responded to voltage brown-outs with a reset, but you would only see the startup message and not the more descriptive LV RESET message. For more information, refer to AN03 – ELM327 Low Voltage Resets in the Application Notes section.
Why do I occasionally get BUS ERRORs with the ELM327?
Some of the OBD standards allow for a special pulse to force a ‘break’ in activity (essentially a reset). While our previous OBD ICs tolerated excessively long pulses, the ELM327 actually measures the length and reports if one is found to be too long. For example, the J1850 VPW standard says that the pulse should be less that 5msec long, but many vehicles produce pulses of several hundred milliseconds in length during an engine start. These long pulses will be reported as a BUS ERROR.
In general, these will not affect the operation of your interface, but it could possibly cause an initiation to be aborted if it occurs at the wrong time, or it could be displayed in the middle of a stream of data from a ‘Monitor All’ command. If this continues to be a problem for you, consider turning it off using Programmable Parameter #11.
Is there a way to know if a connection is still active?
Occasionally, designers ask if there is an internal state variable, or perhaps an output that we can enable to show if a connection to the ECU is valid or not. They want a more robust system, should a wire come loose, or the ignition be turned off during a session.
If you have a newer ELM327, then you can query the Activity Monitor (with AT AMC) to determine if there is any activity at the OBD inputs. The count represents the time since activity was last detected, so you can set a threshold and use that to say if the network is active or not.
ELM327 integrated circuits with firmware versions less than 2 (ie the v1.3a or the v1.4b), can still determine if the network is active, but require that you add extra logic to your controller. Consider something like this:
- Note when you have made a connection to the ECU. All OBDII protocols must support the 01 00 request, so use that as your first query. If you get a valid response, carry on. If you do not, then maybe you don’t have an OBDII system, and want to handle that in some way.
- Make your queries as you normally would.
- Look for responses of ‘NO DATA’ to one of your requests. If you receive a ‘NO DATA’ and are sure that the ECU should have responded to this request (ie it was responding previously), then there could be two reasons for it. The first is that the ECU may simply have been too busy, and requires more time to answer. The second is that the ‘connection’ may have been lost.
At this point, we would advise sending the request again. If you still get a ‘NO DATA’ response, then send an 01 00 request (you know that it worked before, so it should now). If that fails, try it one more time with the timeout set at the maximum (AT ST FF). If there is still no response, then you have lost your connection.
If a connection is lost, you will need to tell the ELM327 to ‘close’ the current connection, with a Protocol Close command (AT PC). This will ensure that the ELM327 starts from the beginning when the next request is made. This is particularly important for the ISO 9141 and ISO 14230 protocols, as they need to send a special initiation sequence.
Once the protocol has been closed, it can be re-opened by making a request such as 01 00 (do not send ATZ or AT SP0, as many do).
How do I use the ELM327 with SAE J1939 CAN? It keeps saying UNABLE TO CONNECT!
The J1939 protocol is not normally part of the automatic search group, unless you have changed the value of PP 07. If you are experimenting, the best way to enable protocol A is to use the Set Protocol command (ie AT SP A). When you are finished, simply restore normal OBD operation with an AT SP 0 (or AT SP 00 to write it to EEPROM). Note that J1939 is only available with version 1.2 or newer ICs.
I know that my vehicle uses the ISO 9141 (or ISO 14230) protocol, but the ELM327 always says UNABLE TO CONNECT. What I can do?
We’ve found that the data signal from some vehicles is at a slightly lower voltage than others. The signal isn’t always seen by the ELM327, making many responses appear as errors. To boost the signal slightly, we recommend that you try changing resistor R21 to 33K ohms, if you are currently using 22K ohms:
I know that my vehicle uses the ISO 9141-2 protocol, I’ve changed R21, but the ELM327 still says UNABLE TO CONNECT. Is there something else that I can do?
There may be. Some ISO 9141 vehicles become confused if they see an attempt at a fast initialization, and then a slow initialization too quickly afterwards. This happens with very few vehicles, but yours might be one of them.
You can add a little delay between the protocol attempts by increasing the value of PP 18 or PP 19 (PP19 is only available on v1.4 or newer ICs). Some experimentation may be required but you are adding delay, so will not do any harm.
From a terminal program, you might try the following commands:
>AT PP 18 SV F4
>AT PP 18 ON
A value of F4 provides a delay of about 1 second on many versions of the ELM327. When we updated the firmware to v2.1, we changed the multiplier to provide longer times for the really difficult cases.
You will only have perform the above steps one time, as it changes the EEPROM settings internally (and they keep their values, even if the power goes off).
Is it possible to use the ELM327 with CAN that is not OBDII?
Yes. The ELM327 is able to be configured for many different types of CAN protocols, with baud rates from 8 to 500 kbps.
The CAN physical interface is common across all implementations, so connecting to the data bus should not be a problem if you have used the recommended circuit in the data sheet. (That circuit does not use a terminating resistor, which could cause problems if your network already had two.) Protocols B and C are already set for default rates of 125Kbps and 50Kbps, respectively, but may be changed easily. This means that If you wish to experiment with a 125Kbps system, you may only need to issue the command AT SP B, and the ELM327 could be all set for you. By default, protocol B will transmit 11 bit IDs and receive both 11 and 29 bit IDs, but you may want to adjust this with PP 2C.
Changing baud rates for protocols B and C requires writing to the Programmable Parameter memory, which is a two step process, requiring that the value be written, and then that the value be enabled. For example, to change protocol C to 83.3Kbps would require the following steps:
>at pp 2f sv 06
>at pp 2f on
From that point on, you could simply use AT SP C, whenever you wanted to connect to an 83.3Kbps CAN system. You need only do the above steps once, as Programmable Parameters are stored in EEPROM (which retains values even with power off).
Does the ELM327 support 1-wire CAN?
Not officially, but several people are experimenting with it. Sites such as ‘GMLAN HACKER‘ offer a great deal of advice. Also, search the web for topics such as single wire CAN, 1-wire CAN, SAE J2411, GMLAN or GMW3089. If you wish to work with 1-wire CAN, you may also wish to consider the ELM329, as it provides 1-wire transceiver controls.
Does the ELM327 support J2534 Pass-Thru Programming?
No, the ELM327 is only for obtaining information from vehicles and does not support any type of ECU programming.
Are you planning to introduce a USB version of the ELM327 IC?
No. There is a large demand for USB, but there is also a large demand for direct connections to microprocessors, or Bluetooth interfaces, or WiFi interfaces, and also in serial to ethernet connections. RS232 remains a common protocol for all of these, not USB.
Have you tried a USB to RS232 cable, such as the Keyspan model USA-19HS? We find it quite good, and it’s usable to 230K baud.
Have you perhaps considered permanently wiring an RS232 to USB converter IC into your circuit? Devices such as the FT232BM by FTDI have a good reputation for applications such as this.
Two other chips that look quite interesting are the CP2102 and the CP2103 from Silicon Laboratories (look under Microcontrollers). These do not require an external crystal, and they even have an internal EEPROM for customizing the interface. See the latest ELM327 datasheet for an example circuit showing how to connect a CP2102 to an ELM327 IC (see Figure 11).
If you are interested in using a Bluetooth interface, have a look at our ‘AN04 – ELM327 and Bluetooth‘ Application Note.