stm32 AW9523B IO扩展芯片扩展io口驱动程序

1、核心驱动为:

(1).c 文件

objectivec 复制代码
typedef struct
{
    uint8_t InputReg[GPIO_PORT_NUM];
    uint8_t OutputReg[GPIO_PORT_NUM];
    uint8_t ConfigReg[GPIO_PORT_NUM];
    uint8_t IntReg[GPIO_PORT_NUM];
}AW95_REG_T;

 typedef struct
{
    uint8_t IcId;
    uint8_t IrqFlag;
    uint8_t Input[GPIO_PORT_NUM];
    uint8_t Output[GPIO_PORT_NUM];
    uint8_t Config[GPIO_PORT_NUM];
    uint8_t Int[GPIO_PORT_NUM];
}AW95_IC_T;


const AW95_REG_T Aw95Reg = {{P0_INPUT,P1_INPUT},{P0_OUTPUT,P1_OUTPUT},\
                {P0_CONFIG,P1_CONFIG},{P0INT_MSK,P1INT_MSK}};

AW95_IC_T Aw95Ic1 = 
{
    .IcId = 0xB0,
}; 

AW95_IC_T Aw95Ic2 = 
{
    .IcId = 0xB4,
}; 

AW95_IC_T *Aw95IcBuf[GPIO_IC_NUM] = {&Aw95Ic1,&Aw95Ic2};


void EXIO_Init(void)
{
    uint8_t gpio_mode = 0x10;
    
    bsp_InitI2C(); /*模拟iic初始化*/
    GpioConfig(); /*外部中断初始化*/
    I2C_CheckOk(Aw95Ic1.IcId);
    I2C_CheckOk(Aw95Ic2.IcId);
    Aw95_ReadChipId(Aw95Ic1.IcId);
    Aw95_ReadChipId(Aw95Ic2.IcId);
    i2c_WriteBytesResend(Aw95Ic1.IcId,GCR_REG,&gpio_mode,1);/*配置ic1-gpio0为推挽输出模式*/
    i2c_WriteBytesResend(Aw95Ic2.IcId,GCR_REG,&gpio_mode,1);/*配置ic2-gpio0为推挽输出模式*/
}
void EXIO_PinInit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin,EXIO_DIRE_E _dire)
{
    AW95_IC_T * point = NULL;

    point = Aw95IcBuf[_ic];
    /*对内部存储值进行修改*/
    if(_dire == EXIO_OUTPUT)
    {
        point->Config[_port] &= ~_pin;
        point->Int[_port] |= _pin;
        
    }
    else
    {
        point->Config[_port] |= _pin;
        point->Int[_port] &= ~_pin;
    }
    /*将输入输出配置值写入到ic中*/
    i2c_WriteBytesResend((uint8_t)point->IcId,(uint8_t)Aw95Reg.ConfigReg[_port],&(point->Config[_port]),1);
    /*将中断状态写入到ic中*/
    i2c_WriteBytesResend((uint8_t)point->IcId,(uint8_t)Aw95Reg.IntReg[_port],&(point->Int[_port]),1);
}


uint8_t EXIO_ReadBit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin)
{
    uint8_t bitstatus = 0x00;
    AW95_IC_T * point = NULL;

    point = Aw95IcBuf[_ic];
    if(point->Input[_port] & _pin)
    {
        bitstatus = (uint8_t)Bit_SET;
    }
    else
    {
        bitstatus = (uint8_t)Bit_RESET;
    }
    
    return bitstatus;
}

uint8_t EXIO_ReadByte(EXIO_IC_E _ic, EXIO_PORT_E _port)
{
    AW95_IC_T * point = NULL;

    point = Aw95IcBuf[_ic];

    return point->Input[_port];
}


void EXIO_WriteBit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin,BitAction _value)
{
    AW95_IC_T * point = NULL;

    point = Aw95IcBuf[_ic];
    /*对内部存储值进行修改*/
    if(_value == Bit_SET)
    {
        point->Output[_port] |= _pin;
    }
    else
    {
        point->Output[_port] &= ~_pin;
    }
    /*将输出状态写入到ic中*/
    i2c_WriteBytesResend((uint8_t)point->IcId,(uint8_t)Aw95Reg.OutputReg[_port],&(point->Output[_port]),1);
}
void EXIO_Handle(void)
{
    if(Aw95Ic1.IrqFlag == 1)
    {
        Aw95Ic1.IrqFlag = 0;
        i2c_ReadBytesResend(Aw95Ic1.IcId,Aw95Reg.InputReg[EXIO_PORT_0],&(Aw95Ic1.Input[EXIO_PORT_0]),1);
        i2c_ReadBytesResend(Aw95Ic1.IcId,Aw95Reg.InputReg[EXIO_PORT_1],&(Aw95Ic1.Input[EXIO_PORT_1]),1);

    }
    if(Aw95Ic2.IrqFlag == 1)
    {    
        Aw95Ic2.IrqFlag = 0;
        i2c_ReadBytesResend(Aw95Ic2.IcId,Aw95Reg.InputReg[EXIO_PORT_0],&(Aw95Ic2.Input[EXIO_PORT_0]),1);
        i2c_ReadBytesResend(Aw95Ic2.IcId,Aw95Reg.InputReg[EXIO_PORT_1],&(Aw95Ic2.Input[EXIO_PORT_1]),1);
    }    
}

