<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://www.ethernut.de/nutwiki/index.php?action=history&amp;feed=atom&amp;title=I2C_IO-Expander</id>
		<title>I2C IO-Expander - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://www.ethernut.de/nutwiki/index.php?action=history&amp;feed=atom&amp;title=I2C_IO-Expander"/>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=I2C_IO-Expander&amp;action=history"/>
		<updated>2026-04-18T20:04:13Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.2</generator>

	<entry>
		<id>http://www.ethernut.de/nutwiki/index.php?title=I2C_IO-Expander&amp;diff=128&amp;oldid=prev</id>
		<title>Harald: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=I2C_IO-Expander&amp;diff=128&amp;oldid=prev"/>
				<updated>2016-10-27T16:02:56Z</updated>
		
		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='1' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 16:02, 27 October 2016&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan='2' style='text-align: center;' lang='en'&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Harald</name></author>	</entry>

	<entry>
		<id>http://www.ethernut.de/nutwiki/index.php?title=I2C_IO-Expander&amp;diff=127&amp;oldid=prev</id>
		<title>Niziak: New page: == Description ==  This text explains how to access an I2C PCF8574 expander.  == PCF8574 short description ==  * works from 2.5 to 6V   * selectable I2C address range from 0x20 to 0x27 for...</title>
		<link rel="alternate" type="text/html" href="http://www.ethernut.de/nutwiki/index.php?title=I2C_IO-Expander&amp;diff=127&amp;oldid=prev"/>
				<updated>2011-02-18T10:56:07Z</updated>
		
		<summary type="html">&lt;p&gt;New page: == Description ==  This text explains how to access an I2C PCF8574 expander.  == PCF8574 short description ==  * works from 2.5 to 6V   * selectable I2C address range from 0x20 to 0x27 for...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Description ==&lt;br /&gt;
&lt;br /&gt;
This text explains how to access an I2C PCF8574 expander.&lt;br /&gt;
&lt;br /&gt;
== PCF8574 short description ==&lt;br /&gt;
 * works from 2.5 to 6V &lt;br /&gt;
 * selectable I2C address range from 0x20 to 0x27 for PCF8574 or from 0x38 to 0x3F for PCF8574A. Device Address can be configured by A0-A2 pins. Address pins can be simply shorted to power or ground line.&lt;br /&gt;
 * very small current source (100uA) when output is set to HIGH (thus pull-ups are required if needed). It is better to use negative logic and drive outputs by selecting LOW state.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
Examples below was tested with NUT/OS 4.8.8.0 and Atmel AT91SAM7X256 processor. Both of software TWI (bit banging mode) and hardware TWI works with these expanders.&lt;br /&gt;
Three PCF8574 expanders was used with LEDs connected between expander's IO ports and 3.3V source (with resistors of course).&lt;br /&gt;
Expanders addresses were set to 0x20, 0x21 and 0x22.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source Code ==&lt;br /&gt;
First expander is set to turn on all LEDs. Next two are used in input mode. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    #define I2C_TIMEOUT_MS          500&lt;br /&gt;
    #define I2C_SLA_PCF8574_BASE    0x20&lt;br /&gt;
    #define I2C_SLA_PCF8574A_BASE   0x38&lt;br /&gt;
    #define NUM_OF_PCFS             3&lt;br /&gt;
