STM32外设芯片驱动学习记录 —— (二) PCA9555 IO扩展芯片驱动开发

这篇具有很好参考价值的文章主要介绍了STM32外设芯片驱动学习记录 —— (二) PCA9555 IO扩展芯片驱动开发。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、芯片介绍

二、Datasheet解读

1.硬件说明

2.寄存器说明

3.通信过程

三、驱动代码编写

1.软件I2C驱动

2. PCA9555芯片驱动函数

总结

 一、芯片介绍

        PCA9555可设置16路输入或输出口,I2C接口,用于IO扩展,3个硬件地址引脚寻址,工作电压:VCC(2.3V 至 5.5V)。

二、Datasheet解读

1.硬件说明

1)框图

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件

 文章来源地址https://www.toymoban.com/news/detail-516649.html

  • INT:中断输出
  • A0,A1,A2:器件地址
  • SCL,SDA:I2C总线
  • VCC,GND:器件电源供电

  • P07-P00:内部时钟

2)引脚说明

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件 

2.寄存器说明

      pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件

 1、对应控制寄存器的控制指令如下:

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件

 2、硬件地址寻址说明:最多可连接8个芯片

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件

 3、器件寄存器

①输入寄存器,用于读取输入IO值

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件

②输出寄存器,用于写入输出IO值

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件 

③极性设置寄存器,用于设置输入IO的有效电平

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件 

④配置IO口为输入还是输出端口,1为输入,0为输出

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件 

3.通信过程

       1,写时序

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件

归纳为:器件地址+寄存器命令+P0数据+P1数据 

        2,读时序

pca9555,STM32,驱动,stm32,驱动开发,单片机,嵌入式硬件

 归纳为:器件地址+寄存器命令+器件地址+P0数据+P1数据

三、驱动代码编写

1.软件I2C驱动

        可参照BH1750驱动学习记录:https://blog.csdn.net/Huan_Xiang_Yu/article/details/127341523

2. PCA9555芯片驱动函数

#define   PCA9555_1               0x20//地址:A2 A1 A0均为低电平
#define   PCA9555_2               0x21//地址:A2 A1 为低电平,A0为高电平
   
/********************* 定义PCA9555的寄存器地址 ***********************/
#define   PCA9555_REG_IN0         0x00          //输入寄存器0地址
#define   PCA9555_REG_IN1         0x01          //输入寄存器1地址
#define   PCA9555_REG_OUT0        0x02          //输出寄存器0地址
#define   PCA9555_REG_OUT1        0x03          //输出寄存器1地址
#define   PCA9555_REG_POL0        0x04          //极性反转寄存器0地址(PIN脚为输入时有效)
#define   PCA9555_REG_POL1        0x05          //极性反转寄存器1地址
#define   PCA9555_REG_CFG0        0x06          //方向配置寄存器0地址
#define   PCA9555_REG_CFG1        0x07          //方向配置寄存器1地址


void PCA9555_Init(void);
void PCA9555_WriteData(uint8_t slaveAddress, uint16_t REG_Data);
uint16_t PCA9555_ReadData(uint8_t slaveAddress);





#include "myiic.h"
#include "PCA9555.h"

/**
  * 函数功能: 输入极性设置
  * 输入参数: slaveAddress:器件地址
              REG_Data    :设置值0xffee(ff设置P1,ee设置P0)
  * 返 回 值: 无
  * 说    明: 无
  */
void PCA9555_Polarity_Inversion(uint8_t slaveAddress, uint16_t REG_Data)
{
  uint8_t buf[3]={0};
  buf[0]=PCA9555_REG_POL0;
  buf[1]=(uint8_t)REG_Data;
  buf[2]=(uint8_t)(REG_Data>>8);
  Soft_I2C_Write(slaveAddress,buf,3,1);
}

