基于STM32的pca9535、pca9555IO扩展板开发
文章目录
- 前言
- 一、开发环境
- 二、开发流程
- 开发手册解析及使用
- 总结
前言
之前使用的pca9535由于芯片本身有些中断问题和采购问题,目前换成了pca9555的IO扩展芯片来使用,本文章适用于这两款芯片。
一、开发环境
编译器: keil5
工程库: HAL库
芯片型号:STM32F072
二、开发流程
开发手册解析及使用
pca9535和pca9555基本一样,这里我就主要说9535的手册了。
手册下载地址网上有很多,直接去百度搜索就行了。
1、芯片I2C地址如何确定
如图,A2、A1、A0和其他5位共同决定了I2C的地址,其中A2、A1、A0一般硬件直接接地,在配置地址的时候需要确认这3位的状态。我这里这3位是0。所以I2C地址是0x40。
1、芯片寄存器地址
命令字节要在写入的时候跟随地址字节的第一个字节一起传到芯片内,分别是:
输入端口 0 → 0
输入端口 1 → 1
输出端口 0 → 2
输出端口 1 → 3
极性反转端口 0 → 4
极性反转端口 1 → 5
配置端口 0 → 6
配置端口 1 → 7
每个端口对应的命令字节不同,可以根据自己的需求去配置这些端口,我这里就简单的配置IO为输入输出模式。
上图说明要配置成输出模式需要将配置寄存器(6和7寄存器)的相应位置成0,要配置成输入模式要将相应位置1。
// PCA9535命令宏
#define PCA9535_INPUT_PORT0_REG 0
#define PCA9535_INPUT_PORT1_REG 1
#define PCA9535_OUTPUT_PORT0_REG 2
#define PCA9535_OUTPUT_PORT1_REG 3
#define PCA9535_INVERSION_PORT0_REG 4
#define PCA9535_INVERSION_PORT1_REG 5
#define PCA9535_CONFIG_PORT0_REG 6
#define PCA9535_CONFIG_PORT1_REG 7
#define PCA9535_CONFIG_VAL0 0xE0
#define PCA9535_CONFIG_VAL1 0xFB uint8_t Pca9535_Init(void)
{uint8_t w_data[] = {0x00, 0x00, 0x00};uint8_t r_data[] = {0x00, 0x00};// 上电先读取一次清除中断标志memset(w_data, 0, sizeof(w_data));pca9535_read(PCA9535_INPUT_PORT0_REG, r_data, 2);// 配置PCA9535 端口,即写配置寄存器,数据格式为:地址 + CMD + 8 input + 8 outputw_data[0] = PCA9535_CONFIG_PORT0_REG; //config_port0 寄存器w_data[1] = PCA9535_CONFIG_VAL0;w_data[2] = PCA9535_CONFIG_VAL1;if (HAL_OK != pca9535_write(w_data, sizeof(w_data))){pca9535_write(w_data, sizeof(w_data));pr_debug(0x03,"pca9535_write error\n");return 0;}return 1;
}
IO口模式配置成功后需要进行输入的读取和输出的设置。
tips:在进行初始化前,一定要先读取一遍寄存器再进行写寄存器。原因是需要先清除中断。
如上我就是把P07,P06,P05配置成了输入模式,P04,P03,P02,P01,P00配置成了输出模式;把P1中除了P12配置成了输出其余都配置成了输入模式。
IO输出设置:
uint8_t io_out(void)
{uint8_t data[] = {0x00, 0x00}; data[0] = PCA9535_OUTPUT_PORT0_REG; data[1] = 0xfe; if (HAL_OK != pca9535_write(led_data, sizeof(led_data))){printf("pca9535 write error\n");return 0;}return 1;
}
如上则是把P00设置成了低电平,其余都是P0口都是高电平。
进行写寄存器的时候直接写即可:
HAL_StatusTypeDef pca9535_write(uint8_t *pData, uint16_t size)
{return (HAL_I2C_Master_Transmit(&hi2c1, PCA9535_ADDR, pData, size, 1000));
}
在进行读寄存器的时候需要看一下官方的iic时序,他是发了command + data0 +data1后再发送的stop命令。
我这里调用的hal库进行读寄存器,则需要改一下官方的 HAL_I2C_Master_Receive 函数后才能调用。
pca9535_read()读取的代码比较多,我这里就不上传了。需要的私信我即可。
总结
pca9535这款芯片里面还是有些小坑的,在进行stm32开发时要注意中断问题,和iic读取问题,如若用成中断触发,还需要添加以下错误机制,在我使用的时候还是发生过偶尔芯片初始化不正确,或者使用中读寄存器值不对的状态。
创作不易,请大佬们点个赞! 有问题请留言讨论!
基于STM32的pca9535、pca9555IO扩展板开发相关推荐
- 基于STM32的USB CAN收发器开发与设计
基于STM32的USB CAN收发器开发与设计 一.文章适合人群: 小型化企业,节约设备的购买投入: 有特殊功能需求的个人或企业(例如离线升级,数据抓包盒等): 技术开发爱好者. 二.USB CAN开 ...
- 基于STM32的四旋翼无人机开发设计
已知技术参数和设计要求: 1.功能要求 本次课程设计涉及的四旋翼无人机设计方案,采用STM32F103为上位机,外加直流电机.WIFI模块.MPU6050九轴运动处理传感器等实现四旋翼无人机飞行及其控 ...
- 基于STM32的A2B音频信号发生器开发
加我微信进同行交流群讨论DSP音频系统研究开发,hezkz17 Sigma 资料 https://www.syjshare.com/res/NELG9NZT 加我V hezkz17 进同行数字音频 ...
- 【毕设】基于STM32自动开关门系统_32开发
一.系统设计 本次设计的自动门控制系统内通过STM32F103单片机进行主控,通过温湿度传感器进行室内温湿度检测,检测到的温湿度数据会通过显示屏进行显示:自动门的开启.关闭.停止可以用按键.手机APP ...
- 物联网-移柯L206模块TCP开发(基于STM32+AT命令)
最近一直在做2g模块联网的项目,用到了移柯L206 2G模块,今天就简单讲一下移柯L206 2G模块基于STM32+AT命令开发TCP联网的过程,参考文档:移柯L206 TCPIP开发流程说明V1.1 ...
- 基于STM32开发板I²C总线通信协议浅析
基于STM32开发板I²C总线通信协议浅析 一.前言 I²C(Inter-Integrated Circuit),中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构,是由飞利浦公司在1980 ...
- 基于STM32开发的CO2浓度、温湿度、气压监测系统
基于STM32开发的CO2浓度.温湿度.气压监测系统 写在开头 项目开发过程 项目要求 项目方案 MG812传感器监测CO2浓度 RSCM1700传感器监测气压值 AM1011A传感器监测温湿度 原理 ...
- 基于stm32物联网开发板(1)
基于stm32物联网开发板(1) 本开发板采用了STM32F103RET6作为核心CPU,72MHZ工作频率,512KB flash,64KB Sram.本开发平台外设模块有ESP8266 WIF ...
- 基于stm32物联网开发板(2)--LCD屏幕
基于stm32物联网开发板(2)–LCD屏幕 LCD应用展示: LCD屏幕应用 1.概述 屏幕尺寸为1.3寸,分辨率240*240,颜色格式RGB565,驱动IC:ST7789VW: 超大可视角度:大 ...
最新文章
- LeetCode Algorithm 1290. 二进制链表转整数
- 将文件从HDFS复制到本地
- 项目经理的职责(转载)
- LeetCode 第 207 场周赛(245/4115,前5.95%)
- 进程间通信-Queue(python版)
- thinkphp3.2独立分组的建立
- Android开发中图表的使用
- 从PCI上读取数据 线程和定时器效率
- tomcat编码配置gbk_Tomcat中的编码问题
- coreseek java_lnmp+coreseek实现站内全文检索(安装篇)
- VirtualBox安装win10虚拟机
- 解决Win7 64位安装 Microsoft .NET Framework 4 失败的情况
- [Vue] 最简单的网易云音乐播放器源码分享
- Remote-SSH 安装教程
- 洛谷试炼场---新手村
- Photoshop-RGB色彩模式
- Lucene之Field常用类型
- 百度echart世界各国及国内省市经纬度坐标
- ECU Bootloader程序设计
- Java初学者 搭建Java 开发环境