请教:、IIC协议。为什么IIC IIC如何释放数据总线?为什么=1就是释放?

\u4e3a\u4ec0\u4e48\u6211\u7684IIC\u4ece\u8bbe\u5907\u65e0\u6cd5\u53d1\u9001\u5e94\u7b54\u4fe1\u53f7

\u53ea\u8981IIC\u63a5\u53e3\u82af\u7247\u672a\u635f\u574f\uff0c\u5219\u4e3b\u8981\u95ee\u9898\u5c31\u662fSDA\u3001SCL\u7684\u65f6\u5e8f\u95ee\u9898\u3002
\u4ee5AT89C51+24C04\u9a71\u52a8\u6570\u7801\u7ba1\u4e3a\u4f8b\uff1a
\uff08\u56fe\u7247\u4f20\u4e0d\u4e0a\uff09
#include

#include
#define uchar unsigned char
#define uint unsigned int
#define NOP4() {_nop_();_nop_();_nop_();_nop_();}

sbit SCL = P1^0; //\u65f6\u949f\u7ebf
sbit SDA = P1^1; //\u6570\u636e\u7ebf
sbit clear_K=P3^7;//\u6e050\u952e

uchar code DSY_CODE[]= //\u5171\u9633\u6570\u7801\u663e\u793a\u7f16\u7801
{
0xc0,0xf9,0xa4,0xb0,0x99, //0~4
0x92,0x82,0xf8,0x80,0x90, //5~9
0xff
};

uchar DISP_Buffer[]={0,0,0}; //\u663e\u793a\u7f13\u5b58
uchar Count = 0; //\u5168\u5c40\u53d8\u91cf\uff1a\u8ba1\u6570\u503c

void DelayMS(uint x) //ms\u5ef6\u65f6\u5b50\u51fd\u6570
{
uchar t; //\u5faa\u73af\u53d8\u91cf
while(x--) //\u5faa\u73afx\u6b21
{
for(t=120;t>0;t--); //\u5d4c\u5957\u5faa\u73af120\u6b21
}
}

void Start() //\u5f00\u542f\u603b\u7ebf\u5b50\u7a0b\u5e8f
{
SDA=1;//\u62c9\u9ad8\u6570\u636e\u7ebf\u7535\u5e73
SCL=1;//\u62c9\u9ad8\u65f6\u949f\u7ebf\u7535\u5e73
NOP4(); //\u5ef6\u65f64\u4e2a\u673a\u5668\u5468\u671f
SDA=0;//\u62c9\u4f4e\u6570\u636e\u7ebf\u7535\u5e73
NOP4();//\u5ef6\u65f64\u4e2a\u673a\u5668\u5468\u671f
SCL=0; //\u62c9\u4f4e\u65f6\u949f\u7ebf\u7535\u5e73
}

void Stop() //\u91ca\u653e\u603b\u7ebf\u5b50\u7a0b\u5e8f
{
SDA=0;//\u62c9\u4f4e\u6570\u636e\u7ebf\u7535\u5e73
SCL=0;//\u62c9\u4f4e\u65f6\u949f\u7ebf\u7535\u5e73
NOP4(); //\u5ef6\u65f64\u4e2a\u673a\u5668\u5468\u671f
SCL=1;//\u62c9\u9ad8\u65f6\u949f\u7ebf\u7535\u5e73
NOP4();//\u5ef6\u65f64\u4e2a\u673a\u5668\u5468\u671f
SDA=1; //\u62c9\u9ad8\u6570\u636e\u7ebf\u7535\u5e73
}

void RACK() //\u5e94\u7b54
{
SDA=1;//\u62c9\u9ad8\u6570\u636e\u7ebf\u7535\u5e73
NOP4();//\u5ef6\u65f64\u4e2a\u673a\u5668\u5468\u671f
SCL=1;//\u62c9\u9ad8\u65f6\u949f\u7ebf\u7535\u5e73
NOP4(); //\u5ef6\u65f64\u4e2a\u673a\u5668\u5468\u671f
SCL=0;//\u62c9\u4f4e\u65f6\u949f\u7ebf\u7535\u5e73
}

