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

这篇具有很好参考价值的文章主要介绍了stm32 AW9523B IO扩展芯片扩展io口驱动程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、核心驱动为:

(1).c 文件

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 文件

#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、关键数据结构说明

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 文章来源地址https://www.toymoban.com/news/detail-808906.html

到了这里,关于stm32 AW9523B IO扩展芯片扩展io口驱动程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ad+硬件每日学习十个知识点(25)23.8.5(常见芯片类型、数字隔离芯片、IO扩展芯片TCAL6416)

    答: 模数转换器(Analog-to-Digital Converter,ADC):模数转换器将模拟信号转换为数字信号,常用于测量和采集模拟传感器数据,并将其转换为数字形式供处理和分析。 数模转换器(Digital-to-Analog Converter,DAC):数模转换器将数字信号转换为模拟信号,常用于音频设备、通信系

    2024年02月14日
    浏览(47)
  • 【STM32】GPIO——快速IO的使用

    STM32的每个GPIO端口都有两个特别的寄存器,GPIOx_BSRR和GPIOx_BRR寄存器,通过这两个寄存器可以直接对对应的GPIOx端口置\\\'1\\\'或置\\\'0\\\'。 GPIOx_BSRR的高16位中每一位对应端口x的每个位,对高16位中的某位置\\\'1\\\'则端口x的对应位被清\\\'0\\\';寄存器中的位置\\\'0\\\',则对它对应的位不起作用。 GPI

    2024年03月17日
    浏览(51)
  • 【【STM32--28--IO引脚的复用功能】】

    STM32的IO复用功能 何为复用? 我们先了解一下何为通用 IO端口的输入或输出是由GPIO外设控制,我们称之为通用 复用: IO端口的输入或者是输出是由其他非GPIO外设控制就像经常说的USART 由 DR寄存器进行输出 STM32的IO复用功能 1.各个IO都支持什么复用功能 2.IO复用功能的冲突问题

    2024年02月09日
    浏览(42)
  • STM32通用输入输出端口GPIO(IO口)

    IO口:通用输入输出端口,通过软件控制其输入输出,STM32芯片的GPIO引脚与外部设备连接起来,从而可以实现与外部的通信,控制以及数据采集的功能; 输出模式下,可控制端口输出高低电平,用于驱动LED,蜂鸣器,模拟通信协议输出时序等; 当控制功率较大的设备可以加入

    2024年02月03日
    浏览(53)
  • STM32中使用宏定义来控制IO口

    目录 一、前言 二、前置知识 1.带参宏定义 2.三目运算符 3.需要用到的寄存器 ①BSRR寄存器 ②BRR寄存器 ③IDR寄存器 三、有以上基础或者想直接用的直接看这里 1.使用宏定义来控制IO口 四、代码解释 1.LED(x) 2.LED_RUN 五、结语 突然想用宏定义来控制IO口,但是发现网上并没有比较

    2024年01月24日
    浏览(33)
  • 【【STM32分析IO该设置什么模式的问题】】

    我们分析而言 我们对于PA0 的设计就从此而来 对于边沿触发的选择我们已经有所了解了 我们下拉,但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发 而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以是下降沿触发 那么对于何种模式有很多人

    2024年02月10日
    浏览(26)
  • STM32学习笔记 IO口模拟串口 (接收采用定时器方式)

            硬件:基于STM32F407VET6编写         软件:使用两个GPIO口,一个用作串口发送TX,一个用作串口接收RX,采用的是定时器模拟                     时序。          要模拟串口,首先肯定是需要了解串口的协议,根据协议来编写程序。                  UART的

    2024年01月15日
    浏览(58)
  • stm32定时器输出pwm&IO口模拟pwm——呼吸灯

    什么是pwm波?pwm就是脉冲宽度调制,就是占空比可变的脉冲波形,通过改变占空比,输出不同的pwm波,就能实现许多有趣的功能,比如说我们生活中常见的呼吸灯就是通过这样实现的。接下来我们就以呼吸灯为例,学习stm32通过定时器输出pwm波和io口模拟输出pwm波。 控制方式就

    2024年01月18日
    浏览(49)
  • 学习笔记——STM32C8T6如何配置普通IO口

     最近使用stm32f103c8t6时,想要使用PA15端口作为普通io口输出电平信号,但是发现配置不生效,于是就去网上查,发现要关闭初始状态下芯片默认的专用复位功能,于是总结了一下几个配置普通io口的引脚: 有: PA13  PA14  PA15  PB3  PB4 同时,这些引脚主功能(复位后)的功能

    2024年02月02日
    浏览(45)
  • STM32F407普通IO口模拟串口实现不定长数据收发

    因为项目中用到的串口比较多,STM32F407VET6自带的串口不够用了,所以只能考虑用模拟串口来实现功能。普通的IO口来模拟串口需要先了解串口的时序图,需要用到两个IO引脚即收发引脚,两个定时器,一个用于发送延时使用,一个用于产生中断接收数据。代码的初始化主要用

    2024年02月07日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包