/**
  * 函数功能: IO配置
  * 输入参数: slaveAddress:器件地址
              REG_Data    :设置值0xffee(ff设置P1,ee设置P0)
  * 返 回 值: 无
  * 说    明: 无
  */
void PCA9555_IOConfiguration(uint8_t slaveAddress, uint16_t REG_Data)
{
  uint8_t buf[3]={0};
  buf[0]=PCA9555_REG_CFG0;
  buf[1]=(uint8_t)REG_Data;
  buf[2]=(uint8_t)(REG_Data>>8);
  Soft_I2C_Write(slaveAddress,buf,3,1);
}

/**
  * 函数功能: 输出口数据
  * 输入参数: slaveAddress:器件地址
              REG_Data    :设置值0xffee(ff设置P1,ee设置P0)
  * 返 回 值: 无
  * 说    明: 无
  */
void PCA9555_WriteData(uint8_t slaveAddress, uint16_t REG_Data)
{
  uint8_t buf[3]={0};
  buf[0]=PCA9555_REG_OUT0;
  buf[1]=(uint8_t)REG_Data;
  buf[2]=(uint8_t)(REG_Data>>8);
  Soft_I2C_Write(slaveAddress,buf,3,1);
}

/**
  * 函数功能: 读取输入口数据
  * 输入参数: slaveAddress:器件地址
              REG_Data    :设置值0xffee(ff设置P1,ee设置P0)
  * 返 回 值: 无
  * 说    明: 无
  */
uint16_t PCA9555_ReadData(uint8_t slaveAddress)
{
  uint8_t buf[2]={0};
  uint16_t temp;
  uint8_t sendBuffer[1]={0};
  sendBuffer[0]=PCA9555_REG_IN0;
  Soft_I2C_Write(slaveAddress,sendBuffer,1,0);
  Soft_I2C_Read(slaveAddress, buf, 2, 1);
  temp= ((uint16_t)buf[1]<<8) + buf[0] ;
  return temp;
}

/**
  * 函数功能: PCA9555初始化
  * 输入参数: 无
  * 返 回 值: 无
  * 说    明: 无
  */  
void PCA9555_Init(void)
{
  PCA9555_IOConfiguration(PCA9555_1, 0xFFFF   );// I2C设备PCA9555-1(地址 0x20) 的16个IO口 输入/输出配置,bit表示,1 - 输入,0 - 输出
  PCA9555_IOConfiguration(PCA9555_2, 0        );// I2C设备PCA9555-2(地址 0x21) 的16个IO口 输入/输出配置,bit表示,1 - 输入,0 - 输出
  PCA9555_Polarity_Inversion(PCA9555_1, 0xFFFF);// I2C设备PCA9555-1(地址 0x20) 输入/输出口反向,bit表示,1 - 反向,0 - 默认 
}

总结

        参考源代码如下链接:

https://download.csdn.net/download/Huan_Xiang_Yu/87585761

 

