PCA9632笔记

个人学习笔记,有错漏。具体请以官方数据手册为准

I2C地址

PCA9632使用I2C通信,I2C设备地址固定
发出START后输出访问设备地址(8bit版本地址固定)
在这里插入图片描述
0x62(7位地址)
地址最后一位为1读 为0写
8位写地址 0xC4
8位读地址 0xC5
注:具体使用7位/8位地址需根据使用的I2C库判断

寄存器

控制寄存器

在成功确认目标地址,LED所有呼叫地址或LED子呼叫地址后,总线控制器将向PCA9632发送一个字节,该字节将存储在控制寄存器中。
最低的4位用作指针,以确定将访问哪个寄存器(D[3:0])。最高的3位被用作自动递增标志和自动递增选项(AI[2:0])。bit4是未使用的,必须置为0才能使设备正常工作。
在这里插入图片描述
当设置了自增标志(AI2 = 1)时,在读或写操作之后,控制寄存器的4个低位自动递增。这允许用户按顺序对寄存器进行编程。根据AI1和AI0的值,可能有四种不同类型的Auto-Increment。
在这里插入图片描述
大致翻译

AI2AI1AI0Function
000无自增
100所有寄存器自动递增。D3, D2, D1, D0在最后一个寄存器(1100)被访问后回到’ 0000 ’
101仅对单个亮度寄存器进行自增。在最后一个寄存器(0101)被访问后,D3, D2, D1, D0滚到’ 0010 ’
110自增仅适用于全局控制寄存器。在最后一个寄存器(0111)被访问后,D3, D2, D1, D0转到’ 0110 ’
111自增仅适用于单个和全局控制寄存器。D3, D2, D1, D0 在最后一个寄存器(0111)被访问后,D1, D0滚到’ 0010 '。

注:表5 (AI[2:0] = 001, 010, 011)中未显示的其他组合保留,不得用于设备的正常操作。

AI[2:0] = 000,无自增 用于在单个i2c总线通信期间必须多次访问同一寄存器时,例如,改变单个LED的亮度。在写操作期间,每次访问寄存器时都会覆盖数据。
AI[2:0] = 100,所有寄存器自增 在必须顺序访问所有寄存器时使用,例如,上电编程。
AI[2:0] = 101,单个控制器自增 用于四个LED驱动器必须在同一i2c总线通信中分别编程不同的值时,例如,将颜色设置更改为另一种颜色设置。
AI[2:0] = 111,单个\全局控制器自增 用于必须在同一i2c总线通信中执行单个和全局更改时,例如,同时更改颜色和全局亮度。

D[3:0] 所表示的寄存器如下表
在这里插入图片描述

寄存器MODE1 【00H】

在这里插入图片描述
MODE1[7:5]为只读位 由前面所述的控制寄存器决定值
SLEEP位 当振荡器关闭(1:睡眠模式)时,LED输出不能打开,关闭或变暗/闪烁
ALLCALL位为1时,可通过ALLCALLADR地址进行I2C通信

寄存器MODE2 【01H】

在这里插入图片描述
其中要注意的是INVRT和OUTDRV,
INVRT可切换输出电平是否翻转
OUTDRV默认为开漏输出,可切换为图腾柱(totem pole)输出,需根据电路决定
在这里插入图片描述
LEDx的状态与MODE2的INVRT和OUTDRV有关
在这里插入图片描述

寄存器PWM0-3 / PWMx 【02H - 05H】

在这里插入图片描述
individual brightness
在单独亮度模式(LDRx = 10)下工作时,每个输出使用1.5625 kHz固定频率信号。占空比从00h开始通过256个线性步进控制(0%占空比= LED输出关闭)至FFh(99.6%占空比= LED最大亮度输出)。在这种模式下,所有的8位都被使用。(255/256=0.996)
dimming
在组调光模式下工作时,每个输出使用6.25 kHz固定频率信号。占空比从00h(0%占空比= LED输出关闭)开始通过64个线性步骤进行控制,至3Fh(98.4%占空比= LED输出在最大亮度[63/64=0.9843])。在这种模式下,只使用6个最高有效位(IDCx[7:2])。忽略2个最低有效位 IDCx[1:0]。
适用于LDRx = 11 (LEDOUT寄存器)编程的LED输出。
blink
在闪烁模式下工作时,每个输出使用1.5625 kHz固定频率信号。占空比通过256个线性步骤控制,从00h(0%占空比= LED输出关闭)到FFh(99.6%占空比= LED在最大亮度下输出)。在这种模式下,所有的8位数据都被使用。

