The mikroC PRO for AVR provides a library for communication with the
Microchip’s Port Expander MCP23S17 via SPI interface. Connections of the
AVR compliant MCU and MCP23S17 is given on the schematic at the bottom of this
page.
Important :
- The library uses the SPI module for communication. User must initialize the appropriate 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 : |
---|---|---|
extern sfr sbit SPExpanderRST; |
Reset line. | sbit SPExpanderRST at
PORTB0_bit; |
extern sfr sbit SPExpanderCS; |
Chip Select line. | sbit SPExpanderCS at
PORTB1_bit; |
extern sfr sbit SPExpanderRST_Direction; |
Direction of the Reset pin. | sbit SPExpanderRST_Direction at
DDB0_bit; |
extern sfr sbit SPExpanderCS_Direction; |
Direction of the Chip Select pin. | sbit SPExpanderCS_Direction at
DDB1_bit; |
Library Routines
- Expander_Init
- Expander_Init_Advanced
- 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 | void Expander_Init(char ModuleAddress); |
---|---|
Returns | Nothing. |
Description |
Initializes Port Expander using SPI communication. Port Expander module settings :
Parameters :
|
Requires | Global variables :
SPI module needs to be initialized. |
Example | // Port Expander module connections sbit SPExpanderRST at PORTB0_bit; sbit SPExpanderCS at PORTB1_bit; sbit SPExpanderRST_Direction at DDB0_bit; sbit SPExpanderCS_Direction at DDB1_bit; // End Port Expander module connections ... // If Port Expander Library uses SPI1 module SPI1_Init(); // Initialize SPI module used with PortExpander Expander_Init(0); // Initialize Port Expander |
Expander_Init_Advanced
Prototype | void Expander_Init_Advanced(char *rstPort, char rstPin, char haen); |
---|---|
Returns | Nothing. |
Description |
Initializes Port Expander using SPI communication. Parameters :
|
Requires |
SPI module needs to be initialized. |
Example | // Port Expander module connections sbit SPExpanderRST at RC0_bit; sbit SPExpanderCS at RC1_bit; sbit SPExpanderRST_Direction at TRISC0_bit; sbit SPExpanderCS_Direction at TRISC1_bit; // End Port Expander module connections ... ANSEL = 0; // Configure AN pins as digital I/O ANSELH = 0; // If Port Expander Library uses SPI module SPI1_Init(); // Initialize SPI module used with PortExpander Expander_Init_Advanced(&PORTB, 0, 0); // Initialize Port Expander |
Expander_Read_Byte
Prototype | char Expander_Read_Byte(char ModuleAddress, char RegAddress); |
---|---|
Returns | Byte read. |
Description |
The function reads byte from Port Expander. Parameters :
|
Requires | Port Expander must be initialized. |
Example | // Read a byte from Port Expander's register char read_data; ... read_data = Expander_Read_Byte(0,1); |
Expander_Write_Byte
Prototype | void Expander_Write_Byte(char ModuleAddress, char RegAddress, char Data_); |
---|---|
Returns | Nothing. |
Description |
Routine writes a byte to Port Expander. Parameters :
|
Requires | Port Expander must be initialized. |
Example | // Write a byte to the Port Expander's register Expander_Write_Byte(0,1,0xFF); |
Expander_Read_PortA
Prototype | char Expander_Read_PortA(char ModuleAddress); |
---|---|
Returns | Byte read. |
Description |
The function reads byte from Port Expander's PortA. Parameters :
|
Requires |
Port Expander must be initialized. Port Expander's PortA should be configured as input. |
Example | // Read a byte from Port Expander's PORTA char read_data; ... Expander_Set_DirectionPortA(0,0xFF); // set expander's porta to be input ... read_data = Expander_Read_PortA(0); |
Expander_Read_PortB
Prototype | char Expander_Read_PortB(char ModuleAddress); |
---|---|
Returns | Byte read. |
Description |
The function reads byte from Port Expander's PortB. Parameters :
|
Requires |
Port Expander must be initialized. Port Expander's PortB should be configured as input. |
Example | // Read a byte from Port Expander's PORTB char read_data; ... Expander_Set_DirectionPortB(0,0xFF); // set expander's portb to be input ... read_data = Expander_Read_PortB(0); |
Expander_Read_PortAB
Prototype | unsigned int Expander_Read_PortAB(char ModuleAddress); |
---|---|
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. Port Expander's PortA and PortB should be configured as inputs. |
Example | // Read a byte from Port Expander's PORTA and PORTB unsigned int read_data; ... Expander_Set_DirectionPortAB(0,0xFFFF); // set expander's porta and portb to be input ... read_data = Expander_Read_PortAB(0); |
Expander_Write_PortA
Prototype | void Expander_Write_PortA(char ModuleAddress, char Data_); |
---|---|
Returns | Nothing. |
Description |
The function writes byte to Port Expander's PortA. Parameters :
|
Requires |
Port Expander must be initialized. Port Expander's PortA should be configured as output. |
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 | void Expander_Write_PortB(char ModuleAddress, char Data_); |
---|---|
Returns | Nothing. |
Description |
The function writes byte to Port Expander's PortB. Parameters :
|
Requires |
Port Expander must be initialized. Port Expander's PortB should be configured as output. |
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 | void Expander_Write_PortAB(char ModuleAddress, unsigned int Data_); |
---|---|
Returns | Nothing. |
Description |
The function writes word to Port Expander's ports. Parameters :
|
Requires |
Port Expander must be initialized. Port Expander's PortA and PortB should be configured as outputs. |
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 | void Expander_Set_DirectionPortA(char ModuleAddress, char Data_); |
---|---|
Returns | Nothing. |
Description |
The function sets Port Expander's PortA direction. Parameters :
|
Requires | Port Expander must be initialized. |
Example | // Set Port Expander's PORTA to be output Expander_Set_DirectionPortA(0,0x00); |
Expander_Set_DirectionPortB
Prototype | void Expander_Set_DirectionPortB(char ModuleAddress, char Data_); |
---|---|
Returns | Nothing. |
Description |
The function sets Port Expander's PortB direction. Parameters :
|
Requires | Port Expander must be initialized. |
Example | // Set Port Expander's PORTB to be input Expander_Set_DirectionPortB(0,0xFF); |
Expander_Set_DirectionPortAB
Prototype | void Expander_Set_DirectionPortAB(char ModuleAddress, unsigned int Direction); |
---|---|
Returns | Nothing. |
Description |
The function sets Port Expander's PortA and PortB direction. Parameters :
|
Requires | Port Expander must be initialized. |
Example | // Set Port Expander's PORTA to be output and PORTB to be input Expander_Set_DirectionPortAB(0,0x00FF); |
Expander_Set_PullUpsPortA
Prototype | void Expander_Set_PullUpsPortA(char ModuleAddress, char Data_); |
---|---|
Returns | Nothing. |
Description |
The function sets Port Expander's PortA pull up/down resistors. Parameters :
|
Requires | Port Expander must be initialized. |
Example | // Set Port Expander's PORTA pull-up resistors Expander_Set_PullUpsPortA(0, 0xFF); |
Expander_Set_PullUpsPortB
Prototype | void Expander_Set_PullUpsPortB(char ModuleAddress, char Data_); |
---|---|
Returns | Nothing. |
Description |
The function sets Port Expander's PortB pull up/down resistors. Parameters :
|
Requires | Port Expander must be initialized. |
Example | // Set Port Expander's PORTB pull-up resistors Expander_Set_PullUpsPortB(0, 0xFF); |
Expander_Set_PullUpsPortAB
Prototype | void Expander_Set_PullUpsPortAB(char ModuleAddress, unsigned int PullUps); |
---|---|
Returns | Nothing. |
Description |
The function sets Port Expander's PortA and PortB pull up/down resistors. Parameters :
|
Requires | Port Expander must be initialized. |
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
.// Port Expander module connectionssbit SPExpanderRST at PORTB0_bit;sbit SPExpanderCS at PORTB1_bit;sbit SPExpanderRST_Direction at DDB0_bit;sbit SPExpanderCS_Direction at DDB1_bit;// End Port Expander module connectionsunsigned char i = 0;void main() {DDRC = 0xFF; // Set PORTC as output// If Port Expander Library uses SPI1 moduleSPI1_Init(); // Initialize SPI module used with PortExpander// // If Port Expander Library uses SPI2 module// SPI2_Init(); // Initialize SPI module used with PortExpanderExpander_Init(0); // Initialize Port ExpanderExpander_Set_DirectionPortA(0, 0x00); // Set Expander's PORTA to be outputExpander_Set_DirectionPortB(0,0xFF); // Set Expander's PORTB to be inputExpander_Set_PullUpsPortB(0,0xFF); // Set pull-ups to all of the Expander's PORTB pinswhile(1) { // Endless loopExpander_Write_PortA(0, i++); // Write i to expander's PORTAPORTC = Expander_Read_PortB(0); // Read expander's PORTB and write it to LEDsDelay_ms(50);}}
No comments:
Post a Comment