• 硬件驱动篇 | 5x24 模拟开关阵列芯片 CH446X


    5x24 模拟开关阵列芯片 CH446X


    一、概述

      CH446X 是 5x24 矩阵模拟开关芯片。CH446X 包含 120 只模拟开关,分布于 5x24 信号通道矩阵的各个交叉点,每只模拟开关都可以独立的开启或者关闭,从而实现 5x24 信号通道的任意路由。

     

    二、引脚

     

    三、功能说明

      参考首页的框图,CH446X 芯片内部分为三个部分:接口控制逻辑、128 只锁存器、120 只模拟开关阵列。

      128 只模拟开关分布于由 24 个 X 端口和5 个 Y 端口组成的 5x24 矩阵的每个交叉点,使得任意一个 X 端口和任意一个 Y 端口之间能够在需要时导通或者断开,甚至可以使某两个 X 端口分别导通到某个 Y 端口,实现任意两个 X 端口之间或者任意两个 Y 端口之间的间接导通(CH446X 虽然有 128 只锁存器,但是只有 120 只模拟开关,有 8 只锁存器没有任何用途)

      128 只锁存器用于分别控制 128 只模拟开关的导通或者断开,128 只锁存器被编址为 0 到 127,由 7 位地址 ADDR6~ADDR0 译码后选择。从 RST 引脚输入高电平复位信号可以将所有锁存器清 0,从而导致所有模拟开关断开。需要开启或者关闭某一模拟开关时,应该通过 7 位的 ADDR 提供锁存器的地址,并通过 DAT 提供开关数据(1 则导通,0 则关闭),然后产生一个 ACT 激活脉冲,将开关数据写入由 ADDR 译码指定的锁存器,实现对指定的某个模拟开关的控制。

      接口控制逻辑主要用于产生 ADDR 地址和 ACT 激活脉冲。在串行地址输入方式下,由 CS/CK 引脚输入时钟,在其每个上升沿,从 DAT 引脚依次输入 ADDR6、ADDR5直到ADDR1、ADDR0(分别对应于 AY2、AY1 直到 AX1、AX0),CS/CK 引脚需要提供 7 个上升沿得到 7位地址,并由 STB 引脚输入的高电平选通脉冲直接产生 ACT 激活脉冲。

      实际上,在串行地址输入方式下,ACT 信号只是来自 STB 引脚的输入。RST 复位信号优先于 ACT 信号,当 RST 输入高电平时,ACT 信号将被忽略,所有锁存器总是被清 0。在 ACT 激活脉冲有效期间,DAT 引脚可以动态改变输入的开关数据,并使得相应的模拟开关实时地导通或者关闭,但是在 ACT 信号结束之前(即STB 的下降沿之前),DAT 引脚的输入数据应该保持稳定以便正确地锁存数据。

      下图是一个串行地址输入的实例,控制 14H 地址(Y1 和 X4 之间)的模拟开关,先开再关。

      下表是 CH446X 芯片 7 位地址 ADDR 的译码真值表,也是 120 只模拟开关的编址表。

     

    四、应用 -- 串行地址输入

      

      如果 VEE 接负电压,那么模拟开关可以通过负电压的模拟信号,否则 VEE 接 GND,模拟开关只能通过高于-0.3V 的模拟信号。

      由于模拟电路与数字电路共用 VDD,为减少干扰,VDD 和 VEE 引脚必须外接退耦电容,并且建议将数字输入信号的边沿适当放缓,降低传输频率。另外,对于强干扰的应用环境,单片机可以每隔数秒定期对 CH446 进行刷新,确保各个模拟开关处于正确的开关状态。

      串行地址输入方式下的控制步骤:通过 DAT 引脚依次提供 7 位地址并用 CS/CK 引脚的 7 个上升沿移入 CH446,通过 DAT 引脚提供数据、向 STB 引脚提供一个高电平脉冲。

      如果单片机通过 SPI 总线连接 CH446X,那么 SPI 提供的一字节 8 位数据的位 7 将被 CH446 丢弃,SPI 的位 6 到位 0 作为地址,单片机 SPI 的串行数据输出引脚连接 DAT 引脚提供开关数据,单片机使用一个独立引脚控制 CH446 的 STB 引脚。

      图为8x16 矩阵模拟开关芯片CH446Q,CH446X类似

    五、程序接口

     1 /*  *****************************************************
     2 //  函数功能:CH446X模拟开关复位,即通道全部关闭
     3 //  输入参数:
     4 //  输出参数:
     5 //  函数返回:
     6 //  修改记录:
     7 //  补充说明:
     8 *****************************************************  */
     9 void Control_Switch_Reset(void)
    10 {
    11     CH446X_RST = 1;        // RST引脚高电平
    12     CH446X_RST = 1; 
    13     CH446X_RST = 1; 
    14     NOP;                             // 延时
    15     NOP; 
    16     NOP; 
    17     NOP; 
    18     NOP; 
    19     NOP; 
    20     CH446X_RST = 0; 
    21     CH446X_RST = 0;    
    22 }
    23 
    24 /*  *****************************************************
    25 //  函数功能:CH446X模拟开关通道选择导通
    26 //  输入参数:
    27 //  输出参数:
    28 //  函数返回:
    29 //  修改记录:
    30 //  补充说明:
    31 *****************************************************  */
    32 void Control_Switch_State(u8 Address,u8 State) 
    33 { 
    34     u8 ByteCnt; 
    35     
    36     CH446X_STB = 0; 
    37     CH446X_DAT = 0; 
    38     NOP; 
    39     NOP; 
    40     for(ByteCnt = 0; ByteCnt < 7; ByteCnt++ ) 
    41     { 
    42         CH446X_CK = 0; 
    43         NOP; 
    44         if( Address & 0x80 ) 
    45         { 
    46             CH446X_DAT = 1; 
    47         } 
    48         else 
    49         { 
    50             CH446X_DAT = 0;    
    51         } 
    52         CH446X_CK = 1; 
    53         NOP; 
    54         NOP; 
    55         NOP; 
    56         NOP; 
    57         NOP;    
    58         Address <<= 1;             // 左移1位
    59     } 
    60     CH446X_CK = 0; 
    61     if( State == 1 ) 
    62     { 
    63         CH446X_DAT =1;    
    64     } 
    65     else 
    66     { 
    67         CH446X_DAT =0;    
    68     } 
    69     NOP; 
    70     NOP; 
    71     NOP; 
    72     NOP; 
    73     CH446X_STB =1; 
    74     NOP; 
    75     NOP; 
    76     CH446X_STB =0; 
    77     NOP; 
    78     NOP; 
    79 } 
    80 
    81 void main( void ) 
    82 { 
    83     Control_Switch_Reset();
    84     
    85     Control_Switch_State(0x00, 1);    // Y0,X0导通
    86     Control_Switch_State(0x01, 1);    // Y0,X1导通 
    87     while(1)
    88     {
    89     
    90     } 
    91 
    92 } 
  • 相关阅读:
    Vim的分屏功能
    vim简明教程
    trk压力测试工具(测试tcp)
    浅谈ThreadPool 线程池
    压力测试的概念
    wrk 网站压力测试
    windows下vim中文乱码处理
    java 新创建的类要重写的方法
    多线程代码示例
    System.out.print实现原理猜解
  • 原文地址:https://www.cnblogs.com/Tuple-Joe/p/13529488.html
Copyright © 2020-2023  润新知