5×24 模拟开关阵列芯片 CH446X


一、概述

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

硬件驱动篇 | 5×24 模拟开关阵列芯片 CH446X-风君雪科技博客 

二、引脚

 硬件驱动篇 | 5×24 模拟开关阵列芯片 CH446X-风君雪科技博客

三、功能说明

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

  128 只模拟开关分布于由 24 个 X 端口和5 个 Y 端口组成的 5×24 矩阵的每个交叉点,使得任意一个 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 之间)的模拟开关,先开再关。

硬件驱动篇 | 5×24 模拟开关阵列芯片 CH446X-风君雪科技博客

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

硬件驱动篇 | 5×24 模拟开关阵列芯片 CH446X-风君雪科技博客

 硬件驱动篇 | 5×24 模拟开关阵列芯片 CH446X-风君雪科技博客

四、应用 — 串行地址输入

  

  如果 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 引脚。

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

硬件驱动篇 | 5×24 模拟开关阵列芯片 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 }