(2).h 文件

objectivec 复制代码
#ifndef __AW95_DEV__
#define __AW95_DEV__

/*外部io口ic编号*/
typedef enum
{
    EXIO_IC_1 = 0,
    EXIO_IC_2 = 1,
}EXIO_IC_E;

/*外部io口端口编号*/
typedef enum
{
    EXIO_PORT_0 = 0,
    EXIO_PORT_1 = 1,
}EXIO_PORT_E;

/*外部io口引脚编号*/
typedef enum
{
    EXIO_PIN_0 = 0x01,
    EXIO_PIN_1 = 0x02,
    EXIO_PIN_2 = 0x04,
    EXIO_PIN_3 = 0x08,
    EXIO_PIN_4 = 0x10,
    EXIO_PIN_5 = 0x20,
    EXIO_PIN_6 = 0x40,
    EXIO_PIN_7 = 0x80,
}EXIO_PIN_E;

/*外部io口方向选择*/
typedef enum
{
    EXIO_OUTPUT = 0,
    EXIO_INPUT = 1,
}EXIO_DIRE_E;


void EXIO_Init(void);
void EXIO_Handle(void);
void EXIO_PinInit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin,EXIO_DIRE_E _dire);
uint8_t EXIO_ReadBit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin);
void EXIO_WriteBit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin,BitAction _value);




#endif /*__AW95_DEV__*/

2、关键接口说明

(1)void EXIO_Init(void);

对AW9523B驱动模块进行初始化

(2)void EXIO_Handle(void);

对AW9523B驱动模块进行操作

(3)void EXIO_PinInit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin,EXIO_DIRE_E _dire);

初始化AW9523B单个引脚

(4)uint8_t EXIO_ReadBit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin);

读取AW9523B单个引脚

(5)void EXIO_WriteBit(EXIO_IC_E _ic, EXIO_PORT_E _port,EXIO_PIN_E _pin,BitAction _value);

读取AW9523B单个端口

3、关键数据结构说明

objectivec 复制代码
typedef struct
{
    uint8_t IcId;
    uint8_t IrqFlag;
    uint8_t Input[GPIO_PORT_NUM];
    uint8_t Output[GPIO_PORT_NUM];
    uint8_t Config[GPIO_PORT_NUM];
    uint8_t Int[GPIO_PORT_NUM];
}AW95_IC_T;

用于存储单个ic中的数据,如需管理更多的结构体,可以再增加定义

4、如需完整工程请联系

3060793968@qq.com

相关推荐
技术liul6 小时前
使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本1)
android·stm32·电脑
anghost1508 小时前
基于 STM32 的多传感器健康监测系统设计
stm32·单片机·嵌入式硬件
玉~你还好吗8 小时前
【嵌入式电机控制#34】FOC:意法电控驱动层源码解析——HALL传感器中断(不在两大中断内,但重要)
单片机·嵌入式系统·电机控制
STC_USB_CAN_80519 小时前
所有普通I/O口都支持中断的51单片机@Ai8051U, AiCube 图形化配置
单片机·嵌入式硬件·51单片机
正点原子10 小时前
《ESP32-S3使用指南—IDF版 V1.6》第三十四章 RGB触摸实验
单片机·物联网·嵌入式
码小文11 小时前
Altium Designer 22使用笔记(8)---PCB电气约束设置
笔记·嵌入式硬件·硬件工程·ad22
dumpling012011 小时前
新手向:使用STM32通过RS485通信接口控制步进电机
stm32·单片机·嵌入式硬件
hazy1k11 小时前
STM32-FreeRTOS快速入门指南(中)
stm32·单片机·嵌入式硬件
清风66666612 小时前
基于51单片机自动浇花1602液晶显示设计
单片机·嵌入式硬件·mongodb·毕业设计·51单片机·课程设计
古译汉书12 小时前
嵌入式-SPI番外之按钮驱动程序的编写-Day15
c语言·stm32·单片机·嵌入式硬件·mcu·算法