M62429L音量控制IC驱动

news2024/9/23 7:33:39

前言

        最近项目开发中,要控制AV端的音量,由于主控端的AV音量控制gpio被复用为其它功能口了,不得已增加一个ic去控制音量的输出,这里使用的是M62429L音量控制IC。

1.M62429音量ic概述

        M62429L是一款串行数据控制的双声道电子音量控制器芯片,允许每个声道独立控制,音量为0dB~ -83dB,每级可控1dB。

1.1  ic引脚及其功能

硬件引脚图如下:

 引脚功能定义如下:

 讲音量信号输入到VIN1或者VIN2经过内部电路处理后,从VOUT1或者VOUT2输出;

1.2 控制数据格式

一帧控制数据为10bit,bit0选择需要控制的声道,bit1选择控制几个声道,bit2-bit8为控制音量的数据,bit9-bit10默认为高电平1。

 1.2.1  音量控制数据bit2-bit8

音量控制数据分为两部分,可以这样去理解,D2-D6控制大的步伐,可以从表中看出每组数据间隔4dB,D7-D8控制小的步伐,0~3dB。

举个例子,假如你设置音量为-7dB,那么此时D2-D6就应该设置为-4dB(00101),D7-D8配置为-3dB(00),依次类推,最小音量可以设置为-83dB,最大音量为0dB。

 1.3 控制信号时序图

说完数据格式,接下来就是要去了解clock,data的时序了,CLOCK和DATA引脚通常是从主控端引出两个gpio脚,根据这两个gpio去模拟时序进行数据发送,模拟clock时序的时候需要注意它的最小时钟周期为4us;从下图中可以知道,bit0-bit10发送的数据都是在时钟上升沿的时候ic会去读取,需要注意的是在上升沿读取完位数据后,要下下降沿前把位数据拉为低电平0,因为在时钟为下降沿的时候ic会读取触发信号,如果下降沿读取的信号为高电平1表示一帧数据(D0-D10)发送完成,所以在D10数据读取完成后,data线维持为高电平表示数据发送完成。

 2.软件驱动控制ic

软件驱动上还是比较简单的,可以将D2-D6、D7-D8控制数据用数组的形式列举出来,然后根据设置的真实音量整合成一帧数据发送即可。

M62429L_data函数中参数track_set:为D0位声道选择,ctrl_set:为控制声道数,vol:为设置音量(0~100),函数中先将vol转换为0-87区间的数,然后再去索引对应两数组的哪个值,最后,将其移位整合为一组数据。

M62429L_send_data函数为发送的数据、clock和data时序。

#define DATA_D0_0 0x0         //track1
#define DATA_D0_1 0x1         //track2
#define DATA_D1_0 (0x0 <<1)   //all ctrl
#define DATA_D1_1 (0x1 <<1)   //one ctrl
#define DATA_D9_D10 (0x11 <<9)

int8_t data_d6_d2[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,
                            0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15};   //-& ~ 0db
int8_t data_d8_d7[] = {0x0,0x1,0x2,0x3};   //-3db ~ 0db

void M62429L_gpio_init()
{
    gpio_configure(PINPAD_T14, GPIO_DIR_OUTPUT); //clk
    gpio_configure(PINPAD_T19, GPIO_DIR_OUTPUT); //data
    gpio_set_output(PINPAD_T14,0);
    gpio_set_output(PINPAD_T19,0);
}

void M62429L_set_clk(bool value)
{
    gpio_set_output(PINPAD_T14,value);
}

void M62429L_set_data(bool value)
{
    gpio_set_output(PINPAD_T19,value);
}

int16_t M62429L_data(bool track_set,bool ctrl_set,int8_t vol)
{
    int16_t vol_data = 0x00;
    int8_t data8_2[2]={0};

    if(track_set){
        vol_data |= DATA_D0_1;
    }
    if(ctrl_set){
        vol_data |= DATA_D1_1;
    }
    vol = vol * 87 / 100;
    data8_2[0] = vol /4;
    data8_2[1] = vol %4;
    vol_data = vol_data | (data_d6_d2[data8_2[0]] <<2) | (data_d8_d7[data8_2[1]] <<7) | DATA_D9_D10;
    printf("vol:%d,data[0]:%d,data[1]:%d,vol_data:%d\n",vol,data8_2[0],data8_2[1],vol_data);

    return vol_data;
}

