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)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; 24 /* *****************************************************25 // 函数功能:CH446X模拟开关通道选择导通26 // 输入参数:27 // 输出参数:28 // 函数返回:29 // 修改记录:30 // 补充说明:31 ***************************************************** */32 void Control_Switch_State(u8 Address,u8 State) 33 { 34 u8 ByteCnt; 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 } 81 void main( void ) 82 { 83 Control_Switch_Reset();85 Control_Switch_State(0x00, 1); // Y0,X0导通86 Control_Switch_State(0x01, 1); // Y0,X1导通 87 while(1)90 } 92 }