void NO_ACK() //\u65e0\u5e94\u7b54
{
SDA=1;//\u62c9\u9ad8\u6570\u636e\u7ebf\u7535\u5e73
SCL=1;//\u62c9\u9ad8\u65f6\u949f\u7ebf\u7535\u5e73
NOP4();//\u5ef6\u65f64\u4e2a\u673a\u5668\u5468\u671f
SCL=0;//\u62c9\u4f4e\u65f6\u949f\u7ebf\u7535\u5e73
SDA=0;//\u62c9\u4f4e\u6570\u636e\u7ebf\u7535\u5e73
}

void Write_A_Byte(uchar b) //\u5199\u5165\u4e00\u4e2a\u5b57\u8282\u6570\u636e
{
uchar i; //\u5faa\u73af\u53d8\u91cf
for(i=0;i<8;i++) //\u5faa\u73af8\u6b21
{
b<<=1; //\u6570\u636e\u5de6\u79fb1\u4f4d\uff0c\u6700\u9ad8\u4f4d\u79fb\u5165\u8fdb\u4f4d\u4f4d
SDA=CY;_nop_();//\u5c06\u8fdb\u4f4d\u4f4d\u6570\u9001\u603b\u7ebf\u6570\u636e\u7ebf
SCL=1;NOP4();//\u62c9\u9ad8\u65f6\u949f\u7ebf\u7535\u5e73\uff0c\u5c06\u6570\u636e\u5199\u5165
SCL=0;//\u62c9\u4f4e\u65f6\u949f\u7ebf
}
RACK();//\u5e94\u7b54
}

uchar Receive_A_Byte()//\u63a5\u6536\u4e00\u4e2a\u5b57\u8282\u6570\u636e
{
uchar i,d;//\u5b9a\u4e49\u5faa\u73af\u53d8\u91cf\uff0c\u8bfb\u6570\u53d8\u91cf
for(i=0;i<8;i++)//\u5faa\u73af8\u6b21
{
SCL=1;//\u62c9\u9ad8\u65f6\u949f\u7ebf\u7535\u5e73
d<<=1;//\u8bfb\u6570\u5de6\u79fb1\u4f4d
d|=SDA;//\u5e76\u5165\u4e32\u884c\u6570\u636e\uff08\u4ece\u9ad8\u4f4d\u5230\u4f4e\u4f4d\u9010\u4f4d\u52a0\u5165\uff09
SCL=0;//\u62c9\u4f4e\u65f6\u949f\u7ebf
}
return d;//\u8fd4\u56de\u6570\u636ed\uff088\u4f4d\u5e76\u884c\u6570\u636e\uff09
}

void Write_Random_Address_Byte(uchar add,uchar dat) //\u5199\u968f\u673a\u5730\u5740\u5b57\u8282
{
Start();//\u521d\u59cb\u5316\u603b\u7ebf
Write_A_Byte(0xa0);//\u53d1\u9001\u547d\u4ee4\u63a7\u5236\u5b57\uff1a\u5199\u5165\u5730\u5740\u6570\u636e
Write_A_Byte(add);//\u5199\u5165\u5730\u5740\u7801
Write_A_Byte(dat);//\u5199\u5165\u6570\u636e\u7801
Stop();//\u4f20\u9001\u7ed3\u675f\uff0c\u91ca\u653e\u603b\u7ebf
DelayMS(10);//\u5ef6\u65f610ms
}

uchar Read_Current_Address_Data()//\u8bfb\u6570\u636e\u6d41
{
uchar d;//\u5b9a\u4e49\u6570\u636e\u53d8\u91cf
Start();//\u521d\u59cb\u5316\u603b\u7ebf
Write_A_Byte(0xa1);//\u53d1\u9001\u547d\u4ee4\u63a7\u5236\u5b57\uff1a\u8bfb\u53d6\u6570\u636e
d=Receive_A_Byte();//8\u4f4d\u6570\u636e\u63a5\u6536
NO_ACK();//\u65e0\u5e94\u7b54
Stop();//\u8bfb\u53d6\u6570\u636e\u7ed3\u675f
return d;//\u8fd4\u56ded\u503c
}