void M62429L_send_data(bool track_set,bool ctrl_set,int8_t vol)
{
    int16_t vol_data = 0;
    bool data_bit = 0;

    vol_data = M62429L_data(track_set,ctrl_set,vol);
    for(int i=0; i<=9;i++){
        data_bit = (vol_data>>i)&0x1;
        M62429L_set_clk(0);
        usleep(10);
        M62429L_set_data(data_bit);
        usleep(10);
        M62429L_set_clk(1);
        usleep(10);
        M62429L_set_data(0);
        usleep(10);
    }
    M62429L_set_clk(0);
    usleep(10);
    M62429L_set_data(1);
    usleep(10);
    M62429L_set_clk(1);
    usleep(10);
    M62429L_set_clk(0);
    usleep(10);

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

用图来理解group by、where、having、聚合函数使用

基本概念&#xff1a; 常用聚合函数&#xff1a;count、max、min、avg、sum&#xff0c;对一整体数据进行计算group by&#xff1a;用来分组where&#xff1a;条件查询having&#xff1a;分组后条件查询 疑问&#xff1a; group by配合聚合函数和where配合聚合函数有什么不同…

【数据结构】24王道考研笔记——串

四、串 串的定义 串&#xff08;字符串&#xff09;是由零个或多个字符组成的有限序列。 子串&#xff1a;串中任意个连续的字符组成的子序列主串&#xff1a;包含子串的串字符在主串中的位置&#xff1a;字符在串中的序号子串在主串中的位置&#xff1a;子串的第一个字符在…

Mysql8安装教程与配置

添加密码 出现报错 MySQL error 1042: Unable to connect to any of the specified MySQL hosts. Failed to connect to MySQL Server 8.0.23 after 10 attempts. Ended configuration step: Starting the server 使用WinR --> 运行 “services.msc” --> 打开service服…

Kubernatas Pod卷 - Pod镜像的升级和回滚 - 探针

目录 扩展&#xff1a; Pod创建的拓扑图&#xff1a; 提出的问题&#xff1a; Pod 卷的使用&#xff1a;Pod的数据持久化问题 配置 Pod 以使用卷进行存储 参考文档&#xff1a;配置 Pod 以使用卷进行存储 | Kubernetes 有状态应用和无状态应用&#xff1a; Pod 配置卷 1…

C++好难(8):C++中的继承

目录 1.继承的概念及定义 &#x1f349;继承的概念 &#x1f349; 继承的定义&#xff1a; &#x1f352;格式定义&#xff1a; &#x1f352;继承关系和访问限定符 &#x1f352;继承基类成员访问方式的变化 2.基类和派生类对象赋值转换 3.继承中的作用域&#xff1a; …

分隔链表(大小链表的连接)

题目&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&…

前端Vue自定义加载loading组件 通过设置gif实现loading动画 可用于页面请求前loading

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。 通过组件化开发&#xff0c;可以有效实现…

Altermanager安装和使用

1、Altermanager使用 1.1 什么是Alertmanager Alertmanager 与 Prometheus 是相互分离的两个组件&#xff0c;Prometheus 服务器根据报警规则将警报发送给 Alertmanager&#xff0c;然后 Alertmanager 将 silencing、inhibition、aggregation 等消息通过电子邮件、dingtalk …

【每日算法】【219. 存在重复元素 II】

☀️博客主页&#xff1a;CSDN博客主页 &#x1f4a8;本文由 我是小狼君 原创&#xff0c;首发于 CSDN&#x1f4a2; &#x1f525;学习专栏推荐&#xff1a;面试汇总 ❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏 ⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&…

LabVIEW-Solidworks联合仿真

介绍 NI Softmotion介绍 LabVIEW NI SoftMotion 采用高级功能块API (应用程序接口) 便于编写运动程序&#xff0c;该功能块API基于由PLCopen 定义的 Motion Control Library 。SoftMotion 包括用于直线、弧线和轮廓运动的功能块及用于进行电子传动、电子凸轮等高级运行的功能块…

Oracle 的删除

前言 最近在工作中需要将一台电脑上的 Oracle &#xff0c;删除 Oracle 与删除 MySQL 不太一样&#xff0c;删除 Oracle 还需要删除注册表中的内容&#xff0c;不然重新安装的时候会报错。 关闭服务 win r 开启运行窗口&#xff0c;输入 services.msc 打开服务列表。 将 O…

【Redis故障排查】「连接失败问题排查和解决」带你深入分析一下Redis阻塞原因以及问题排查方案指南

Redis阻塞原因以及问题排查 尽管我们在日常工作中经常使用Redis作为数据库的缓存&#xff0c;以大大减轻数据库压力并提升用户体验&#xff0c;但Redis也可能出现阻塞情况&#xff0c;导致整个系统变慢&#xff0c;进而影响用户体验。 因此&#xff0c;在面对Redis阻塞的情况…

傅里叶变换通俗理解,附python代码

傅里叶变换可以简单理解为用一系列三角函数去拟合一个目标函数。为什么可以用三角函数拟合&#xff1f;因为三角函数 是一组正交基。 先来回顾一下正交的概念&#xff0c;在二维平面坐标系中&#xff0c;与这两个单位向量&#xff0c;正交&#xff08;内积为0&#xff0c;相互…

单机模型并行最佳实践

单机模型并行最佳实践 模型并行在分布式训练技术中被广泛使用。 先前的帖子已经解释了如何使用DataParallel在多个 GPU 上训练神经网络&#xff1b; 此功能将相同的模型复制到所有 GPU&#xff0c;其中每个 GPU 消耗输入数据的不同分区。 尽管它可以极大地加快训练过程&#x…

MySQL的基本操作及实用示例(面试真题老实用了)

一、MySQL基本操作 常用语句 MySQL是一个常用的关系型数据库管理系统&#xff0c;可以用于存储和管理数据。下面是MySQL的一些基本操作&#xff1a; 1. 连接到MySQL服务器&#xff1a; mysql -u username -p 其中&#xff0c;username是你的用户名&#xff0c;执行该命令后会…

【软件分析/静态分析】chapter5 课程07 过程间分析(Interprocedural Analysis)

&#x1f517; 课程链接&#xff1a;李樾老师和谭天老师的&#xff1a; 南京大学《软件分析》课程07&#xff08;Interprocedural Analysis&#xff09;_哔哩哔哩_bilibili 目录 第五章 过程间分析 5.1 为什么需要过程间分析 5.2 Call Graph 5.2.1 调用图的概念 5.2.2 调…

2023 年 GitHub 上最火的 Java 面试宝典正式上线

笔记特点&#xff1a;条理清晰&#xff0c;含图像化表示更加易懂。 内容概要&#xff1a;包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring 全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Ne…

Vue实现拖拽鼠标圈选、划区域、框选组件sgRectSelect:矩形区域选中checkbox,并回调相关选中、取消选中的操作

边框线虚线动画效果请参阅边框虚线滚动动画特效_虚线滚动效果_你挚爱的强哥的博客-CSDN博客【代码】边框虚线滚动动画特效。_虚线滚动效果https://blog.csdn.net/qq_37860634/article/details/130507289 碰撞检测原理请前往 原生JS完成“一对一、一对多”矩形DIV碰撞检测、碰撞…

车载以太网 - SomeIP - 协议用例 - RPC

目录 RPC Protocol specification 1、Cleint和Server端应该为一个服务实例的所有的Methodsevents使用一个TCP连接

AtCoder Regular Contest 163 C. Harmonic Mean(构造 补写法)

题目 t(t<500)组case&#xff0c; 给定一个数n(n<500)&#xff0c;构造一个长为n的数组 思路来源 官方题解 题解 注意到 ... 右边累加&#xff0c;等于1-最后一项&#xff0c;可以把最后一项挪到左边 所以&#xff0c; 1. 当n没有在前面的序列里出现过时&#xf…