|
|
This module provides an interface to the popular MCP23017 GPIO extender with i2c interface.
It uses HiPi::Device::I2C as a backend
The module exports the following constants using tag mcp23017
use HiPi::Interface::MCP23017 qw( :mcp23017 );
# exports constants
# for bit positions in the IOCON register byte
MCP23017_BANK
MCP23017_MIRROR
MCP23017_SEQOP
MCP23017_DISSLW
MCP23017_HAEN
MCP23017_ODR
MCP23017_INTPOL
# for defining pin direction in the IODIRA/IODIRB registers
MCP23017_INPUT
MCP23017_OUTPUT
# if you like constants for pin levels
MCP23017_HIGH
MCP23017_LOW
Returns a new instance of the HiPi::Interface::MCP23017 class.
Optional key => values pairs in %params and their defaults
devicename => ( RPi board revision == 1 )
? '/dev/i2c-0' : '/dev/i2c-1',
address => 0x20,
Example overriding defaults
my $ext = HiPi::Interface::MCP23017->new(
devicename => '/dev/i2c-0',
address => 0x28,
);
Read an array of bit values ( 0 or 1 ) from the specified register.
$numbytes is the number of bytes to read - defaults to 1
# 1 byte ( 8 bits )
$bits[0] is populated from register bit 0 from the first byte
$bits[7] is populated from register bit 7 from the first byte
# 2 bytes ( 16 bits )
$bits[8] is populated from register bit 0 from the second byte
$register is a string containing the register name.
Valid values are:
'IODIRA', 'IPOLA', 'GPINTENA', 'DEFVALA', 'INTCONA',
'IOCON', 'GPPUA', 'INTFA', 'INTCAPA', 'GPIOA',
'OLATA', 'IODIRB','IPOLB', 'GPINTENB','DEFVALB',
'INTCONB','GPPUB', 'INTFB', 'INTCAPB', 'GPIOB',
'OLATB'
Examples:
# get the value ( 1 or 0 ) for pin A0
my @bits = $ext->read_register_bits('GPIOA');
my $a0value = $bits[0];
# get the value ( 1 or 0 ) for pin B6
my @bits = $ext->read_register_bits('GPIOB');
my $b6value = $bits[6];
# get the values for all 16 pins when registers
# are sequential
# i.e. ($ext->read_register_bits('IOCON'))[MCP23017_BANK] == 0;
my @bits = $ext->read_register_bits('GPIOA', 2);
# $bits[1] will contain value for pin A0
# $bits[9] will contain value for pin B1
# note that you can return all the values from
# the entire MCP23017 register assuming
# default sequential read mode with
my @bits = $ext->read_register_bits('GPIOA', 22 );
# which values are in which bits will depend
# on the current IOCON.BANK value
# i.e. ($ext->read_register_bits('IOCON'))[MCP23017_BANK]
# consult the MCP23017 data sheet
Write an array of bit values ( 0 or 1 ) to the specified register.
$bits[0] is written to register bit 0
$bits[7] is written to register bit 7
@bits can contain between 1 x 8 and 22 x 8 values
but writing the correct values for 22 * 8 bits
at once seems an unlikely thing to want to do.
$register is a string containing the register name.
Valid values are:
'IODIRA', 'IPOLA', 'GPINTENA', 'DEFVALA', 'INTCONA',
'IOCON', 'GPPUA', 'INTFA', 'INTCAPA', 'GPIOA',
'OLATA', 'IODIRB','IPOLB', 'GPINTENB','DEFVALB',
'INTCONB','GPPUB', 'INTFB', 'INTCAPB', 'GPIOB',
'OLATB'
Examples :
# starting in default power on mode, set pin B3 as an
# output and set its value high.
# note that when writing single values, each operation
# is essentially a read / write
# first set B3 as output
my @bits = $ext->read_register_bits( 'IODIRB' );
$bits[3] = 0; # the module provides the exported
# constants MCP23017_OUTPUT and MCP23017_INPUT
# which are very useful if you find using
# 0 to define an output pin and 1 to
# define an input pin confusing
$ext->write_register_bits( 'IODIRB', @bits );
# then set its value high
@bits = $ext->read_register_bits( 'GPIOB' );
$bits[3] = MCP23017_HIGH;
$ext->write_register_bits( 'GPIOB', @bits );
# switch mode to IOCON.BANK=1 - segregated registers
my @bits = $ext->read_register_bits( 'IOCON' );
$bits[MCP23017_BANK] = 1;
$ext->write_register_bits( 'IOCON', @bits );
# ensure A5 is an input and apply pull up resistor
my @bits = $ext->read_register_bits( 'GPIOA' );
$bits[5] = MCP23017_INPUT;
$ext->write_register_bits( 'GPIOA', @bits );
@bits = $ext->read_register_bits( 'GPPUA' );
$bits[5] = 1;
$ext->write_register_bits( 'GPPUA', @bits );
Read an array of bytes starting at the specified register.
$numbytes is the number of bytes to read - defaults to 1
$register is a string containing the register name.
Valid values are:
'IODIRA', 'IPOLA', 'GPINTENA', 'DEFVALA', 'INTCONA',
'IOCON', 'GPPUA', 'INTFA', 'INTCAPA', 'GPIOA',
'OLATA', 'IODIRB','IPOLB', 'GPINTENB','DEFVALB',
'INTCONB','GPPUB', 'INTFB', 'INTCAPB', 'GPIOB',
'OLATB'
It is often more convenient to use read_register_bits
which calls read_register_bytes internally and separates
the returned values into ordered bit values.
Calling read_register_bytes may be quicker if your
handling of the return values is more efficient than
read_register_bits.
Write an array of 1 or more bytes starting at the
specified register.
$register is a string containing the register name.
Valid values are:
'IODIRA', 'IPOLA', 'GPINTENA', 'DEFVALA', 'INTCONA',
'IOCON', 'GPPUA', 'INTFA', 'INTCAPA', 'GPIOA',
'OLATA', 'IODIRB','IPOLB', 'GPINTENB','DEFVALB',
'INTCONB','GPPUB', 'INTFB', 'INTCAPB', 'GPIOB',
'OLATB'
It is often more convenient to use write_register_bits
which calls write_register_bytes internally.
Calling write_register_bytes may be quicker if your
creating of the byte values is more efficient than
write_register_bits.