uchar Random_Read(uchar addr)//\u968f\u673a\u8bfb\u53d6\u6570\u636e
{
Start();//\u521d\u59cb\u5316\u603b\u7ebf
Write_A_Byte(0xa0);//\u5199\u5165\u8bfb\u53d6\u63a7\u5236\u5b57
Write_A_Byte(addr);//\u5199\u5165\u5b57\u8282\u5730\u5740
Stop();//\u91ca\u653e\u603b\u7ebf
return Read_Current_Address_Data();//\u8fd4\u56de\u6570\u636e\u6d41\u6570\u503c
}

void Convert_And_Display()//\u8f6c\u6362\u5e76\u663e\u793a
{
DISP_Buffer[2]=Count/100;//\u663e\u793a\u7f13\u5b58\u767e\u4f4d\u6570
DISP_Buffer[1]=Count%100/10;//\u663e\u793a\u7f13\u5b58\u5341\u4f4d\u6570
DISP_Buffer[0]=Count%100%10;//\u663e\u793a\u7f13\u5b58\u4e2a\u4f4d\u6570
if(DISP_Buffer[2]==0)//\u5982\u679c\u767e\u4f4d\u6570\u4e3a0
{
DISP_Buffer[2]=10;//\u4e0d\u663e\u793a\u767e\u4f4d\u6570
if(DISP_Buffer[1]==0)//\u5982\u679c\u5341\u4f4d\u6570\u4e5f\u4e3a0
{
DISP_Buffer[1]=10;//\u5341\u4f4d\u6570\u4e5f\u4e0d\u663e\u793a
}
}
P2 = 0x80;//\u9001\u663e\u793a\u4f4d\u7801:\u7b2c8\u4f4d\u6570\u7801\u7ba1
P0 = DSY_CODE[DISP_Buffer[0]];//\u9001\u663e\u793a\u6bb5\u7801:\u663e\u793a\u6570\u4e2a\u4f4d
DelayMS(5);//\u5ef6\u65f65ms
P2=0x00;//\u6d88\u5f71
P2 = 0x40;//\u9001\u663e\u793a\u4f4d\u7801:\u7b2c7\u4f4d\u6570\u7801\u7ba1
P0 = DSY_CODE[DISP_Buffer[1]];//\u9001\u663e\u793a\u6bb5\u7801:\u663e\u793a\u6570\u5341\u4f4d
DelayMS(5);//\u5ef6\u65f65ms
P2=0x00;//\u6d88\u5f71
P2 = 0x20;//\u9001\u663e\u793a\u4f4d\u7801:\u7b2c6\u4f4d\u6570\u7801\u7ba1
P0 = DSY_CODE[DISP_Buffer[2]];//\u9001\u663e\u793a\u6bb5\u7801:\u663e\u793a\u6570\u767e\u4f4d
DelayMS(5);//\u5ef6\u65f65ms
P2=0x00; //\u6d88\u5f71
}

void main()//\u4e3b\u7a0b\u5e8f
{
Count = Random_Read(0x00);//\u8bfb\u53d6\u5b58\u50a8\u6570\u503c(\u4e0a\u7535\u6216\u590d\u4f4d)
Count++;//\u8ba1\u6570\u503c\u81ea\u52a01
Write_Random_Address_Byte(0x00,Count);//\u8ba1\u6570\u503c\u5199\u5165\u5b58\u50a8\u5668
while(1)//\u65e0\u9650\u5faa\u73af
{
if(clear_K==0)//\u5982\u679c\u6e050\u952e\u88ab\u6309\u4e0b
{
DelayMS(10);//\u5ef6\u65f610ms,\u6d88\u6296\u52a8
if(clear_K==0)//\u786e\u8ba4\u6e050\u952e\u88ab\u6309\u4e0b
{
Count=0;//\u8ba1\u6570\u503c\u5f520,
//Count=100;//\u8ba1\u6570\u503c\u8c03\u6574\u4e3a5
}
while(clear_K==0);//\u7b49\u5f85\u952e\u677e\u5f00
Write_Random_Address_Byte(0x00,Count); //\u91cd\u5199\u5b58\u50a8\u5668
}
else//\u5426\u5219
Convert_And_Display();//\u8c03\u7528\u8f6c\u6362\u4e0e\u663e\u793a\u7a0b\u5e8f
}
}

