Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mcp23017 driver update #19

Closed
wants to merge 18 commits into from
Closed
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions mcp23017_driver/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
# Documentation
# MCP23017 I/O Expander - Driver

[Datasheet](https://ww1.microchip.com/downloads/aemDocuments/documents/APID/ProductDocuments/DataSheets/MCP23017-Data-Sheet-DS20001952.pdf)
- **Author - Enrico Dalla Croce (Kalsifer-742)**
- **Date - 30/11/2023**

## Documentation

- [Datasheet](https://ww1.microchip.com/downloads/aemDocuments/documents/APID/ProductDocuments/DataSheets/MCP23017-Data-Sheet-DS20001952.pdf)


### API
Expand Down
291 changes: 25 additions & 266 deletions mcp23017_driver/mcp23017.c
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
/**
* @author Enrico Dalla Croce (Kalsifer-742)
* @date 30/11/2023
*/

#include "mcp23017.h"

uint8_t get_register_bit(uint8_t register_value, uint8_t index) {
Expand Down Expand Up @@ -71,6 +76,16 @@ HAL_StatusTypeDef write_register_bit(MCP23017_t* hdev, uint8_t register_address,
return HAL_Status;
}

HAL_StatusTypeDef init(MCP23017_t* hdev, I2C_HandleTypeDef* hi2c, uint8_t device_address, uint8_t i2c_timeout) {
HAL_StatusTypeDef HAL_Status;

hdev->hi2c = hi2c;
hdev->device_address = device_address;
hdev->i2c_timeout = i2c_timeout;

return HAL_Status;
}

HAL_StatusTypeDef get_config(MCP23017_t* hdev, uint8_t* config) {
HAL_StatusTypeDef HAL_Status;

Expand All @@ -93,16 +108,6 @@ HAL_StatusTypeDef set_config(MCP23017_t* hdev, uint8_t config) {
return HAL_Status;
}

HAL_StatusTypeDef init(MCP23017_t* hdev, I2C_HandleTypeDef* hi2c, uint8_t device_address, uint8_t i2c_timeout) {
HAL_StatusTypeDef HAL_Status;

hdev->hi2c = hi2c;
hdev->device_address = device_address;
hdev->i2c_timeout = i2c_timeout;

return HAL_Status;
}

HAL_StatusTypeDef reset_bank_config(MCP23017_t* hdev) {
HAL_StatusTypeDef HAL_Status;
// Assume IOCON.BANK = 1
Expand Down Expand Up @@ -141,268 +146,22 @@ HAL_StatusTypeDef reset_bank_config(MCP23017_t* hdev) {
return HAL_Status;
}

HAL_StatusTypeDef get_io_direction_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* direction) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_GPIOA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_GPIOB, pin_number, &bit_value);
}

if (HAL_Status == HAL_OK) {
*direction = bit_value;
}

return HAL_Status;
}

HAL_StatusTypeDef set_io_direction_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t direction) {
HAL_StatusTypeDef HAL_Status;

if (port == MCP23017_PORTA) {
HAL_Status = write_register_bit(hdev, REGISTER_IODIRA, pin_number, direction);
} else if (port == MCP23017_PORTB) {
HAL_Status = write_register_bit(hdev, REGISTER_IODIRB, pin_number, direction);
}

return HAL_Status;
}

HAL_StatusTypeDef get_input_polarity_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* mode) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_IPOLA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_IPOLB, pin_number, &bit_value);
}

if (HAL_Status == HAL_OK) {
*mode = bit_value;
}

return HAL_Status;
}

HAL_StatusTypeDef set_input_polarity_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t mode) {
HAL_StatusTypeDef HAL_Status;

if (port == MCP23017_PORTA) {
HAL_Status = write_register_bit(hdev, REGISTER_IPOLA, pin_number, mode);
} else if (port == MCP23017_PORTB) {
HAL_Status = write_register_bit(hdev, REGISTER_IPOLB, pin_number, mode);
}

return HAL_Status;
}

HAL_StatusTypeDef get_interrupt_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* status) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_GPINTENA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_GPINTENB, pin_number, &bit_value);
}

if (HAL_Status == HAL_OK) {
*status = bit_value;
}

return HAL_Status;
}

HAL_StatusTypeDef set_interrupt_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t status) {
HAL_StatusTypeDef HAL_Status;

if (port == MCP23017_PORTA) {
HAL_Status = write_register_bit(hdev, REGISTER_GPINTENA, pin_number, status);
} else if (port == MCP23017_PORTB) {
HAL_Status = write_register_bit(hdev, REGISTER_GPINTENB, pin_number, status);
}

return HAL_Status;
}

HAL_StatusTypeDef get_defval_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* defval) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_DEFVALA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_DEFVALB, pin_number, &bit_value);
}

if (HAL_Status == HAL_OK) {
*defval = bit_value;
}

return HAL_Status;
}