寄存器GRPPWM 【06H】

在这里插入图片描述
individual brightness
当DMBLNK位(MODE2寄存器)被编程为0时,一个190 Hz固定频率信号与6.25 kHz单个亮度控制信号叠加。然后使用GRPPWM作为全局亮度控制,允许LED输出以相同的值变暗。GRPFREQ中的值无效。
group dimming mode
在组调光模式(DMBLNK = 0)中,4个输出的全局亮度通过从00h(0%占空比= LED输出关闭)到F0h的16个线性步骤进行控制(93.75%占空比=最大亮度)。在这种模式下,高4位有效,低4位未使用。
global blinking pattern
当DMBLNK位被编程为1时,GRPPWM和GRPFREQ寄存器定义了一个全局闪烁模式,其中GRPFREQ包含闪烁周期(从24hz到10.73 s)和GRPPWM占空比(开/关比,单位为%)。在这种模式下,当GRPFREQ被编程为提供24 Hz到6 Hz频率可编程的闪烁时,GRPPWM高6位被用于配置从0%到98.4%的64步占空比分辨率。GRPPWM的低2位未使用。
blink
当GRPFREQ被编程为提供频率从6 Hz到0.09 Hz (10.73 s)可编程的闪烁时,GRPPWM[7:0]被用于提供从0%到99.6%的256步占空比分辨率。在这种情况下,GRPPWM寄存器的所有8位都被使用。

寄存器GRPFREQ 【07H】

在这里插入图片描述

GRPFREQ用于编程DMBLNK位(MODE2寄存器)等于逻辑1时的全局闪烁周期。当DMBLNK = 0时,此寄存器中的值无效。适用于LDRx = 11 (LEDOUT寄存器)编程的LED输出。
闪烁周期通过256个线性步进控制,从00h (41 ms,频率24 Hz)到FFh(10.73秒)。

寄存器LEDOUT 【08H】

LEDOUT寄存器决定各个LED驱动的控制状态
在这里插入图片描述
LDRx对应状态

LDRx的值状态
00b[0]LEDx 关闭(上电默认)
01b[1]LEDx 完全打开(不控制单个亮度和组调光/闪烁)
10b[2]LEDx 的单个亮度可以通过其PWMx寄存器进行控制
11b[3]LEDx 单个亮度和组调光/闪烁可以通过其PWMx寄存器和GRPPWM寄存器进行控制。
寄存器SUBADR1-3 / SUBADRx 【09H - 0BH】


通过i2c总线可编程(易失性编程)。默认开机值为E2h,E4h, E8h。
设备在上电后默认禁用(需要设置MODE1寄存器中对应的SUBx位等于逻辑0)。
一旦子地址被编程为正确的值,为了让设备确认这些地址(MODE1寄存器),SUBx位需要设置为1。当MODE1寄存器的SUBx位设置为1时,对应的i2c总线子地址SUBADRx可以在i2c总线读或写序列中使用。
只有高7位有效。最低位保留,值为0。

寄存器LED All Call I2C-Bus address / ALLCALLADR 【0CH】

Page14
默认值1110000x[E0H],通过i2c总线可编程(易失性编程)
在这里插入图片描述
I2C总线上可连接多个PCA9632,通过该寄存器设置I2C设备地址。允许同时对总线上的所有pca9632进行编程(寄存器MODE1中的ALLCALL位必须等于1,上电默认启用)。这个地址可以通过i2c总线编程,并且可以在i2c总线读或写序列中使用。寄存器地址可以被编程为子调用。
7个最高有效位有效。最低位保留,值为0。
如果寄存器MODE1中的ALLCALL位= 0,设备不承认在寄存器ALLCALLADR中编程的地址。
备注:默认值E0H不可用作常规I2C目标总线地址,因为所有PCA9632上电后地址默认值一致。

