#include "pca9555.h"
U_INPUT EX_IN;
U_OUTPUT EX_OUT;
IIC_STATUS PCA9555Init(const IIC_PIN *PIN)
{
IIC_STATUS status;
IIC_Init(PIN);
IIC_Start(PIN);
IIC_WriteByte(PIN, PIN->ADDR);
status = IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, PCA9555_REG_CFG0);
status |= IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, PCA9555_DERECTION0);
status |= IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, PCA9555_DERECTION1);
status |= IIC_Wait_ACK(PIN);
IIC_Stop(PIN);
if(status)
return(IIC_WRITE_ERR);
else
return(IIC_OK);
}
IIC_STATUS PCA9555GetPin(const IIC_PIN *PIN, U_INPUT *pin)
{
uint8_t ch[2];
IIC_STATUS status;
IIC_Start(PIN);
IIC_WriteByte(PIN, PIN->ADDR);
status = IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, PCA9555_REG_IN0);
status |= IIC_Wait_ACK(PIN);
IIC_Start(PIN);
IIC_WriteByte(PIN, PIN->ADDR | 0x01);
status |= IIC_Wait_ACK(PIN);
IIC_ReadByte(PIN, &ch[0]);
IIC_ACK(PIN);
IIC_ReadByte(PIN, &ch[1]);
IIC_NACK(PIN);
IIC_Stop(PIN);
if(status)
return (IIC_READ_ERR);
else
{
pin->input[0] = ch[0];
pin->input[1] = ch[1];
return (IIC_OK);
}
}
IIC_STATUS PCA9555SetPin(const IIC_PIN *PIN, const U_OUTPUT *pout)
{
IIC_STATUS status;
IIC_Start(PIN);
IIC_WriteByte(PIN, PIN->ADDR);
status = IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, PCA9555_REG_OUT0);
status |= IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, pout->output[0]);
status |= IIC_Wait_ACK(PIN);
IIC_WriteByte(PIN, pout->output[1]);
status |= IIC_Wait_ACK(PIN);
IIC_Stop(PIN);
osDelay(10);
if(status)
return (IIC_WRITE_ERR);
else
return (IIC_OK);
}
#ifndef __PCA9555_HEAD_
#define __PCA9555_HEAD_
#include "stdio.h"
#include "stdint.h"
#include "string.h"
#include "cmsis_os.h"
#include "hal_iic.h"
#define PCA9555_POLARITY0 0x00
#define PCA9555_POLARITY1 0x00
#define PCA9555_DERECTION0 0xFF
#define PCA9555_DERECTION1 0x0F
#define PCA9555_REG_IN0 0x00
#define PCA9555_REG_IN1 0x01
#define PCA9555_REG_OUT0 0x02
#define PCA9555_REG_OUT1 0x03
#define PCA9555_REG_POL0 0x04
#define PCA9555_REG_POL1 0x05
#define PCA9555_REG_CFG0 0x06
#define PCA9555_REG_CFG1 0x07
typedef struct{
GPIO_TypeDef* port;
uint16_t pin;
}T_GPIO_TYPE;
typedef union{
uint8_t input[2];
uint16_t data;
}U_INPUT;
typedef union{
uint8_t output[2];
uint16_t data;
}U_OUTPUT;
extern U_INPUT EX_IN;
extern U_OUTPUT EX_OUT;
IIC_STATUS PCA9555Init(const IIC_PIN *PIN);
IIC_STATUS PCA9555GetPin(const IIC_PIN *PIN,U_INPUT *pin);
IIC_STATUS PCA9555SetPin(const IIC_PIN *PIN,const U_OUTPUT *pout);
#endif
pca9555.pdf