Port Expander Library
The mikroBasic PRO for 8051 provides a library for communication with the Microchip’s Port Expander MCP23S17 via SPI interface. Connections of the 8051 compliant MCU and MCP23S17 is given on the schematic at the bottom of this page.
Notes:
- Library uses the SPI module for communication. The user must initialize SPI module before using the Port Expander Library.
- Library does not use Port Expander interrupts.
External dependencies of Port Expander Library
| The following variables must be defined in all projects using Port Expander Library: | Description : | Example : |
|---|---|---|
dim SPExpanderCS as sbit bdata sfr external |
Chip Select line. | dim SPExpanderCS as sbit at P1_1_bit |
dim SPExpanderRST as sbit bdata sfr external |
Reset line. | dim SPExpanderRST as sbit at P1_0_bit |
Library Routines
- Expander_Init
- Expander_Read_Byte
- Expander_Write_Byte
- Expander_Read_PortA
- Expander_Read_PortB
- Expander_Read_PortAB
- Expander_Write_PortA
- Expander_Write_PortB
- Expander_Write_PortAB
- Expander_Set_DirectionPortA
- Expander_Set_DirectionPortB
- Expander_Set_DirectionPortAB
- Expander_Set_PullUpsPortA
- Expander_Set_PullUpsPortB
- Expander_Set_PullUpsPortAB
Expander_Init
| Prototype |
sub procedure Expander_Init(dim ModuleAddress as byte) |
|---|---|
| Returns |
Nothing. |
| Description |
Initializes Port Expander using SPI communication. Port Expander module settings :
Parameters :
|
| Requires |
SPI module needs to be initialized. See SPIx_Init and SPIx_Init_Advanced routines. |
| Example |
' port expander pinout definition
dim SPExpanderCS as sbit at P1_1_bit
SPExpanderRST as sbit at P1_0_bit
...
SPI1_Init() ' initialize SPI module
Expander_Init(0) ' initialize port expander
|
Expander_Read_Byte
| Prototype |
sub function Expander_Read_Byte(dim ModuleAddress as byte, dim RegAddress as byte) as byte |
|---|---|
| Returns |
Byte read. |
| Description |
The function reads byte from Port Expander. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. |
| Example |
' Read a byte from Port Expander's register dim read_data as byte ... read_data = Expander_Read_Byte(0,1) |
Expander_Write_Byte
| Prototype |
sub procedure Expander_Write_Byte(dim ModuleAddress as byte, dim RegAddress as byte, dim Data_ as byte) |
|---|---|
| Returns |
Nothing. |
| Description |
Routine writes a byte to Port Expander. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. |
| Example |
' Write a byte to the Port Expander's register Expander_Write_Byte(0,1,0xFF) |
Expander_Read_PortA
| Prototype |
sub function Expander_Read_PortA(dim ModuleAddress as byte) as byte |
|---|---|
| Returns |
Byte read. |
| Description |
The function reads byte from Port Expander's PortA. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortA should be configured as input. See Expander_Set_DirectionPortA and Expander_Set_DirectionPortAB routines. |
| Example |
' Read a byte from Port Expander's PORTA dim read_data as byte ... Expander_Set_DirectionPortA(0,0xFF) ' set expander's porta to be input ... read_data = Expander_Read_PortA(0) |
Expander_Read_PortB
| Prototype |
sub function Expander_Read_PortB(dim ModuleAddress as byte) as byte |
|---|---|
| Returns |
Byte read. |
| Description |
The function reads byte from Port Expander's PortB. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortB should be configured as input. See Expander_Set_DirectionPortB and Expander_Set_DirectionPortAB routines. |
| Example |
' Read a byte from Port Expander's PORTB dim read_data as byte ... Expander_Set_DirectionPortB(0,0xFF) ' set expander's portb to be input ... read_data = Expander_Read_PortB(0) |
Expander_Read_PortAB
| Prototype |
sub function Expander_Read_PortAB(dim ModuleAddress as byte) as word |
|---|---|
| Returns |
Word read. |
| Description |
The function reads word from Port Expander's ports. PortA readings are in the higher byte of the result. PortB readings are in the lower byte of the result. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortA and PortB should be configured as inputs. See Expander_Set_DirectionPortA, Expander_Set_DirectionPortB and Expander_Set_DirectionPortAB routines. |
| Example |
' Read a byte from Port Expander's PORTA and PORTB dim read_data as word ... Expander_Set_DirectionPortAB(0,0xFFFF) ' set expander's porta and portb to be input ... read_data = Expander_Read_PortAB(0) |
Expander_Write_PortA
| Prototype |
sub procedure Expander_Write_PortA(dim ModuleAddress as byte, dim Data_ as byte) |
|---|---|
| Returns |
Nothing. |
| Description |
The function writes byte to Port Expander's PortA. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortA should be configured as output. See Expander_Set_DirectionPortA and Expander_Set_DirectionPortAB routines. |
| Example |
' Write a byte to Port Expander's PORTA ... Expander_Set_DirectionPortA(0,0x00) ' set expander's porta to be output ... Expander_Write_PortA(0, 0xAA) |
Expander_Write_PortB
| Prototype |
sub procedure Expander_Write_PortB(dim ModuleAddress as byte, dim Data_ as byte) |
|---|---|
| Returns |
Nothing. |
| Description |
The function writes byte to Port Expander's PortB. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortB should be configured as output. See Expander_Set_DirectionPortB and Expander_Set_DirectionPortAB routines. |
| Example |
' Write a byte to Port Expander's PORTB ... Expander_Set_DirectionPortB(0,0x00) ' set expander's portb to be output ... Expander_Write_PortB(0, 0x55) |
Expander_Write_PortAB
| Prototype |
sub procedure Expander_Write_PortAB(dim ModuleAddress as byte, dim Data_ as word) |
|---|---|
| Returns |
Nothing. |
| Description |
The function writes word to Port Expander's ports. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. Port Expander's PortA and PortB should be configured as outputs. See Expander_Set_DirectionPortA, Expander_Set_DirectionPortB and Expander_Set_DirectionPortAB routines. |
| Example |
' Write a byte to Port Expander's PORTA and PORTB ... Expander_Set_DirectionPortAB(0,0x0000) ' set expander's porta and portb to be output ... Expander_Write_PortAB(0, 0xAA55) |
Expander_Set_DirectionPortA
| Prototype |
sub procedure Expander_Set_DirectionPortA(dim ModuleAddress as byte, dim Data_ as byte) |
|---|---|
| Returns |
Nothing. |
| Description |
The function sets Port Expander's PortA direction. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. |
| Example |
' Set Port Expander's PORTA to be output Expander_Set_DirectionPortA(0,0x00) |
Expander_Set_DirectionPortB
| Prototype |
sub procedure Expander_Set_DirectionPortB(dim ModuleAddress as byte, dim Data_ as byte) |
|---|---|
| Returns |
Nothing. |
| Description |
The function sets Port Expander's PortB direction. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. |
| Example |
' Set Port Expander's PORTB to be input Expander_Set_DirectionPortB(0,0xFF) |
Expander_Set_DirectionPortAB
| Prototype |
sub procedure Expander_Set_DirectionPortAB(dim ModuleAddress as byte, dim Direction as word) |
|---|---|
| Returns |
Nothing. |
| Description |
The function sets Port Expander's PortA and PortB direction. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. |
| Example |
' Set Port Expander's PORTA to be output and PORTB to be input Expander_Set_DirectionPortAB(0,0x00FF) |
Expander_Set_PullUpsPortA
| Prototype |
sub procedure Expander_Set_PullUpsPortA(dim ModuleAddress as byte, dim Data_ as byte) |
|---|---|
| Returns |
Nothing. |
| Description |
The function sets Port Expander's PortA pull up/down resistors. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. |
| Example |
' Set Port Expander's PORTA pull-up resistors Expander_Set_PullUpsPortA(0, 0xFF) |
Expander_Set_PullUpsPortB
| Prototype |
sub procedure Expander_Set_PullUpsPortB(dim ModuleAddress as byte, dim Data_ as byte) |
|---|---|
| Returns |
Nothing. |
| Description |
The function sets Port Expander's PortB pull up/down resistors. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. |
| Example |
' Set Port Expander's PORTB pull-up resistors Expander_Set_PullUpsPortB(0, 0xFF) |
Expander_Set_PullUpsPortAB
| Prototype |
sub procedure Expander_Set_PullUpsPortAB(dim ModuleAddress as byte, dim PullUps as word) |
|---|---|
| Returns |
Nothing. |
| Description |
The function sets Port Expander's PortA and PortB pull up/down resistors. Parameters :
|
| Requires |
Port Expander must be initialized. See Expander_Init. |
| Example |
' Set Port Expander's PORTA and PORTB pull-up resistors Expander_Set_PullUpsPortAB(0, 0xFFFF) |
Library Example
The example demonstrates how to communicate with Port Expander MCP23S17.
Note that Port Expander pins A2 A1 A0 are connected to GND so Port Expander Hardware Address is 0.
program Soft_SPI
dim i as byte
' Port Expander module connections
dim SPExpanderRST as sbit at P1_0_bit
dim SPExpanderCS as sbit at P1_1_bit
' End Port Expander module connections
dim SoftSpi_CLK as sbit at P1_7_bit
dim SoftSpi_SDI as sbit at P1_6_bit
dim SoftSpi_SDO as sbit at P1_5_bit
main:
i = 0
SPI_Rd_Ptr = @Soft_SPI_Read ' Link Port Expander Library to Software SPI library
Expander_Init(0) ' Initialize Port Expander
Expander_Set_DirectionPortA(0, 0x00) ' Set Expander's PORTA to be output
Expander_Set_DirectionPortB(0,0xFF) ' Set Expander's PORTB to be input
Expander_Set_PullUpsPortB(0,0xFF) ' Set pull-ups to all of the Expander's PORTB pins
while TRUE ' Endless loop
Expander_Write_PortA(0, i) ' Write i to expander's PORTA
Inc(i)
P2 = Expander_Read_PortB(0) ' Read expander's PORTB and write it to PORT0
Delay_ms(100)
wend
end.
HW Connection

Port Expander HW connection
What do you think about this topic ? Send us feedback!