I2C通讯

在START条件之后,总线控制器必须输出它正在访问的目标的地址。(8pin版本只有一个固定地址)
初始化I2C时序:写Command控制寄存器-写MODE1数据 - 写MODE2数据 - 写控制寄存器 - 写LEDOUT寄存器数据
使用默认I2C总线地址可能会干扰其他设备
在这里插入图片描述

向寄存器写数据

I2C时序:START - 写I2C地址 - 写寄存器地址 - 写数据

/** ************************************************************
 * @brief  PCA9632写寄存器数据
 * @param  [in] u8Reg    要写的寄存器地址 可使用enum command_reg
 * @param  [in] pu8Data  写数据缓冲区
 * @param  [in] u32Size  写数据长度
 * @retval None
 *************************************************************/
void PCA9632_Write(uint8_t u8Reg, uint8_t* pu8Data, uint16_t u16Len)
{
	int32_t i32Ret = LL_OK;
	i32Ret = I2C_Start(I2C_UNIT, I2C_TIMEOUT);
	
	if (LL_OK == i32Ret) 
	{
		if(u16Len > 1) u8Reg |= 0x80; 	// 写控制寄存器:连续写(寄存器地址自动递增)
		
        i32Ret = I2C_TransAddr(I2C_UNIT, PCA9632_ADDR, I2C_DIR_TX, I2C_TIMEOUT);	// 发设备地址

        if (LL_OK == i32Ret) 
		{
            i32Ret = I2C_TransData(I2C_UNIT, &u8Reg, 1, I2C_TIMEOUT);		// 写寄存器地址
			if (LL_OK == i32Ret)
			{	
				i32Ret = I2C_TransData(I2C_UNIT, pu8Data, u16Len, I2C_TIMEOUT);	// 写数据
			}
			
        }
    }

	( void )I2C_Stop( I2C_UNIT, I2C_TIMEOUT );
	
}
读寄存器数据

I2C时序:START - 写I2C写设备地址 - 写寄存器地址 - START - 写I2C读设备地址 - 读数据


/************************************************************** 
 * @brief  PCA9632读取定长数据
 * @param  [in] u8Reg   指定读寄存器地址
 * @param  [in] pu8Buf  读数据缓冲区
 * @param  [in] u16Len  读取数据长度
 * @retval None
 **************************************************************/
void PCA9632_Read(uint8_t u8Reg, uint8_t* pu8Buf, uint8_t u8Len)
{
	int32_t i32Ret;

    i32Ret = I2C_Start( I2C_UNIT, I2C_TIMEOUT );
    if ( LL_OK == i32Ret )
    {
        i32Ret = I2C_TransAddr( I2C_UNIT, PCA9632_ADDR, I2C_DIR_TX, I2C_TIMEOUT );    // 发写设备地址

        if ( LL_OK == i32Ret )
        {
			if(u8Len > 1) u8Reg |= 0x80;	// 连续读(寄存器地址自增)
            i32Ret = I2C_TransData( I2C_UNIT, &u8Reg, 1, I2C_TIMEOUT );      // 写寄存器地址
            if ( LL_OK == i32Ret )
            {
                i32Ret = I2C_Restart( I2C_UNIT, I2C_TIMEOUT );  // restart信号
                if ( LL_OK == i32Ret )
                {
                    if ( 1UL == u8Len )
                    {
                        I2C_AckConfig( I2C_UNIT, I2C_NACK );        // 读寄存器长度1 发NACK
                    }

                    i32Ret = I2C_TransAddr( I2C_UNIT, PCA9632_ADDR, I2C_DIR_RX, I2C_TIMEOUT );    // 发读设备地址
                    if ( LL_OK == i32Ret )
                    {
                        i32Ret = I2C_MasterReceiveDataAndStop( I2C_UNIT, pu8Buf, u8Len, I2C_TIMEOUT ); // 读取数据
                    }
                    I2C_AckConfig( I2C_UNIT, I2C_ACK );
                }
            }
        }
    }

    if ( LL_OK != i32Ret )
    {
        ( void )I2C_Stop( I2C_UNIT, I2C_TIMEOUT );  // I2C 停止
    }
	
}
软件复位

