Remote 8-bit I/O expander for I2C-bus with interrupt

Files at this revision

API Documentation at this revision

Comitter:
mcm
Date:
Wed Oct 11 16:06:06 2017 +0000
Parent:
1:26bfcb9024a0
Commit message:
The driver was completed and tested, it works as expected.

Changed in this revision

PCF8574.cpp Show annotated file Show diff for this revision Revisions of this file
PCF8574.h Show annotated file Show diff for this revision Revisions of this file
--- a/PCF8574.cpp	Wed Oct 11 14:43:38 2017 +0000
+++ b/PCF8574.cpp	Wed Oct 11 16:06:06 2017 +0000
@@ -19,7 +19,7 @@
 
 PCF8574::PCF8574 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
     : i2c          ( sda, scl )
-    , PCF8574_Addr  ( addr )
+    , PCF8574_Addr ( addr )
 {
     i2c.frequency( freq );
 }
--- a/PCF8574.h	Wed Oct 11 14:43:38 2017 +0000
+++ b/PCF8574.h	Wed Oct 11 16:06:06 2017 +0000
@@ -22,7 +22,91 @@
 /**
     Example:
 
-[TODO]
+#include "mbed.h"
+#include "PCF8574.h"
+
+
+PCF8574     myDevice        ( I2C_SDA, I2C_SCL, PCF8574::PCF8574_ADDRESS_0, 400000 );
+
+Ticker      newReading;
+DigitalOut  myled1          ( LED1 );
+DigitalOut  myled2          ( LED2 );
+InterruptIn myPCF8574INT    ( p8 );
+
+
+PCF8574::PCF8574_status_t    aux;
+uint32_t                     mySTATE       =   0;
+
+
+void flip ( void )
+{
+    PCF8574::PCF8574_vector_data_t   myData;
+
+    // Read the port to check P7 status
+    aux         =   myDevice.PCF8574_ReadPins ( &myData );
+
+    if ( ( myData.data & PCF8574::PCF8574_P7_MASK ) == PCF8574::PCF8574_P7_MASK )
+        myled2    =   1;                                                        // Turn the LED 2 on when P7 is HIGH
+    else
+        myled2    =   0;                                                        // Turn the LED 2 off when P7 is LOW
+}
+
+
+
+void changeDATA ( void )
+{
+    PCF8574::PCF8574_vector_data_t   myData;
+
+
+    myled1    =  1;
+
+
+    // Read the port to mask P7
+    aux         =   myDevice.PCF8574_ReadPins ( &myData );
+    myData.data =   ( myData.data & PCF8574::PCF8574_P7_MASK );
+
+    // Change the state of the PCF8574 pins: P[O-6]
+    if ( mySTATE == 0 ) {
+        myData.data  |=   ( PCF8574::PCF8574_P0_OUTPUT_LOW | PCF8574::PCF8574_P1_OUTPUT_HIGH | PCF8574::PCF8574_P2_OUTPUT_LOW | PCF8574::PCF8574_P3_OUTPUT_HIGH |
+                            PCF8574::PCF8574_P4_OUTPUT_LOW | PCF8574::PCF8574_P5_OUTPUT_HIGH | PCF8574::PCF8574_P6_OUTPUT_LOW );
+
+        aux           =   myDevice.PCF8574_SetPins  ( myData );
+
+        mySTATE       =   1;
+    } else {
+        myData.data  |=   ( PCF8574::PCF8574_P0_OUTPUT_HIGH | PCF8574::PCF8574_P1_OUTPUT_LOW | PCF8574::PCF8574_P2_OUTPUT_HIGH | PCF8574::PCF8574_P3_OUTPUT_LOW |
+                            PCF8574::PCF8574_P4_OUTPUT_HIGH | PCF8574::PCF8574_P5_OUTPUT_LOW | PCF8574::PCF8574_P6_OUTPUT_HIGH );
+
+        aux           =   myDevice.PCF8574_SetPins  ( myData );
+
+        mySTATE       =   0;
+    }
+
+    myled1    =  0;
+}
+
+
+int main()
+{
+    PCF8574::PCF8574_vector_data_t   myData;
+
+    // Configure PCF8574: P[0-6] OUTPUTs, P7 INPUT
+    myData.data   =   ( PCF8574::PCF8574_P0_OUTPUT_LOW | PCF8574::PCF8574_P1_OUTPUT_LOW | PCF8574::PCF8574_P2_OUTPUT_LOW | PCF8574::PCF8574_P3_OUTPUT_LOW |
+                        PCF8574::PCF8574_P4_OUTPUT_LOW | PCF8574::PCF8574_P5_OUTPUT_LOW | PCF8574::PCF8574_P6_OUTPUT_LOW | PCF8574::PCF8574_P7_INPUT      );
+
+    aux           =    myDevice.PCF8574_SetPins ( myData );
+
+
+    myPCF8574INT.mode( PullUp );
+    myPCF8574INT.fall( &flip );                                                 // attach the address of the flip function to the falling edge
+    newReading.attach( &changeDATA, 0.5 );                                      // the address of the function to be attached ( changeDATA ) and the interval ( 0.5s )
+
+
+    // Let the callbacks take care of everything
+    while(1) {
+        sleep();
+    }
+}
 */
 
 
@@ -37,23 +121,23 @@
     *                             its functionality remains the same.
     */
     typedef enum {
-        PCF8574_ADDRESS_0     =   0x20,                   /*!<   A2 A1 A0: 000                                            */
-        PCF8574_ADDRESS_1     =   0x21,                   /*!<   A2 A1 A0: 001                                            */
-        PCF8574_ADDRESS_2     =   0x22,                   /*!<   A2 A1 A0: 010                                            */
-        PCF8574_ADDRESS_3     =   0x23,                   /*!<   A2 A1 A0: 011                                            */
-        PCF8574_ADDRESS_4     =   0x24,                   /*!<   A2 A1 A0: 100                                            */
-        PCF8574_ADDRESS_5     =   0x25,                   /*!<   A2 A1 A0: 101                                            */
-        PCF8574_ADDRESS_6     =   0x26,                   /*!<   A2 A1 A0: 110                                            */
-        PCF8574_ADDRESS_7     =   0x27,                   /*!<   A2 A1 A0: 111                                            */
+        PCF8574_ADDRESS_0     =   ( 0x20 << 1 ),                 /*!<   A2 A1 A0: 000                                            */
+        PCF8574_ADDRESS_1     =   ( 0x21 << 1 ),                 /*!<   A2 A1 A0: 001                                            */
+        PCF8574_ADDRESS_2     =   ( 0x22 << 1 ),                 /*!<   A2 A1 A0: 010                                            */
+        PCF8574_ADDRESS_3     =   ( 0x23 << 1 ),                 /*!<   A2 A1 A0: 011                                            */
+        PCF8574_ADDRESS_4     =   ( 0x24 << 1 ),                 /*!<   A2 A1 A0: 100                                            */
+        PCF8574_ADDRESS_5     =   ( 0x25 << 1 ),                 /*!<   A2 A1 A0: 101                                            */
+        PCF8574_ADDRESS_6     =   ( 0x26 << 1 ),                 /*!<   A2 A1 A0: 110                                            */
+        PCF8574_ADDRESS_7     =   ( 0x27 << 1 ),                 /*!<   A2 A1 A0: 111                                            */
 
-        PCF8574A_ADDRESS_0    =   0x38,                   /*!<   A2 A1 A0: 000                                            */
-        PCF8574A_ADDRESS_1    =   0x39,                   /*!<   A2 A1 A0: 001                                            */
-        PCF8574A_ADDRESS_2    =   0x3A,                   /*!<   A2 A1 A0: 010                                            */
-        PCF8574A_ADDRESS_3    =   0x3B,                   /*!<   A2 A1 A0: 011                                            */
-        PCF8574A_ADDRESS_4    =   0x3C,                   /*!<   A2 A1 A0: 100                                            */
-        PCF8574A_ADDRESS_5    =   0x3D,                   /*!<   A2 A1 A0: 101                                            */
-        PCF8574A_ADDRESS_6    =   0x3E,                   /*!<   A2 A1 A0: 110                                            */
-        PCF8574A_ADDRESS_7    =   0x3F                    /*!<   A2 A1 A0: 111                                            */
+        PCF8574A_ADDRESS_0    =   ( 0x38 << 1 ),                 /*!<   A2 A1 A0: 000                                            */
+        PCF8574A_ADDRESS_1    =   ( 0x39 << 1 ),                 /*!<   A2 A1 A0: 001                                            */
+        PCF8574A_ADDRESS_2    =   ( 0x3A << 1 ),                 /*!<   A2 A1 A0: 010                                            */
+        PCF8574A_ADDRESS_3    =   ( 0x3B << 1 ),                 /*!<   A2 A1 A0: 011                                            */
+        PCF8574A_ADDRESS_4    =   ( 0x3C << 1 ),                 /*!<   A2 A1 A0: 100                                            */
+        PCF8574A_ADDRESS_5    =   ( 0x3D << 1 ),                 /*!<   A2 A1 A0: 101                                            */
+        PCF8574A_ADDRESS_6    =   ( 0x3E << 1 ),                 /*!<   A2 A1 A0: 110                                            */
+        PCF8574A_ADDRESS_7    =   ( 0x3F << 1 )                  /*!<   A2 A1 A0: 111                                            */
     } PCF8574_address_t;