I2C Hacks: How To Splice Clocks Into Chip-Selects

There comes a time when you need to wire up three, four, or more identical i2c devices to a common microcontroller. Maybe you’re thinking about driving 128 seven-segment displays with eight of those MAX6955 16-way digit drivers, or maybe you have a robot full of joints–each of which needs a BNO055 inertial sensor for angle estimation. (See above.) Crikey! In both of those cases, you’re best bet might be a schnazzy I²C device that can do most of the work for you. The problem? With a single I²C bus, there’s no standard way defined in the protocol for connecting two or more devices with the same address. Shoot! It would’ve been handy to wire up three BNO055 IMUs or eight MAX6955s and call it a day. Luckily, there’s a workaround.

We’ve seen some clever tricks in the past for solving this problem. [Marv G‘s] method involves toggling between a device’s default and alternate address with an external pin. This method, while clever, assumes that the device (a) has an alternate I²C address and (b) features an external pin for toggling that address.

I’ll introduce two additional methods for getting the conversation started between your micro’ and your suite of identical sensors. The first is “a neat trick,” but somewhat impractical for widespread use. The second is far more  production-worthy–something you could gloat over and show off to your boss! Without further ado, let’s get started with Method 1.

Lastly, if you’d like to follow along, feel free to check out the source code on Github.

https://www.youtube.com/watch?v=ju89RUWVULE

The Test Setup:

cube_details

In both methods, I’m using the same sensor setup to check that each circuit behaves correctly. I happened to have a bunch of extra BMA180s on the bench, so I rolled out an example based on these chips. Back in the day, the BMA180 was a pretty common three-axis digital accelerometer. It has an I²C interface with two optional addresses. For the purpose of this example, I’m fixing them all with the same address.  I’ve mounted three of these guys on mutually perpendicular axes of my acrylic “test cube,” and I’m reading each chip’s Z-axis. In this configuration I can easily pick out the gravity vector from the corresponding sensor as the data goes flying by my serial port window. If I can uniquely address each sensor and read the data, I’ve got a working circuit.

Method 1: Splicing Clocks into Chip-Selects

This method tips its hat towards SPI in that it behaves in an oddly similar fashion. If you’re feeling rusty on SPI, here’s a quick recap.

A Quick SPI Refreshment:

SPI, like I²C, is another protocol that shares both its clock and data lines with multiple slave devices. The difference, though, lies in the addressing scheme to talk to these devices that share the same bus. With SPI, while clock and data lines are shared, devices are addressed with separate chip-select (CS) lines.

SPI_three_slaves
Image Source: Wikipedia

The master microcontroller dedicates a unique output pin to each device (~SS1, ~SS2, and ~SS3 in this illustration). When the master micro’ wants to talk to a device, it asserts that device’s chip-select input pin by pulling it to logic LOW, and the conversation begins over the data bus. With the chip select LOW, the corresponding slave listens to the data on the bus. Meanwhile, all other devices ignore the conversation between the master and it’s chosen slave by keeping their bus pins in a high impedance state.

Giving I²C Its Own Chip-Selects:

With I²C, Clock (SCL) and Data (SDA) lines are still shared between all I2C slave devices, but the addressing scheme happens by sending a message heard by all devices on the bus. To single out one device on the shared bus, the master first passes down the address of the slave device it wants to talk to, after which that slave replies with an ACKnowledge, and all other slaves ignore the data that follows until both data transmission is complete and the bus is “released.”

i2c_normal_operation

Because we have the problem of multiple devices with shared addresses, in theory, all of these devices would reply when the master passes down their shared address, and there’s no way for the master to single out a single device. In reality, this behavior is undefined on the I²C protocol.

i2c_bad_operation

Yikes! Anything goes when we wander away from defined behavior, so we try to avoid these things in practice.

The solution?

According to the I²C spec, It just so happens that an I²C slave device will ignore changes on the data line (SDA) provided that the clock line (SCL) is held high. In this method, I’ll “split” the SCL line into multiple SCL lines such that each shared I²C device gets its own SCL. By selectively rerouting the clock to each I²C device one-at-a-time, I’ve essentially turned the SCL line into a “chip select.”