iic \u6ce8\u610f\u5230\u4e00\u70b9\uff0c\u786c\u4ef6\u4e0a\u603b\u7ebf\u7684\u8f93\u51fa\u7ea7\u5fc5\u987b\u662f\u6f0f\u6781\u5f00\u8def\u6216\u96c6\u7535\u6781\u5f00\u8def\uff0c\u8fd9\u5c31\u8ba9\u603b\u7ebf\u5177\u5907\u7ebf\u4e0e\u529f\u80fd\u3002\u7ebf\u4e0e\uff1a\u987e\u540d\u601d\u4e49\u5c31\u662f\u201c\u4e0e\u64cd\u4f5c\u201d\uff0c\u90a3\u4e48\u5f53\u603b\u7ebf\u4e0a\u53ea\u8981\u5b58\u5728\u4e00\u4e2a\u4f4e\u7535\u5e73\uff0c\u6574\u4e2a\u603b\u7ebf\u4e0a\u7684\u7535\u5e73\u90fd\u4f1a\u88ab\u62c9\u4f4e\uff0c\u800c\u53ea\u6709\u4fdd\u6301\u603b\u7ebf\u6240\u6709\u8bbe\u5907\u90fd\u4e3a\u9ad8\u7535\u5e73\uff0c\u6574\u4e2a\u603b\u7ebf\u7684\u7535\u5e73\u624d\u4f1a\u4e3a\u9ad8\u7535\u5e73\uff0c\u8fd9\u4e5f\u662f\u9ad8\u7535\u5e73\u88ab\u5b9a\u4e49\u9ed8\u8ba4\u7535\u5e73\u7684\u539f\u56e0\u3002\u56e0\u6b64\u9ad8\u7535\u5e73\u8868\u793a\u91ca\u653e\u3002