HAL_StatusTypeDef set_defval_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t defval) {
HAL_StatusTypeDef HAL_Status;

if (port == MCP23017_PORTA) {
HAL_Status = write_register_bit(hdev, REGISTER_DEFVALA, pin_number, defval);
} else if (port == MCP23017_PORTB) {
HAL_Status = write_register_bit(hdev, REGISTER_DEFVALB, pin_number, defval);
}

return HAL_Status;
}

HAL_StatusTypeDef get_interrupt_compare_mode_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* mode) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_INTCONA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_INTCONB, pin_number, &bit_value);
}

if (HAL_Status == HAL_OK) {
*mode = bit_value;
}

return HAL_Status;
}

HAL_StatusTypeDef set_interrupt_compare_mode_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t mode) {
HAL_StatusTypeDef HAL_Status;

if (port == MCP23017_PORTA) {
HAL_Status = write_register_bit(hdev, REGISTER_INTCONA, pin_number, mode);
} else if (port == MCP23017_PORTB) {
HAL_Status = write_register_bit(hdev, REGISTER_INTCONB, pin_number, mode);
}

return HAL_Status;
}

HAL_StatusTypeDef get_pull_up_resistor_status_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* status) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_INTCONA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_INTCONB, pin_number, &bit_value);
}

if (HAL_Status == HAL_OK) {
*status = bit_value;
}

return HAL_Status;
}

HAL_StatusTypeDef set_pull_up_resistor_status_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t status) {
HAL_StatusTypeDef HAL_Status;

if (port == MCP23017_PORTA) {
HAL_Status = write_register_bit(hdev, REGISTER_INTCONA, pin_number, status);
} else if (port == MCP23017_PORTB) {
HAL_Status = write_register_bit(hdev, REGISTER_INTCONB, pin_number, status);
}

return HAL_Status;
}

HAL_StatusTypeDef get_interrupt_flag_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* status) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_INTFA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_INTFB, pin_number, &bit_value);
}

if (HAL_Status == HAL_OK) {
*status = bit_value;
}

return HAL_Status;
}

HAL_StatusTypeDef get_interrupt_value_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* status) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_INTCAPA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_INTCAPB, pin_number, &bit_value);
}
GET_SET_VALUE_ON_PIN(io_direction, REGISTER_IODIRA, REGISTER_IODIRB)

if (HAL_Status == HAL_OK) {
*status = bit_value;
}
GET_SET_VALUE_ON_PIN(input_polarity, REGISTER_IPOLA, REGISTER_IPOLB)

return HAL_Status;
}
GET_SET_VALUE_ON_PIN(interrupt_status, REGISTER_GPINTENA, REGISTER_GPINTENB)

HAL_StatusTypeDef read_value_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* status) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_GPIOA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_GPIOB, pin_number, &bit_value);
}
GET_SET_VALUE_ON_PIN(defval, REGISTER_DEFVALA, REGISTER_DEFVALB)

if (HAL_Status == HAL_OK) {
*status = bit_value;
}
GET_SET_VALUE_ON_PIN(interrupt_compare_mode, REGISTER_INTCONA, REGISTER_INTCONB)

return HAL_Status;
}
GET_SET_VALUE_ON_PIN(pull_up_resistor_status, REGISTER_GPPUA, REGISTER_GPPUB)

HAL_StatusTypeDef write_value_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t value) {
HAL_StatusTypeDef HAL_Status;

if (port == MCP23017_PORTA) {
HAL_Status = write_register_bit(hdev, REGISTER_GPPUA, pin_number, value);
} else if (port == MCP23017_PORTB) {
HAL_Status = write_register_bit(hdev, REGISTER_GPPUB, pin_number, value);
}
GET_VALUE_ON_PIN(interrupt_flag, REGISTER_INTFA, REGISTER_INTFB)

return HAL_Status;
}
GET_VALUE_ON_PIN(interrupt_value, REGISTER_INTCAPA, REGISTER_INTCAPB)

HAL_StatusTypeDef get_output_latch_value_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t* status) {
HAL_StatusTypeDef HAL_Status;
uint8_t bit_value;

if (port == MCP23017_PORTA) {
HAL_Status = read_register_bit(hdev, REGISTER_INTCONA, pin_number, &bit_value);
} else if (port == MCP23017_PORTB) {
HAL_Status = read_register_bit(hdev, REGISTER_INTCONB, pin_number, &bit_value);
}
GET_SET_VALUE_ON_PIN(value, REGISTER_GPIOA, REGISTER_GPIOB)

if (HAL_Status == HAL_OK) {
*status = bit_value;
}

return HAL_Status;
}

HAL_StatusTypeDef set_output_latch_value_on_pin(MCP23017_t* hdev, uint8_t port, uint8_t pin_number, uint8_t status) {
HAL_StatusTypeDef HAL_Status;

if (port == MCP23017_PORTA) {
HAL_Status = write_register_bit(hdev, REGISTER_INTCONA, pin_number, status);
} else if (port == MCP23017_PORTB) {
HAL_Status = write_register_bit(hdev, REGISTER_INTCONB, pin_number, status);
}

return HAL_Status;
}
GET_SET_VALUE_ON_PIN(output_latch_value, REGISTER_OLATA, REGISTER_OLATB)
Loading
Loading