To chop up that clock line, I’ll need a demultiplexer. A demultiplexer (or decoder) takes a logical input and reroutes it to one of several outputs based on the binary select lines.

I’ve dropped in the 74AC11138 eight-way demultiplexer for this task. It’s fast, capable of switching at megahertz rates, and its outputs default to logic HIGH. That second note is handy since idle SCL lines also default to logic HIGH.

The setup is shown in a simplified schematic above. In it, I’m using a Teensy 3.0 posing as the I²C bus master. To the right of the Teensy is the collection of identical chips, BMA180 accelerometers in this case. In the middle is the 74AC11138 eight-way demultiplexer.

Cons of this Method:

There’s a minor drawback with this technique, though, in that it doesn’t support I²C’s clock-stretching feature. Taking a step back, this method assumes that the SCL line is inherently unidirectional, controlled by only the I²C bus master. In other words, we’re making the assumption that data on the SCL line is only sent from master to slave and never the other way around. If your I²C slave devices implement clock-stretching, however, this assumption breaks down.

What is Clock Stretching?

Clock stretching is a method defined by the I²C protocol where the chip needs to “buy itself more time” and holds the SCL line low, hence, signalling to the master that it’s not ready for the upcoming data. In this scenario, the slave actively controls the SCL line, and it happens to be the only case where data moves up the SCL line from slave to master. In a setup with our demultiplexer between the master and our set of identical slaves, these slaves won’t be able to send back the clock-stretching signal to the master to indicate that they aren’t ready for data, if they happen to implement clock stretching. That said, clock stretching is a pretty rare feature among I²C-compatible devices, so this method is likely to work among a number of chips out now.

More Next Week

That’s all for Method 1. Thanks for tuning in, and check back next week for a slightly-more-professional method of tackling this same problem.

The Factory Of The World – Hackaday Documentary On The Shenzhen Ecosystem

When it comes to manufacturing, no place in the world has the same kind of allure as the Pearl River Delta region of China. Within just an hour-long train ride, two vastly different cultures co-exist, each with its unique appeal that keeps attracting engineers, entrepreneurs, and hustlers alike. On the mainland side, cities like Shenzhen and Guangzhou bring the promise of cheap components, low-cost contract work, and the street cred of “having done the Shenzhen thing.” And on the island, the capitalist utopia called Hong Kong glows with all of its high finance and stories of lavish expat lifestyles.

As the “new” China evolves, it seems like it’s exactly the convergence of these two cultures that will bring the biggest change—and not just to the area but to the whole world. Still, understanding what exactly is going on and what the place is really all about remains a mystery to many. So, this June, we jumped on the bandwagon and headed east, trying to get our own feel for the whole thing.

Here’s what we came back with…

Continue reading “The Factory Of The World – Hackaday Documentary On The Shenzhen Ecosystem”

Make A Microphone Out Of A Hard Drive

[Rulof Maker] has a penchant for making nifty projects out of old electronics. The one that has caught our eye is  a microphone made from parts of an old hard drive. The drive’s arm and magnet were set aside while  the aluminum base was diagonally cut into two pieces.  One piece was later used to reassemble the hard drive’s magnet and arm onto a wooden platform.

v2_micThe drive’s arm and voice coil actuator are the key parts of this project. It was modified with a metal extension so that a paper cone cut from an audio speaker could be attached, an idea used in microphone projects we’ve previously featured. Copper wire scavenged from the speaker was then soldered to voice coil on the arm as well as an audio jack. In the first version of the Hard Drive Microphone, the arm is held upright with a pair of springs and vibrates when the cone catches sound.

While the microphone worked, [Rulof] saw room for improvement. In the second version, he replaced the mechanical springs with magnets to keep the arm aloft. One pair was glued to the sides of the base, while another pair recovered from an old optical drive was affixed to the arm. He fabricated a larger paper cone and added a pop filter made out of pantyhose for good measure. The higher sound quality is definitely noticeable. If you are interested in more of [Rulof’s] projects, check out his YouTube channel.

Continue reading “Make A Microphone Out Of A Hard Drive”

Hackers Measure Cable Lengths With Time Domain Reflectometers

[android] has built up a fast edge pulse generator for time domain reflectometry (TDR). TDR is a neat technique which lets you measure cable lengths using electrical signals and can also be used to locate faults within the cable.

