我要用单片机控制CH446切换。产品中一半左右出现上电后复位不正常的现象,经测试,CH446的引脚电平都在零点几伏左右,而正常复位后应该是5V的。 单片机开机后是先延时了2秒钟,才发送的复位信号,单片机是3.5V复位,CH446是4V复位,测试了一下CH446电源部分电压从0上升到5V大概才需要40ms,我延时了2秒才发送复位信号的,应该可以正常复位了吧。 但怎么还有很多产品不能够正常复位呢?
你给CH446复位是通过单片机I/O口复位的吗?CH446芯片工作电压是多少?
是通过单片机发送的复位信号。CH446和单片机都是5V供电
试了一下,连续送3次(复位、切换)才能够正常切换过来。是时序的问题吗?
这个更像是延时的时间不足导致的。
-----------------下面的代码,是技术支持给的。 ---------------------------------- #include "reg52.h" #include "intrins.h"
sbit CH446_DAT =P1^0; sbit CH446_CK =P1^1; sbit CH446_STB =P1^2; sbit CH446_RST =P1^3;
typedef unsigned char UINT8; typedef unsigned short UINT16;
#define NOP { _nop_();_nop_();}
void Control_Switch_State( UINT8 Address,UINT8 State ) { UINT8 ByteCnt;
CH446_STB =0; CH446_DAT = 0; NOP; NOP; for( ByteCnt=0; ByteCnt<7; ByteCnt++ ) { CH446_CK =0; NOP; if( Address & 0x80 ) { CH446_DAT = 1; } else { CH446_DAT = 0; } CH446_CK =1; NOP; NOP; NOP; NOP; NOP; Address <<=1; } CH446_CK =0; if( State == 1 ) { CH446_DAT =1; } else { CH446_DAT =0; } NOP; NOP; NOP; NOP; CH446_STB =1; NOP; NOP; CH446_STB =0; NOP; NOP; }
void main( void ) { CH446_RST =1; CH446_RST =1; CH446_RST =1; NOP; NOP; NOP; NOP; NOP; NOP; CH446_RST =0; CH446_RST =0; Control_Switch_State( 0x00,1);/* Y0,X0导通 */ Control_Switch_State( 0x22,1);/* Y1,X1导通 */ while(1); } //----------------------------------------------------------------------------- 我用的是宏晶的STC单片机,30M晶振,代码与上面一样,同时由于STC单片机比51快,将延时函数: #define NOP { _nop_();_nop_();} 改为了 #define NOP { _nop_();_nop_();_nop_();_nop_();_nop_();}
但是,仍然出现上面的情况,很多情况下,连续发三次(复位、切换)才可正常,有时发1次能正常。
在复位之后加50MS的延时在切换。 CH446_RST =0; CH446_RST =0; DELAYMS(50); Control_Switch_State( 0x00,1);/* Y0,X0导通 */ Control_Switch_State( 0x22,1);/* Y1,X1导通 */
加了50m延时,问题依旧。没效果。
另外: CH446手册上说:-------------------------------------------------------------------------- 由于模拟电路与数字电路共用VDD,为减少干扰,VDD和VEE引脚必须外接退耦电容,并且建议 将数字输入信号的边沿适当放缓,降低传输频率。另外,对于强干扰的应用环境,单片机可以每隔数 秒定期对CH446进行刷新,确保各个模拟开关处于正确的开关状态。 ---------------------------------------------------------------------------------------- 那就是说:我用CH446切换后,还要定期刷新啊,那岂不是太不可靠了。
我也是按照这个代码移植到用pic驱动,我想问的是不用初始化ch446的吗?直接这样我是发现没任何反应的,然后整个社区我都翻了一遍都没有例程……不知道怎么用的
楼上的朋友,不知道您芯片的电路连接是否有问题,可以直接来电确认一下025-52632854
#include #define RST 4 #define STB 19 #define SK 18 #define DAT 23 #define LED 5 //CH446Q初始化 void CH446Q_Init(){ pinMode(STB,OUTPUT); pinMode(DAT,OUTPUT); pinMode(SK,OUTPUT); pinMode(RST,OUTPUT); digitalWrite(RST,1); delay(50); digitalWrite(RST,0); } //发送地址和状态 void CH446Q_SendAddr_Switch(uint8_t addr,bool data){ uint8_t ByteCnt; digitalWrite(STB,0); digitalWrite(DAT,0); delay(20); for(ByteCnt=0;ByteCnt<8;ByteCnt++){ digitalWrite(SK,0); delay(10); if(addr & 0x80){ digitalWrite(DAT,1); }else{ digitalWrite(DAT,0); } digitalWrite(SK,1); delay(50); addr <<=1; } digitalWrite(SK,0); if(data == 1){ digitalWrite(DAT,1); }else{ digitalWrite(DAT,0); } delay(40); digitalWrite(STB,1); delay(20); digitalWrite(STB,0); delay(20); } void setup() { CH446Q_Init(); CH446Q_SendAddr_Switch(0x01,1); //Y0-X1连接 CH446Q_SendAddr_Switch(0x7F,1); //Y7-X15连接 pinMode(LED,OUTPUT); } void loop() { digitalWrite(LED,1); delay(1000); digitalWrite(LED,0); delay(1000); }
测试成功!!!
CH446X 供电7.6v,芯片发烫,怎么处理? 供电5V,就正常了。
电源电压应该满足两个条件:VDD>GND>=VEE 和 VDD>GND+4V,推荐以下组合: