Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: PCAL9555_Hello OM13082-JoyStick OM13082_LED OM13082-test ... more
You are viewing an older revision! See the latest version
Homepage
What is this?¶
This conponent library is compatible to basic operation os GPIO expanders: PCAL9555, PCA9555, PCA9535, PCA9539, PCAL9554, PCA9554 and PCA9538 .
On addition to this, this library is including mbed-SDK-style APIs. APIs that similar to DigitaiInOut, DigitalOut, DigitalIn, BusInOut, BusOut and BusIn are available.
How to use?¶
Very basic register level I/O bit operation¶
PCAL9555 and PCAL9554 are class libraries for those compatible GPIO expander chips.
Those class libraries provides interface for bit operation of its I/O port.
For 16-bit GPIO expanders, the input/output access and its direction setting can be done by 16-bit data. For 8-bit GPIO expanders, those can be done by 8-bit data.
#include "mbed.h"
#include "PCAL9555.h"
PCAL9555 gpio( p28, p27, 0xE8 ); // using PCA9539
int main() {
gpio.configure( 0xFFFF ); // Set all pins: input
printf( " 0x%04X\r\n", (int)gpio );// Print pins state
gpio.configure( 0x0000 ); // Set all pins: output
int count = 0;
while(1) {
gpio.write( count++ );
}
}
High level APIs¶
To use the GPIO expanders more simple, this library is including mbed-SDK-style APIs.
APIs that similar to DigitaiInOut, DigitalOut, DigitalIn, BusInOut, BusOut and BusIn are available.
GpioDigitalOut, GpioDigitaiInOut, GpioDigitalIn¶
Next code shows sample of DigitalOut equivalent API GpioDigitalOut usage.
A pin on the PCAL9555 is defined as pin and its state is changed by assignment.
(For single pin operation, GpioDigitaiInOut and GpioDigitalIn are available also.)
#include "mbed.h"
#include "PCAL9555.h"
PCAL9555 gpio_exp( p28, p27, 0xE8 ); // SDA, SCL, Slave_address(option)
GpioDigitalOut pin( gpio_exp, X0_0 );
int main() {
while( 1 ) {
pin = 1;
wait( 0.2 );
pin = 0;
wait( 0.2 );
}
}
GpioBusOut, GpioBusInOut, GpioBusIn¶
BusOut equivalent API GpioBusOut is available too.
In next code, pins are grouped as mypins to manage the output as bus output.
(For single pin operation, GpioBusInOut and GpioBusIn are available also.)
#include "mbed.h"
#include "PCAL9555.h"
PCAL9555 gpio_exp( p28, p27, 0xE8 ); // SDA, SCL, Slave_address(option)
GpioBusOut mypins( gpio_exp, X0_0, X0_1, X0_2, X0_3 );
int main() {
while( 1 ) {
for( int i = 0; i < 16; i++ ) {
mypins = i;
wait( 0.25 );
}
}
}
The high level APIs can be used in combination¶
Those high level APIs can be used in combination.
Each pins can be managed by instances.
#include "mbed.h"
#include "PCAL9555.h"
PCAL9555 gpio( p28, p27, 0xE8 ); // using PCA9539
// The GPIO pins are grouped in some groups and operated as bus I/O
GpioBusIn bus_in( gpio, X0_0, X0_1, X0_2, X0_3 );
GpioBusOut bus_out( gpio, X0_4, X0_5, X0_6 );
GpioBusInOut bus_io( gpio, X1_7, X1_6, X1_5, X1_4, X1_3, X1_2, X1_1, X1_0 );
GpioDigitalOut myled( gpio, X0_7 );
int main() {
bus_io.input();
printf( "I/O = 0x%02X\r\n", (int)bus_io );
printf( "In = 0x%01X\r\n", (int)bus_in );
bus_io.output();
int count = 0;
while(1) {
bus_out = count;
bus_io = count;
myled = count & 0x1;
count++;
wait( 0.1 );
}
}