Skip to content

Commit

Permalink
Newnewfeat/pca (#198)
Browse files Browse the repository at this point in the history
* changes finalized

* finalized 2

* struct fix

* final final

* removing the i2c_handler, preping for cerb changes

* Better Documentation

* added doxygen comments, removed unnecessary comments

* added param & ret comments

---------

Co-authored-by: Ruben Noroian <rubennoro>
  • Loading branch information
rubennoro authored Dec 5, 2024
1 parent bbfb6c5 commit 6427e59
Show file tree
Hide file tree
Showing 2 changed files with 102 additions and 44 deletions.
95 changes: 73 additions & 22 deletions general/include/pca9539.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
#include <stdint.h>

/*
PCA 9539 16 bit GPIO expander. Datasheet:
https://www.ti.com/lit/ds/symlink/pca9539.pdf?ts=1716785085909
PCA 9539 16 bit GPIO expander. Datasheet: https://www.ti.com/lit/ds/symlink/pca9539.pdf?ts=1716785085909
*/

/// Possible I2C addresses, see comment below
Expand Down Expand Up @@ -36,31 +35,83 @@ PCA 9539 16 bit GPIO expander. Datasheet:
#define PCA_DIRECTION_0_REG 0x06
#define PCA_DIRECTION_1_REG 0x07

/**
* @brief Pointer to write function
*
*/
typedef int (*WritePtr)(uint16_t dev_addr, uint16_t mem_address,
uint16_t mem_add_size, uint8_t *data, uint16_t size,
int delay);

/**
* @brief Pointer to read function
*
*/
typedef int (*ReadPtr)(uint16_t dev_addr, uint16_t mem_address,
uint16_t mem_add_size, uint8_t *data, uint16_t size,
int delay);

typedef struct {
I2C_HandleTypeDef *i2c_handle;
WritePtr write;
ReadPtr read;

uint16_t dev_addr;
} pca9539_t;

/// Init PCA9539, a 16 bit I2C GPIO expander
void pca9539_init(pca9539_t *pca, I2C_HandleTypeDef *i2c_handle,
/**
* @brief Initialize the PCA9539 Driver
*
* @param pca pointer to a new driver struct
* @param writeFunc function pointer to HAL specific write func
* @param readFunc function pointer to HAL specific read func
* @param dev_addr i2c device address
*/
void pca9539_init(pca9539_t *pca, WritePtr writeFunc, ReadPtr readFunc,
uint8_t dev_addr);

/// @brief Read all pins on a bus, for example using reg_type input to get
/// incoming logic level
HAL_StatusTypeDef pca9539_read_reg(pca9539_t *pca, uint8_t reg_type,
uint8_t *buf);
/// @brief Read a specific pin on a bus, do not iterate over this, use read_pins
/// instead
HAL_StatusTypeDef pca9539_read_pin(pca9539_t *pca, uint8_t reg_type,
uint8_t pin, uint8_t *buf);

/// @brief Write all pins on a bus, for example using reg_type OUTPUT to set
/// logic level or DIRECTION to set as output
HAL_StatusTypeDef pca9539_write_reg(pca9539_t *pca, uint8_t reg_type,
uint8_t buf);
/// @brief Write a specific pin on a bus, do not iterate over this, use
/// write_pins instead
HAL_StatusTypeDef pca9539_write_pin(pca9539_t *pca, uint8_t reg_type,
uint8_t pin, uint8_t buf);
/**
* @brief Read the register of the PCA9539
*
* @param pca pointer to driver struct with read & write funcs
* @param reg_type type of register being read
* @param buf pointer to buffer storing reg data
* @return int Error code return
*/
int pca9539_read_reg(pca9539_t *pca, uint8_t reg_type, uint8_t *buf);

/**
* @brief Read the pin state of the PCA9539
*
* @param pca pointer to driver struct with read & write funcs
* @param reg_type type of register being read
* @param pin pin num to read
* @param buf pointer storing buffer state
* @return int Error code return
*/
int pca9539_read_pin(pca9539_t *pca, uint8_t reg_type, uint8_t pin,
uint8_t *buf);

/**
* @brief Write the register of the PCA9539
*
* @param pca pointer to driver struct with read & write funcs
* @param reg_type type of register being written to
* @param buf pointer with value to write to reg
* @return int Error code return
*/
int pca9539_write_reg(pca9539_t *pca, uint8_t reg_type, uint8_t buf);

/**
* @brief Write the pin of the PCA9539
*
* @param pca pointer to driver struct with read & write funcs
* @param reg_type type of register being written to
* @param pin pin to modify
* @param buf pointer with value to write to reg
* @return int Error code return
*/
int pca9539_write_pin(pca9539_t *pca, uint8_t reg_type, uint8_t pin,
uint8_t buf);

#endif
51 changes: 29 additions & 22 deletions general/src/pca9539.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,43 +4,51 @@

#define REG_SIZE_BITS 8

HAL_StatusTypeDef pca_write_reg(pca9539_t *pca, uint16_t address, uint8_t *data)
int pca_write_reg(pca9539_t *pca, uint16_t address, uint8_t *data)
{
// ensure shifting left one, HAL adds the write bit
return HAL_I2C_Mem_Write(pca->i2c_handle, pca->dev_addr, address,
I2C_MEMADD_SIZE_8BIT, data, 1, HAL_MAX_DELAY);
//Parameters in the HAL Function
uint16_t mem_add_size = 8;
uint16_t data_size = 1;
int delay = 0xFFFFFFFFU;

return pca->write(pca->dev_addr, address, mem_add_size, data, data_size,
delay);
}

HAL_StatusTypeDef pca_read_reg(pca9539_t *pca, uint16_t address, uint8_t *data)
int pca_read_reg(pca9539_t *pca, uint16_t address, uint8_t *data)
{
return HAL_I2C_Mem_Read(pca->i2c_handle, pca->dev_addr, address,
I2C_MEMADD_SIZE_8BIT, data, 1, HAL_MAX_DELAY);
uint16_t mem_add_size = 8;
uint16_t data_size = 1;
int delay = 0xFFFFFFFFU;

return pca->read(pca->dev_addr, address, mem_add_size, data, data_size,
delay);
}

void pca9539_init(pca9539_t *pca, I2C_HandleTypeDef *i2c_handle,
void pca9539_init(pca9539_t *pca, WritePtr writeFunc, ReadPtr readFunc,
uint8_t dev_addr)
{
pca->i2c_handle = i2c_handle;
pca->dev_addr = dev_addr
<< 1u; /* shifted one to the left cuz STM says so */
pca->dev_addr = dev_addr << 1u;

pca->write = writeFunc;
pca->read = readFunc;
}

HAL_StatusTypeDef pca9539_read_reg(pca9539_t *pca, uint8_t reg_type,
uint8_t *buf)
int pca9539_read_reg(pca9539_t *pca, uint8_t reg_type, uint8_t *buf)
{
HAL_StatusTypeDef status = pca_read_reg(pca, reg_type, buf);
int status = pca_read_reg(pca, reg_type, buf);
if (status) {
return status;
}

return status;
}

HAL_StatusTypeDef pca9539_read_pin(pca9539_t *pca, uint8_t reg_type,
uint8_t pin, uint8_t *buf)
int pca9539_read_pin(pca9539_t *pca, uint8_t reg_type, uint8_t pin,
uint8_t *buf)
{
uint8_t data;
HAL_StatusTypeDef status = pca_read_reg(pca, reg_type, &data);
int status = pca_read_reg(pca, reg_type, &data);
if (status) {
return status;
}
Expand All @@ -50,19 +58,18 @@ HAL_StatusTypeDef pca9539_read_pin(pca9539_t *pca, uint8_t reg_type,
return status;
}

HAL_StatusTypeDef pca9539_write_reg(pca9539_t *pca, uint8_t reg_type,
uint8_t buf)
int pca9539_write_reg(pca9539_t *pca, uint8_t reg_type, uint8_t buf)
{
return pca_write_reg(pca, reg_type, &buf);
}

HAL_StatusTypeDef pca9539_write_pin(pca9539_t *pca, uint8_t reg_type,
uint8_t pin, uint8_t buf)
int pca9539_write_pin(pca9539_t *pca, uint8_t reg_type, uint8_t pin,
uint8_t buf)
{
uint8_t data;
uint8_t data_new;

HAL_StatusTypeDef status = pca_read_reg(pca, reg_type, &data);
int status = pca_read_reg(pca, reg_type, &data);
if (status) {
return status;
}
Expand Down

0 comments on commit 6427e59

Please sign in to comment.