M62429L音量控制IC驱动

2023-11-07

前言

        最近项目开发中,要控制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);

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

M62429L音量控制IC驱动 的相关文章

  • 一个mysql语句报错引发的故事

    昨天在自己的本上装了mysql 打算练习sql语句 在创建表的时候报了错 Invalid default value for sex 就是说我sql语句中有个性别的默认值设置是无效的 性别用的是enum数据类型 出错原因是因为数据库的编码不
  • 【Python字典】

    字典类型的基本概念 通过任意键信息查找一组数据中值信息的过程叫映射 Python语言中通过字典实现映射 Python语言中的字典可 以通过大括号 建立 建立模式如下 lt 键1 gt lt 值1 gt lt 键2 gt lt 值2 gt l
  • C++11--包装器与可变参数摸板

    文章目录 可变参数模板 递归函数方式展开参数包 函数包装器 举个例子 bind函数 举个例子 可变参数模板 C 11的新特性可变参数模板能够让我们创建可以接受可变参数的函数模板和类模板 Args是一个模板参数包 args是一个函数形参参数包
  • 【人脸检测】 Tinaface复现(数据集准备、测试与评估)

    转载自 https blog csdn net qq 35975447 article details 110430390 人脸检测 Tinaface复现 数据集准备 测试与评估 参考 TinaFace Strong but Simple
  • Linux服务篇之DNS服务器搭建

    文章目录 一 DNS介绍 1 DNS简介 2 DNS工作原理 3 DNS的资源记录 二 实验 1 DNS正向解析实验 2 反向解析 3 主从服务器配置 三 总结 一 DNS介绍 1 DNS简介 DNS 全称 Domain Name Syst
  • 关于load过高的几种情况

    Linux 中 load啥意思 Load 在 Linux 系统中通常是指系统的负载情况 也称为系统负荷 它指的是系统正在运行的进程数量以及这些进程对系统资源的使用情况 例如 CPU 内存 磁盘 I O 等 Linux 系统的负载通常由三个数