到了这里,关于STM32外设芯片驱动学习记录 —— (二) PCA9555 IO扩展芯片驱动开发的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • STM32--PCA9685驱动(16路舵机驱动模块)

    目录 PCA9685接线: PCA9685简介: PCA9685地址位寄存器: MODE1寄存器,地址0x00,可读、可写: 寄存器地址: PCA9685代码注解: 1.PCA9685数据写入:  2.PCA9685数据读取: 3.PCA9685的频率设置: 4.PCA9685的PWM设置: 舵机转动角度置换: PCA9685驱动代码: main.c程序: IIC驱动:(正点原子

    2024年03月25日
    浏览(39)
  • STM32的入门——CM3芯片STM32F103VET6的使用和相关外设

    根据《STM32库开发实战指南——基于野火指南者开发板》整理, https://gitee.com/Embedfire-stm32f103-zhinanzhe/ebf_stm32f103_zhinanzhe_ std_tutorial 在整理的过程中,还参考了其他的一些STM32资料 使用了“幕布”这款软件,添加了一些思维导图 整理框架目的: 1.梳理知识脉络 2.复习知识 被动单

    2024年02月03日
    浏览(38)
  • cubemx stm32 pca9685pw模块 16路PWM 可用于舵机驱动 驱动代码

    淘宝链接请点这里 淘宝资料资料: 链接:https://pan.baidu.com/s/1Kda-c7QdZdQ03FBMa0zeRA 提取码:1234 这个模块是 I2C 通信控制 16 路 PWM 的模块。 所有路的 频率 是统一设置的,所以每一路的频率都一样,但是每一路可以设置不同的占空比。 PCA9685的分辨率是12位,即占空比控制时,0-

    2024年02月06日
    浏览(33)
  • Freertos-mini智能音箱项目---IO扩展芯片PCA9557

            项目上用到的ESP32S3芯片引脚太少,选择了PCA9557扩展IO,通过一路i2c可以扩展出8个IO。这款芯片没有中断输入,所以更适合做扩展输出引脚用,内部寄存器也比较少,只有4个,使用起来很容易。 输入寄存器   输出寄存器  极性颠倒寄存器    配置寄存器       

    2024年02月13日
    浏览(30)
  • STM32外设GPIO(学习笔记)

    在编写stm32程序时,对寄存器进行操着需要知道每个外设的基地址,标准库的stm32f10x.h文件里也有各种外设的基地址。 比如GPIO:在定义输出数据寄存器地址GPIOA_ODR_Addr时,在GPIOA_BASE(GPIO端口A的基址地址)地址基础上偏移 在stm32f10x.h文件里面有定义GPIOA_BASE,是APB2PERIPH_BASE(

    2024年04月12日
    浏览(35)
  • 【STM32】STM32学习笔记-I2C通信外设(34)

    I2C(Inter-Integrated Circuit)总线 是一种由NXP(原PHILIPS)公司开发的两线式串行总线,用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。 串行的 8 位双向数据传输位速率在标准模式下可

    2024年01月17日
    浏览(53)
  • STM32使用HAL库驱动TA6932数码管驱动芯片

    8段16位,支持共阴共阳LED数码管。 推挽配置即可。 1、使用TA6932_Init进行初始化 2、使用TA6932_Disp(uint8_t *_ucPtr,uint8_t _ucLenth)进行显示,_upPtr指针指向段码,_ucLenth为显示长度,不超过16位。

    2024年02月07日
    浏览(34)
  • stm32驱动MCP2515芯片,项目已通过测试

    最近公司做一个项目,需要3路can通道,但是stm32看了很久,最多也就只有2个can,所以找到了一款MCP2515芯片,可以用spi驱动can。 已经实现了can的发送和接收,接收采用的是外部中断接收的方式。和单片机本身带的can功能一样。 还有就是要注意的是CAN的接收是通过外部中断引脚

    2024年02月13日
    浏览(36)
  • STM32驱动CH9121网络串口透传芯片

    目录 一.介绍 二.配置 1.搜索配置  基础设置 端口设置 2.串口配置 ①CFG脚进入配置: ②串口协商进入: 三、使用CH9121 四、测试 关于CH9121的资料和配置软件 :提取码:3fxd 网络串口透传芯片CH9121,官网资料:网络串口透传芯片CH9121 这里摘取一些简介 CH9121 集成TCP/IP 协议栈,

    2024年02月10日
    浏览(32)
  • 学习记录之STM32F103C8T6最小系统板驱动MPU6050串口打印数据

    1.使用到的工具介绍 2.MPU6050和整体和简单介绍 3.程序的介绍 1.使用到的工具介绍 硬件方面:STM32F103C8T6最小系统板核心板,MPU6050模块三维角度传感器,经典的CH340烧写和串口作用,和若干个杜邦线。 软件方面:keil5编写程序软件,烧写软件FlyMcu.exe烧写工具,sscom.exe串口调试工

    2023年04月09日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包