我要用單片機(jī)控制CH446切換。產(chǎn)品中一半左右出現(xiàn)上電后復(fù)位不正常的現(xiàn)象,經(jīng)測(cè)試,CH446的引腳電平都在零點(diǎn)幾伏左右,而正常復(fù)位后應(yīng)該是5V的。 單片機(jī)開機(jī)后是先延時(shí)了2秒鐘,才發(fā)送的復(fù)位信號(hào),單片機(jī)是3.5V復(fù)位,CH446是4V復(fù)位,測(cè)試了一下CH446電源部分電壓從0上升到5V大概才需要40ms,我延時(shí)了2秒才發(fā)送復(fù)位信號(hào)的,應(yīng)該可以正常復(fù)位了吧。 但怎么還有很多產(chǎn)品不能夠正常復(fù)位呢?
你給CH446復(fù)位是通過(guò)單片機(jī)I/O口復(fù)位的嗎?CH446芯片工作電壓是多少?
是通過(guò)單片機(jī)發(fā)送的復(fù)位信號(hào)。CH446和單片機(jī)都是5V供電
試了一下,連續(xù)送3次(復(fù)位、切換)才能夠正常切換過(guò)來(lái)。是時(shí)序的問(wèn)題嗎?
這個(gè)更像是延時(shí)的時(shí)間不足導(dǎo)致的。
-----------------下面的代碼,是技術(shù)支持給的。 ---------------------------------- #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導(dǎo)通 */ Control_Switch_State( 0x22,1);/* Y1,X1導(dǎo)通 */ while(1); } //----------------------------------------------------------------------------- 我用的是宏晶的STC單片機(jī),30M晶振,代碼與上面一樣,同時(shí)由于STC單片機(jī)比51快,將延時(shí)函數(shù): #define NOP { _nop_();_nop_();} 改為了 #define NOP { _nop_();_nop_();_nop_();_nop_();_nop_();}
但是,仍然出現(xiàn)上面的情況,很多情況下,連續(xù)發(fā)三次(復(fù)位、切換)才可正常,有時(shí)發(fā)1次能正常。
在復(fù)位之后加50MS的延時(shí)在切換。 CH446_RST =0; CH446_RST =0; DELAYMS(50); Control_Switch_State( 0x00,1);/* Y0,X0導(dǎo)通 */ Control_Switch_State( 0x22,1);/* Y1,X1導(dǎo)通 */
加了50m延時(shí),問(wèn)題依舊。沒(méi)效果。
另外: CH446手冊(cè)上說(shuō):-------------------------------------------------------------------------- 由于模擬電路與數(shù)字電路共用VDD,為減少干擾,VDD和VEE引腳必須外接退耦電容,并且建議 將數(shù)字輸入信號(hào)的邊沿適當(dāng)放緩,降低傳輸頻率。另外,對(duì)于強(qiáng)干擾的應(yīng)用環(huán)境,單片機(jī)可以每隔數(shù) 秒定期對(duì)CH446進(jìn)行刷新,確保各個(gè)模擬開關(guān)處于正確的開關(guān)狀態(tài)。 ---------------------------------------------------------------------------------------- 那就是說(shuō):我用CH446切換后,還要定期刷新啊,那豈不是太不可靠了。
我也是按照這個(gè)代碼移植到用pic驅(qū)動(dòng),我想問(wèn)的是不用初始化ch446的嗎?直接這樣我是發(fā)現(xiàn)沒(méi)任何反應(yīng)的,然后整個(gè)社區(qū)我都翻了一遍都沒(méi)有例程……不知道怎么用的
樓上的朋友,不知道您芯片的電路連接是否有問(wèn)題,可以直接來(lái)電確認(rèn)一下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); } //發(fā)送地址和狀態(tài) 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); }
測(cè)試成功?。?!
CH446X 供電7.6v,芯片發(fā)燙,怎么處理? 供電5V,就正常了。
電源電壓應(yīng)該滿足兩個(gè)條件:VDD>GND>=VEE 和 VDD>GND+4V,推薦以下組合: