Remote 8-bit I/O expander for I2C-bus with interrupt
Revision 2:5cbf7e01ee23, committed 2017-10-11
- 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;