&lt;br /&gt;
    unsigned long ulI2CSpeed;&lt;br /&gt;
    unsigned char ucRXBuf, ucTXBuf;&lt;br /&gt;
    unsigned char ucSlaveAddr;&lt;br /&gt;
    unsigned char ucBit;&lt;br /&gt;
    int iStatus;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Init I2C line\n&amp;quot;);&lt;br /&gt;
    ulI2CSpeed = 100000;&lt;br /&gt;
    TwInit (0);&lt;br /&gt;
    if (-1==TwIOCtl (TWI_SETSPEED, &amp;amp;ulI2CSpeed))&lt;br /&gt;
    {&lt;br /&gt;
        printf (&amp;quot;I2C Clock set failed!\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
  for (;;) {&lt;br /&gt;
        printf (&amp;quot;Sleeping...\n&amp;quot;);&lt;br /&gt;
        NutSleep(1000);&lt;br /&gt;
        for (ucSlaveAddr=I2C_SLA_PCF8574_BASE; ucSlaveAddr&amp;lt;(I2C_SLA_PCF8574_BASE+NUM_OF_PCFS); ucSlaveAddr++)&lt;br /&gt;
        {&lt;br /&gt;
            // set output state for each expander:&lt;br /&gt;
            switch (ucSlaveAddr)&lt;br /&gt;
            {&lt;br /&gt;
                case 0x20:  //first PCF&lt;br /&gt;
                    ucTXBuf = 0;    // turn on all LEDs connected between PCF and Vdd&lt;br /&gt;
                    break;&lt;br /&gt;
                case 0x21:&lt;br /&gt;
                case 0x22:&lt;br /&gt;
                default:&lt;br /&gt;
                    ucTXBuf = 0xFF; // all outputs to HIGH state&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            printf (&amp;quot;Reading slave @0x%02X ... &amp;quot;, ucSlaveAddr);&lt;br /&gt;
            iStatus = TwMasterTransact(ucSlaveAddr, &amp;amp;ucTXBuf, sizeof(ucTXBuf), &amp;amp;ucRXBuf, sizeof(ucRXBuf), I2C_TIMEOUT_MS);&lt;br /&gt;
            if (iStatus==-1)&lt;br /&gt;
            {&lt;br /&gt;
                printf(&amp;quot;timed out!\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                printf (&amp;quot;Received %d bytes. Val=0x%02X&amp;quot;, iStatus, ucRXBuf);&lt;br /&gt;
                printf (&amp;quot; bin=&amp;quot;);&lt;br /&gt;
                for (ucBit=8; ucBit&amp;gt;0; ucBit--)&lt;br /&gt;
                {&lt;br /&gt;
                    printf ( &amp;quot;%d&amp;quot;, 0!=(ucRXBuf &amp;amp; (1&amp;lt;&amp;lt;(ucBit-1))) );&lt;br /&gt;
                }&lt;br /&gt;
                printf (&amp;quot;\n&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            NutSleep(200);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Walking light example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    #define I2C_TIMEOUT_MS          500&lt;br /&gt;
    #define I2C_SLA_PCF8574_BASE    0x20&lt;br /&gt;
&lt;br /&gt;
    unsigned long ulI2CSpeed;&lt;br /&gt;
    unsigned char ucRXBuf, ucTXBuf;&lt;br /&gt;
    unsigned char ucSlaveAddr;&lt;br /&gt;
    unsigned char ucBit;&lt;br /&gt;
    int iStatus;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;Init I2C line\n&amp;quot;);&lt;br /&gt;
    ulI2CSpeed = 100000;&lt;br /&gt;
    TwInit (0);&lt;br /&gt;
    if (-1==TwIOCtl (TWI_SETSPEED, &amp;amp;ulI2CSpeed))&lt;br /&gt;
    {&lt;br /&gt;
        printf (&amp;quot;I2C Clock set failed!\n&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    ucBit = 0;&lt;br /&gt;
    unsigned char ucSlaveAddrOld;&lt;br /&gt;
    ucSlaveAddr = I2C_SLA_PCF8574_BASE + (ucBit/8);&lt;br /&gt;
    for (;;)&lt;br /&gt;
    {&lt;br /&gt;
        ucSlaveAddrOld = ucSlaveAddr;&lt;br /&gt;
        ucSlaveAddr = I2C_SLA_PCF8574_BASE + (ucBit/8);&lt;br /&gt;
&lt;br /&gt;
        // expander address changed - switch off all ports on previous expander&lt;br /&gt;
        if (ucSlaveAddr!=ucSlaveAddrOld)&lt;br /&gt;
        {&lt;br /&gt;
            ucTXBuf = 0xFF;&lt;br /&gt;
            iStatus = TwMasterTransact(ucSlaveAddrOld, &amp;amp;ucTXBuf, sizeof(ucTXBuf), 0, 0, I2C_TIMEOUT_MS);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        ucTXBuf = 0xFF &amp;amp; ~(1&amp;lt;&amp;lt;(ucBit%8));&lt;br /&gt;
        //printf (&amp;quot;ucBit=%02d ucTXBuf=0x%02X\n&amp;quot;, ucBit, ucTXBuf);&lt;br /&gt;
        //printf (&amp;quot;Slave @0x%02X ... &amp;quot;, ucSlaveAddr);&lt;br /&gt;
&lt;br /&gt;
        iStatus = TwMasterTransact(ucSlaveAddr, &amp;amp;ucTXBuf, sizeof(ucTXBuf), 0, 0, I2C_TIMEOUT_MS);&lt;br /&gt;
        if (iStatus==-1)&lt;br /&gt;
        {&lt;br /&gt;
            printf(&amp;quot;timed out!\n&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (++ucBit&amp;gt;23)&lt;br /&gt;
        {&lt;br /&gt;
            ucBit = 0;&lt;br /&gt;
        }&lt;br /&gt;
        NutSleep (20);&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* More [[Nut/OS Examples]]&lt;/div&gt;</summary>
		<author><name>Niziak</name></author>	</entry>

	</feed>