TDR works by sending a pulse down the cable. When the pulse reaches the end of the unterminated cable it is reflected back to the source. By monitoring the delay between the original pulse and its reflection you can determine the length of the cable. We’ve seen projects that use TDR before, and it’s often used in telecoms industry to locate faults in long cable runs.

You can try TDR in your lab using only a scope to observe the delay and a function generator to create the pulse. However, the technique works a lot better with pulses that have very fast rise times. So [android] built a fast edge pulse generator based on [w2aew]s design. Then added googly eyes for good measure. His build works great and is a nice demonstration of the technique.

Hackaday Prize Entry: Superb Audio With The Teensy

The Raspberry Pi and Teensy 3 both have I2S interfaces, and that means these boards can be used to play very high quality audio. A codec and an I2S interface is one thing, but turning that digital stream into a quality analog output is another thing entirely. You need only look at audiophile forums for enough mis- and disinformation for that evidence.

For his Hackaday Prize entry [William Hollender] is building an audio board for the Teensy 3.x. It features very high-end opamps, the right filters, and the correct topology to turn a digital audio stream into an analog signal that would please the most temperamental ear.

The Teensy Super Audio Board uses the Cirrus CS4272 audio codec chip, a high quality chip that can handle sample rates of up to 192kHz at 24 bit depth. This chip doesn’t include the analog input and output buffers, and this means [William] has quite a build in front of him. This means using high quality opamps, low noise power supplies, and knowing how to build a circuit and measure its noise.

So far, the tests revealed incredible dynamic range, flatness, and frequency response of this tiny little board. It also works with the Raspberry Pi. Now it’s just a matter of getting a few more of these boards put together for the Best Product part of the Hackaday Prize.

 

The 2015 Hackaday Prize is sponsored by:

Simple One-Chip Regenerative Receiver

Crystal radios may be the simplest kind to make, but regenerative receivers are more practical and only a little more complicated. A recent design by [Selenium] is super simple because it uses a single LM386 audio amplifier IC.

You might be surprised that you can convert an audio amplifier to a receiver using just a handful of components (a variable capacitor, a coil, a handful of capacitors, and a speaker). However, [Selenium] realized he could subvert the gain and bypass pins to cause regeneration and wound up with a very simple receiver.

If you haven’t looked at regenerative receivers before, the principle is simple (and dates back to 1912). An oscillator is an amplifier that gets (theoretically) an infinite amount of gain at one particular frequency. A regenerative receiver is just an amplifier that is almost (but not quite) at the point of oscillation. This gives it very high frequency-specific gain and a measure of selectivity. You can also nudge the receiver just into oscillation to receive CW or SSB signals.

[Selenium] built his prototype on an old receiver chassis because it had the IC and the variable capacitor already in place. However, others have built successful copies on breadboards ([Austin Heller] created several good looking breadboard versions) and on PCB material. [Selenium] also released some other unique LM386-based designs that use more parts (and, probably, have better performance). Looks like a simple way to build a practical receiver.

Lithium Ion Upgraded Lawnmower

Upgraded LiPo Lawnmower Now Has Plenty Of Juice

Back in 2010, [Dave] took a stand. He gave up his dependence on gasoline for his lawn mower, and bought a CubCadet CC500 48V lead acid powered electric lawnmower. Within two years, the batteries had already kicked the bucket. Unwilling to let go, he replaced half of the batteries, but that wasn’t enough. It now took him two charging cycles to mow his lawn once

Enough was enough. He had to replace the whole set — but this time, with LiPo.

As an avid lover of drones, he’s been using LiPo batteries for other things for quite a while. He did some calculations and figured he would only need about 10,000mAh at 48V for a 40 minute run time, which would still be a pretty pricey upgrade. So instead he started with 2 x 22.2V 5,200mAh packs instead ($200). As it turned out, that was more than enough.

The circuitry in the CubCadet was pretty straight forward, so it was almost a drop in replacement, minus the need to use a different charger. He added in a switch to flip between charging and mowing modes to allow him to use the LiPo charger without damaging anything.

Now all he needs to do is give it an Internet connection or maybe make it remote-controlled…