I'm trying to understand how the I2C "General Call Address" is supposed to work for implementing in a microcontroller.

According to the I2C Specification (PDF), Section 3.1.13:

When bit B is a 'zero', the second byte has the following definition:

  • 0000 0110 (06h): Reset and write programmable part of slave address by hardware. On receiving this 2-byte sequence, all devices designed to respond to the general call address reset and take in the programmable part of their address. Precautions must be taken to ensure that a device is not pulling down the SDA or SCL line after applying the supply voltage, since these low levels would block the bus.

  • 0000 0100 (04h): Write programmable part of slave address by hardware. Behaves as above, but the device does not reset.

How is the "programmable" part of the slave address supposed to be set? Is there supposed to be a third byte in the general-call command?


The meaning of 'take in' the address is for the slave to read whatever address programming lines are present on them and re-establish the programmable part of their addresses from them.

As soon as 06h is received, the devices will soft-reset and take in their programmable address from their address lines. For 04h, they don't fully reset, but simply take in their programmable address from their address lines. There is no third byte.

  • \$\begingroup\$ I think this addressing scheme exists to enable the cases when the external address bits are not permanently present on the external pins. They are present at a specific time when they are taken in. Then these pins can be used for other functions. I came across this kind of addressing scheme in AS1115. It's a 7-segment display driver with a keypad scanner. The two programmable I2C address bits are “woven” into the keypad scanner. \$\endgroup\$ – Nick Alexeev Jul 27 '15 at 3:08

I remember using general call in PIC24 micro-controller for interfacing a microchip DAC MCP4728 over I2C which may be usefule for your problem.

Now by default the microchip sets the slave address as some hardcoded value.This value can be read by sending ReadAddress command as specified datasheet by microchip.If you want to change the slave address ,there are sequence of timing and bytes to be sent to accomplish that.

Here is such way mentioned in datasheet.You need to translate it to C language code as some function to implement it.

Write Command

  • 1
    \$\begingroup\$ Not sure what this has to do with general call - the cited datasheet page doesn't seem to relate to 06h. \$\endgroup\$ – Adam Lawrence Apr 2 '14 at 12:19

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.