软件复位地址如下图
在这里插入图片描述
I2C:向设备地址0x06【7位地址为0x03】顺序写入0xA5及0x5A
在这里插入图片描述
执行结果:软件复位(SWRST)寻呼允许主器件通过I²C总线对PCA9632进行复位,与上电复位(POR)完全相同,将寄存器初始化为默认状态,使输出设为高阻抗。这能方便且快速地将所有器件寄存器重新配置为相同的条件。

/**************************************************************
 * @brief  软复位 
 * @param  none
 * @retval None
 **************************************************************/
void PCA9632_Reset(void)
{
	int32_t i32Ret;
	uint8_t TxBuf[5] = {0xA5, 0x5A};
	
    i32Ret = I2C_Start( I2C_UNIT, I2C_TIMEOUT );
	if(LL_OK == i32Ret)
	{
		i32Ret = I2C_TransAddr( I2C_UNIT, 0x03, I2C_DIR_TX, I2C_TIMEOUT );    // 发从设备写地址
		if(LL_OK == i32Ret)
		{
			i32Ret = I2C_TransData( I2C_UNIT, TxBuf, 2, I2C_TIMEOUT );      // 写数据
		}
	}
	I2C_Stop( I2C_UNIT, I2C_TIMEOUT );
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/910723.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【算法】递归+回溯+剪枝:78.子集

目录 1、题目链接 2、题目 3、解法(回溯剪枝) 4、代码 1、题目链接 78.子集(LeetCode) 2、题目 3、解法(回溯剪枝) 思路: 枚举子集(答案)的第一个数选谁,第二个数选谁,第三个数选谁&#x…

HCIP(7)-边界网关协议BGP基本配置(对等体peer,宣告network,引入import)

边界网关协议(Border Gateway Protocol,BGP)是一种用来在路由选择域之间交换网络层可达性信息(Network Layer Reachability Information,NLRI)的路由选择协议。由于不同的管理机构分别控制着他们各自的路由…

基于python的机器学习(二)—— 使用Scikit-learn库

目录 一、样本及样本划分 1.1 划分样本的方法 1.1.1 train_test_split()函数 1.1.2 时间序列划分 1.1.3 交叉验证 二、导入或创建数据集 2.1 导入Sklearn自带的样本数据集 2.2 利用Sklearn生成随机的数据集 2.3 读入自己创建的数据集 2.3.1 用Python直接读取文本文件…

Webpack5常用配置

1、序言 Webpack属于构建工具,可以将开发者代码转化成浏览器能识别的代码,让开发者专注代码实现,不用过多关注浏览器兼容性问题。 Webpack常见功能: 模块打包:Webpack 可以将项目中的所有模块(包括 JavaScr…

DFA算法实现敏感词过滤

DFA算法实现敏感词过滤 需求:检测一段文本中是否含有敏感词。 比如检测一段文本中是否含有:“滚蛋”,“滚蛋吧你”,“有病”, 可使用的方法有: 遍历敏感词,判断文本中是否含有这个敏感词。 …

索引基础篇

前言 通过本篇博客的学习,我希望大家可以了解到 “索引” 是为了提高数据的查询效率。 索引的介绍 索引是为了提高查询数据效率的数据结构 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着…

【设计模式系列】外观模式(十四)

一、什么是外观模式 外观模式(Facade Pattern)是一种结构型设计模式,其核心目的是为一个复杂的子系统提供一个简化的接口。这种模式通过定义一个外观类来封装子系统内复杂的操作,隐藏系统内部的复杂性,并向客户端提供…

哪些因素会影响 DC/DC 转换电路快速测试的性能?-纳米软件

DC/DC 转换电路在现代电子设备中起着至关重要的作用,其性能的快速准确测试对于确保电子系统的可靠性和稳定性至关重要。然而,有许多因素会影响 DC/DC 转换电路快速测试的性能。 电路复杂性和参数多样性 单片 DC/DC 转换器由于功能模块和参数复杂性&…

从0开始深度学习(25)——多输入多输出通道

之前我们都只研究了一个通道的情况(二值图、灰度图),但实际情况中很多是彩色图像,即有标准的RGB三通道图片,本节将更深入地研究具有多输入和多输出通道的卷积核。 1 多输入通道 当输入包含多个通道时,需要…

2025天津市考8日报名,建议收藏好报名流程

天津市2025年招考2043名公务员公告 35周岁以下(1988年11月至2006年11月期间出生),2025年应届硕士、博士研究生报考的,年龄可放宽到40周岁(1983年11月以后出生); 报名时间:2024年11月…

25中海油笔试测评春招秋招校招暑期实习社招笔试入职测评行测题型微测网题型分享

中海油笔试一般采用线上机考的形式。考试时间为 120 分钟,满分 100 分。笔试内容主要包括思想素质测评和通用能力测评两个科目。以下是具体介绍: 1. 思想素质测评: ✅价值观:考察考生对工作、职业、企业等方面的价值观念和态度&…

使用Docker Compose构建多容器应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Docker Compose构建多容器应用 引言 Docker Compose 简介 安装 Docker Compose 创建基本配置 运行多容器应用 查看服务状态 …

【STM32】项目实战——OV7725/OV2604摄像头颜色识别检测(开源)

本篇文章分享关于如何使用STM32单片机对彩色摄像头(OV7725/OV2604)采集的图像数据进行分析处理,最后实现颜色的识别和检测。 目录 一、什么是颜色识别 1、图像采集识别的一些基本概念 1. 像素(Pixel) 2. 分辨率&am…

精心整理教育研究专题数据资源大全-最新出炉_附下载链接

教育研究专题数据资源大全V1.0 下载链接-点它👉👉👉:教育研究专题数据资源大全-最新出炉.zip 资源介绍 一、中国教育统计年鉴面板数据 简介:《中国教育统计年鉴》是由教育部发展规划司根据全国各省、自治区、直辖市…

【论文速读】| PathSeeker:使用基于强化学习的越狱攻击方法探索大语言模型的安全漏洞

基本信息 原文标题: PathSeeker: Exploring LLM Security Vulnerabilities with a Reinforcement Learning-Based Jailbreak Approach 原文作者: Zhihao Lin, Wei Ma, Mingyi Zhou, Yanjie Zhao, Haoyu Wang, Yang Liu, Jun Wang, Li Li 作者单位: Beihang University, Nany…

越权访问漏洞

V2Board Admin.php 越权访问漏洞 ## 漏洞描述 V2board面板 Admin.php 存在越权访问漏洞,由于部分鉴权代码于v1.6.1版本进行了修改,鉴权方式变为从Redis中获取缓存判定是否存在可以调用… V2Board Admin.php 越权访问漏洞 漏洞描述 V2board面板 Admin.ph…

27.旅游推荐管理系统(基于springboot和vue)

目录 1.系统的受众说明 2. 系统需求分析 2.1 任务概述 2.2 功能性需求 2.3 非功能性需求 2.3.1正确性需求 2.3.2安全性需求 2.3.3界面需求 2.3.4时间特殊性需求 2.3.5稳定性需求 2.3.6故障处理能力需求 2.4 开发技术简介 2.4.1 开发工具简介 2.4.2 开发技术…

CCS下载安装(以12.3.0版本为例)

Code Composer Studio 是一个集成开发环境 (IDE),简称CCS软件。支持 TI 的微控制器和嵌入式处理器产品的开发。Code Composer Studio 包含一整套用于开发和调试嵌入式应用程序的工具。 CCS9.3.0及以上版本不需要License文件,但是CCS旧版本比如CCS5.5.0需…

基于单片机的变频空调系统设计(论文+源码)

1系统总体方案设计 本次基于单片机的变频空调系统设计,选用STC89C52单片机作为系统的主控核心,结合DHT11温湿度传感器实现家居环境中温湿度数据的检测,并设有自动和手动两种模式,在自动模式下,系统会根据按键设定的温…

Visual Studio Code从安装到正常使用

Visual Studio Code的汉化 下载的Visual Studio Code的话可以去应用商店也可以去官网下载。 Visual Studio Code只是一个编译器,不具备编译器功能。因此需要下载一个编译器MinGW MinGW的安装 官网链接MinGW官网链接 一步到位的链接 添加环境变量 进入cmd界面…