你去看一下IIC的协议。发送8个地址位或者数据位后,会由从机返回一个信号
在协议中成为ACK。ACK=0时,表明主机和从机通信正常,ACK=1时,即NACK
表示从机无应答。硬件连线错误或者时序错误,也有可能是地址错误。
看示波器就能明显看出来,在2个字节数据之间还间隔了1位。这就是ACK
我们就是通过判断ACK确认通信是否正常的。

  • 涓轰粈涔圛IC 瀵逛笂鍗囨部鏃堕棿鏈夎姹
    绛旓細浣犲彲浠ヤ簡瑙d竴涓I2C鐨鍗忚鏍囧噯銆傚叾瀹炰笉鍙槸I2C瀵逛笂鍗囨椂闂存湁瑕佹眰锛屽簲璇ユ槸鍦ㄦ墍鏈夌殑鏁板瓧鐢佃矾涓紝瀵逛笂鍗囨部閮芥槸鏈夎姹傘侷2C鐢变袱鏍圭嚎缁勬垚锛屾暟鎹嚎SDA锛屾椂閽熺嚎SCL锛屾爣鍑嗘ā寮忕殑鏃跺欙紝SCL鐨勯鐜囧彲杈100KHZ锛岄珮閫熸ā寮忕殑鏃跺欙紝棰戠巼鍙揪400KHZ銆傞鐜囪秺楂橈紝瀵逛笂鍗囨部鐨勮姹傝秺楂樸傜幇鍦ㄦ嬁100KHZ鐨勯鐜囨潵璇达紝涓涓猄CL鍛ㄦ湡涓...
  • IIC鏄浠涔
    绛旓細IIC鍗I2C,涓绉嶆荤嚎缁撴瀯.鑰孖IC瀛樺偍鍣ㄤ竴鑸娇鐢‥EPROM瀹炵幇,鏁呭彲浠ュ湪绾胯鍙栧拰鍐欏叆,鍐欏叆鐨勬暟鎹繚瀛樻椂闂翠篃寰堥暱.IIC瀹炵幇璧锋潵闈炲父绠娲,鍙渶寰堝皯鐨勫嚑鏍圭嚎鍗冲彲(鐗囬,鍦板潃,鏁版嵁).鍙傝冭祫鏂欙細鐧惧害
  • IIC鍜孲PI鏈浠涔鍖哄埆?
    绛旓細涓銆佷紭鍔夸笉鍚岋細1銆IIC锛欼IC鎬荤嚎鏄弻鍚戙佷袱绾匡紙SCL銆丼DA锛夈佷覆琛屻佸涓绘帶锛坢ulTI-master锛夋帴鍙f爣鍑嗭紝鍏锋湁鎬荤嚎浠茶鏈哄埗锛岄潪甯搁傚悎鍦ㄥ櫒浠朵箣闂磋繘琛岃繎璺濈銆侀潪缁忓父鎬х殑鏁版嵁閫氫俊銆傚湪瀹冪殑鍗忚浣撶郴涓紝浼犺緭鏁版嵁鏃堕兘浼氬甫涓婄洰鐨勮澶囩殑璁惧鍦板潃锛屽洜姝ゅ彲浠ュ疄鐜拌澶囩粍缃戙2銆丼PI锛歋PI鍦ㄨ姱鐗囩殑绠¤剼涓婂彧鍗犵敤鍥涙牴绾匡紝鑺傜害...
  • iic鎬荤嚎瀹炵幇鍙屾満閫氫俊,姹傛帴绾垮浘鍜屽師鐞
    绛旓細IIC鎬荤嚎鍦ㄦ病鏈夋昏妯″紡鐨勫墠鎻愪笅锛屽彧鑳藉疄鐜颁富浠庨氫俊銆備篃灏辨槸涓绘満鍙互闅忔椂鍚戜粠鏈哄彂閫佹暟鎹紝浣嗗彧鑳界瓑涓绘満璁块棶鎵嶈兘浠庢満鎵嶈兘搴旂瓟銆傝繖涓槸鏍囧噯IIC鍗忚銆備笉鐭ラ亾绗︿笉绗﹀悎浣犲鍙屾満閫氫俊鐨勮姹傘傜數璺浘寰堢畝鍗曪紝鍙敤杩炰笂2鏉′笂锛屼笂鎷変釜鐢甸樆灏卞彲浠ュ暒銆侷IC閫氫俊鐨勫師鐞嗗弬鑰冮鍒╂郸鐨勬爣鍑嗭紝涓ょ嚎鐗瑰畾鐨勭姸鎬佸疄鐜版暟鎹紶杈撳紑濮嬶紝...
  • iic鍗忚涓簲绛斿拰闈炲簲绛旂殑鍖哄埆,鎴戠殑鎰忔濇槸鍦ㄥ簲鐢ㄤ腑鏈浠涔鍖哄埆銆
    绛旓細IIC涓殑搴旂瓟鏄敱浠庢満鍦ㄧ9涓猄CL鍛ㄦ湡鎷変綆SDA瀹炵幇鐨 鑻ヤ笉鑳戒骇鐢熷簲绛旀垨鑰呰鏄湪绗9涓懆鏈熶娇SDA涓洪珮鐢靛钩鍗抽潪搴旂瓟鍒欒鏄庝粠鏈哄繖鎴栬呮湁鍏朵粬鐨勫師鍥犳棤娉曞搷搴旓紝涓绘満搴旇鍙戦佸仠姝㈡垨鑰呴噸鏂板紑濮嬪彂閫 鑰屽簲绛旇鏄庝簡涓绘満鍙戦佺殑涓瀛楄妭鏁颁粠鏈哄凡缁忔敹鍒帮紝鍙互缁х画鎿嶄綔 ...
  • 纭欢鎬荤嚎鍩虹02:IIC鎬荤嚎(1)
    绛旓細鐢卞甯堢帇闆嘲寮曢鐨勬妧鏈垎浜紝姣忓懆鑱氱劍鍦ㄥ疄闄呭簲鐢ㄥ箍娉涚殑IIC鎬荤嚎銆傚敖绠$湅浼肩畝鍗曪紝浣嗚繖娆剧敱Philips绮惧績璁捐鐨勫崐鍙屽伐鍚屾浼犺緭鍗忚鍗撮殣钘忕潃澶嶆潅鎬э紝涓嶅灏忚銆侷IC鎬荤嚎鍦ㄨ澶囩鐞嗭紝濡傛俯搴﹀拰鐢垫簮鐩戞帶锛屼腑鎵紨鐫鍏抽敭瑙掕壊锛屼絾绋嶆湁璁捐涓嶆厧锛屽氨鍙兘寮曞彂淇″彿瀹屾暣鎬ч棶棰樸佺數骞宠浆鎹㈣宸拰鍗忚閿欒銆傚熀纭鐗圭偣涓庝紭鍔锛孖IC浠DA...
  • Arduino IIC鍗忚绗旇
    绛旓細浠栫敱3鏍圭嚎缁勬垚鍒嗗埆鍙玈DA锛孲CL锛孏ND锛孲DA涓烘暟鎹嚎锛孲CL涓烘椂閽熺嚎锛孏ND涓哄弬鑰冪數骞筹紝灏辨槸0鐢靛钩 閫氫俊鍘熺悊鏄氳繃瀵筍CL鍜孲DA绾块珮浣庣數骞虫椂搴忕殑鎺у埗锛屾潵浜х敓I2C鎬荤嚎鍗忚鎵闇瑕佺殑淇″彿杩涜鏁版嵁鐨勪紶閫掋傚湪鎬荤嚎绌洪棽鐘舵佹椂锛岃繖涓ゆ牴绾夸竴鑸涓婇潰鎵鎺ョ殑涓婃媺鐢甸樆鎷夐珮锛屼繚鎸佺潃楂樼數骞 I2C鎬荤嚎涓婄殑姣忎竴涓澶囬兘鍙互浣滀负涓...
  • iic鍗忚璇诲彇鏁版嵁鐨勯棶棰
    绛旓細浣犳暟鎹笉棣栧厛鍐欒繘鍘伙紝鎬庝箞鍙互璇诲嚭鏉ュ憿锛熷氨鍍忎綘娌″悆涓滆タ鎬庝箞浼氭媺涓滆タ鍑烘潵,瑕佹兂浠庡櫒浠朵腑璇诲埌鏁版嵁锛岃偗瀹氳淇濋殰鍣ㄤ欢鏈潵鏈夋暟鎹鍚с傛墍浠ラ鍏堣鍚戦噷闈㈠啓鏁版嵁鍟娿傜劧鍚庡啀璇诲嚭鏉ュ晩銆傚笇鏈涜兘甯埌浣犮
  • 鍗曠墖鏈轰腑IIC鍗忚鏄?
    绛旓細I2C锛圛nter锛岻ntegrated Circuit锛夋荤嚎鏄敱PHILIPS鍏徃寮鍙戠殑涓ょ嚎寮忎覆琛屾荤嚎锛岀敤浜庤繛鎺ュ井鎺у埗鍣ㄥ強鍏跺鍥磋澶囥傛槸寰數瀛愰氫俊鎺у埗棰嗗煙骞挎硾閲囩敤鐨勪竴绉嶆荤嚎鏍囧噯銆傚畠鏄悓姝ラ氫俊鐨勪竴绉嶇壒娈婂舰寮忥紝鍏锋湁鎺ュ彛绾垮皯锛屾帶鍒舵柟寮忕畝鍗曪紝鍣ㄤ欢灏佽褰㈠紡灏忥紝閫氫俊閫熺巼杈冮珮绛変紭鐐广傚弬鑰冭祫鏂欙細http://baike.baidu.com/view/95764.htm...
  • 濡備綍浣跨敤绀烘尝鍣ㄨВ鐮IIC淇″彿?
    绛旓細IIC瑙g爜鍔熻兘鏄竴涓ず娉㈠櫒鐨勯珮绔姛鑳斤紝鍦ㄦ嘲鍏嬨佸畨鎹蜂鸡鐨勭ず娉㈠櫒涓兘涓嶆槸涓涓夐厤浠讹紝浠婂ぉ鎴戝氨鐢╖LG鐨刏DS2022缁欐ゼ涓绘紨绀轰竴涓嬶紝鍥犱负鍏禝IC瑙g爜鍔熻兘涓哄厤璐规爣閰嶅姛鑳姐 鎸変笅銆怐ecode銆戦敭锛屽皢瑙g爜绫诲瀷璁剧疆涓IIC鍗忚锛灏嗗崗璁Е鍙戣涓篛N锛岀敱浜庡湪鑷姩瑙﹀彂妯″紡涓嬶紝娉㈠舰鏄剧ず浼氫笉绋冲畾銆傛寜涓嬮潰鏉夸笂鐨勩怉uto/Normal銆...
  • 扩展阅读:i人和e人测试 ... iic总线协议详解 ... iic协议的通信过程 ... iic时序图 ... i ic协议层通讯过程 ... 如何看懂iic协议 ... i2c 协议 ... spi协议时序图 ... iic通信协议哪些模块常用 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网