随机推荐

  • osgEarth的Rex引擎原理分析(九十四)rex引擎如何显示瓦片的边界

    目标 八十八 中的问题171 效果图如下 思路 在文章 osgEarth的Rex引擎原理分析 九十一 晕眩图的制作与实现 的基础上 判断纹理坐标的范围 在边界处用特殊颜色即可 着色器代码如下 if oe layer tilec s lt 0
  • unity3D学习之API_Transform 位置

    一 定义 Transform 表示物体的位置 旋转和缩放而且每个对象必备的组件 场景中的每一个物体都有一个Transform 用于储存并操控物体的位置 旋转和缩放 每一个Transform可以有一个父级 允许你分层次应用位置 旋转和缩放 可
  • Qt的事件循环机制

    所有例程和PPT下载 https download csdn net download simonyucsdy 12311712 问题1 Qt中常见的事件有哪些 答 鼠标事件 QMouseEvent 键盘事件 QKeyEvent 绘制事件
  • SAP/FICO/BAPI_ACC_DOCUMENT_POST-外币凭证金额和本位币误差问题处理

    场景 通过BAPI ACC DOCUMENT POST创建USD币别凭证SAP会自动带出CNY本位币金额 本位币金额是USD通过SAP配置的汇率计算出来的 有时候会有误差 想要实现的功能 凭证金额和本位币金额都有外部系统传入设置不需要SAP
  • SQL视图的使用场景/案例

    背景原因 一方面 在一个项目的实际开发过程中牵涉到复杂业务的时候 我们不可避免的需要使用中间表来进行数据连接 一方面 采用Hibernate进行主外键进行关联 多对多 多对一 一对一等 采用主外键关联在数据的操作过程中具有很强的耦合性 尤其
  • gitlab配置ssh密钥及简单使用

    gitlab安装可参考https blog whsir com post 1419 html 演示环境 当前系统Centos6 9 使用IP192 168 0 80 修改gitlab仓库地址 编辑gitlab yml文件 vim opt g
  • 关于安卓调试的log系统

    在安卓系统下 对应用程序的调试 有一个特有的方式 就是log系统 其实就和C语言中的printf函数的使用类似 但是 它是将调试信息存入了缓冲区内 而安卓有四个缓冲区 他的设计模式是模仿了linux内核中的缓冲区模式 将所有的调试信息放入缓
  • Redis的IO多路复用原理

    什么是阻塞 非阻塞 异步同步 select poll epoll 今天我们用一遍文章解开这多年的迷惑 首先我们想要通过网络接收消息 是这样的一个步骤 用户空间向内核空间请求网络数据 内核空间把网卡数据读取到内核缓冲区 将内核缓冲区的数据复制
  • RC正弦波震荡电路

    就开始边写边整理自己的思路吧 毕竟今天刚刚学完 振荡电路是没有输入却有输出的电路 而且是正弦波 就是从白噪声放大 选频得来的 So 可想而知 这个电路需要放大部分 用来放大我们所需的部分 其实是在放大所有频率的 没办法 选频网络 就是两个滤
  • educoder算法设计与分析 实验三 动态规划实验拓展

    实验三 动态规划实验拓展 第1关 聪明的寻宝人 第2关 基因检测 第3关 药剂稀释 第4关 找相似串 第1关 聪明的寻宝人 题目描述 本关任务 计算寻宝人所能带走的宝物的最大价值 一个寻宝人在沙漠中发现一处神秘的宝藏 宝藏中共有n个宝物 n
  • activiti7执行流程详解

    什么是工作流 官方定义 工作流是将一组任务组织起来以完成某个经营过程 定义了任务的触发顺序和触发条件 每个任务可以由一个或多个软件系统完成 也可以由一个或一组人完成 还可以由一个或多个人与软件系统协作完 我的理解 工作流就是针对程序的业务流
  • Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用

    文章目录 1 官网简介 2 在vue3中使用 1 需要导入vue3支持的版本插件 2 在mian js里引入 3 在组件中使用 3 layout布局的计算逻辑 4 gridLayout 的属性 该栅格系统目前对 vue2 的支持是最好的 v
  • 一文说尽用Python赚钱的五种方法!

    Python是一种非常流行的编程语言 因此Python开发人员可以从众多工作选择中进行选择 您可以学习Python 建立良好的产品组合并成为全职开发人员 也可以选择Python编码作为您的自由职业 我们仅介绍了使用Python赚钱的几种常见
  • 【安全狗】Linux后渗透常见后门驻留方式分析

    引言 当RedTeam拿下了一台服务器并获取到系统较高权限 但不知道服务器的凭证时 RedTeam会采用怎样的技术获取系统凭证呢 又或者 在RedTeam拿下一台服务器 为达到长久控制的目的而专门定制持久化后门 免杀肯定是必须的 的前提下
  • 一张图比較 Docker 和 Git:镜像管理设计理念

    Docker 的镜像管理设计中大量借鉴了 Git 的理念 以下这张图将对两者的核心概念和操作进行比較 有助于大家高速掌握管理 Docker 镜像的正确方式 微信订阅版本号 http mp weixin qq com s biz MzA5MT
  • 前端基础自查

    目录 h5和css3的认知 data v 03da18b4 http部分 前端HTTP优化 网页有哪些部分 服务器渲染 跨域 栅格式布局 阻止冒泡的方法 jq的认知 移动端的适配 不同尺寸屏幕 适配不同浏览器 大屏适配 设计稿 数组重复去重
  • laravel输出HTML内容

    blade模板引擎中的 xxx 表达式的返回值将被自动传递给 PHP 的 htmlentities 函数进行处理 以防止 XSS 攻击 如果需要展示未转义的数据 可以使用 xxx
  • 达梦学习进阶-DM8搭建主备切换

    达梦学习进阶 DM8搭建主备切换 达梦学习进阶 DM8搭建主备切换 随着学习深入 单机架构的达梦很少能满足生产环境的灾备要求 而且单机往往测试库用到的比较多 生产环境还是建议搭建主从或者集群 比较稳妥 所以知识储备还是要做好 今天就来冲击一
  • 论文笔记:Adaptive Graph Convolutional Recurrent Network for Traffic Forecasting

    NIPS 2020 1 abstract intro 当前的大多数深度学习方法基于共享参数设计模型 不同节点对应同一套参数 但是 由于每条道路的具体情况不一样 使用同一套参数无法捕捉细粒度的数据模式 gt 这篇论文设计了节点自适应参数学习
  • M62429L音量控制IC驱动

    前言 最近项目开发中 要控制AV端的音量 由于主控端的AV音量控制gpio被复用为其它功能口了 不得已增加一个ic去控制音量的输出 这里使用的是M62429L音量控制IC 1 M62429音量ic概述 M62429L是一款串行数据控制的双声