|
這個(gè)字節(jié)發(fā)送函數(shù)我看得明白是符合數(shù)據(jù)位的有效性性規(guī)定,一字節(jié)數(shù)據(jù)一次一位發(fā)送,以SCL=1保證數(shù)據(jù)有效性,之后將SCL置0,當(dāng)需要再發(fā)送一位時(shí)SCL=0,符合數(shù)據(jù)有效性
可是這個(gè)字節(jié)接收函數(shù)首先他就讓SCL=0,不是很懂,我的初步理解結(jié)合兩個(gè)函數(shù)一起看,當(dāng)字節(jié)發(fā)送函數(shù)時(shí)由主機(jī)控制SCL變化,發(fā)送一位上SDA,讓SCL=1,先保證他數(shù)據(jù)有效傳輸,然后SCL=0,同上,之后再發(fā)送一位時(shí),SCL=0,因此SDA可以變化,對(duì)于字節(jié)接收函數(shù),此時(shí)由從機(jī)控制SCL變化,當(dāng)主機(jī)發(fā)送完數(shù)據(jù)叢機(jī)準(zhǔn)備接收時(shí),首先打開(kāi)SCL=0,保證一位一位接收時(shí)SDA可以變化,當(dāng)有一位在SDA上時(shí),讓SCL=1,保證傳輸?shù)綇臋C(jī)這的數(shù)據(jù)是有效的。請(qǐng)大佬指證
至于最初的字節(jié)接收函數(shù)開(kāi)始的SDA=1,和最后的SCL=0不是很懂。
請(qǐng)大佬指教一下,不是很懂,希望大佬能詳細(xì)講解下,這里想了很久卡了很久,希望大佬可以對(duì)比著這兩個(gè)函數(shù)講講數(shù)據(jù)傳輸過(guò)程。
- /*******************************************************************
- 字節(jié)數(shù)據(jù)接收函數(shù)
- 函數(shù)原型: UCHAR I2C_RcvByte();
- 功能: 用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
- 發(fā)完后請(qǐng)用應(yīng)答函數(shù)應(yīng)答從機(jī)。
- ********************************************************************/
- unsigned char I2C_RcvByte()
- {
- unsigned char retc=0,i;
- sda=1; /*置數(shù)據(jù)線為輸入方式*/ (不是很明白???)
- for(i=0;i<8;i++)
- {
- _nop_();
- scl=0; /*置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
- _nop_();
- _nop_(); /*時(shí)鐘低電平周期大于4.7μs*/
- _nop_();
- _nop_();
- _nop_();
- scl=1; /*置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
- _nop_();
- _nop_();
- retc=retc<<1;
- if(sda==1)retc=retc+1; /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
- _nop_();
- _nop_();
- }
- scl=0; (不是很懂???)
- _nop_();
- _nop_();
- return(retc);
- }
- /*******************************************************************
- 字節(jié)數(shù)據(jù)發(fā)送函數(shù)
- 函數(shù)原型: void I2C_SendByte(UCHAR c);
- 功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
- 此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
- 發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無(wú)應(yīng)答或損壞。
- ********************************************************************/
- void I2C_SendByte(unsigned char c)
- {
- unsigned char i;
- for(i=0;i<8;i++) /*要傳送的數(shù)據(jù)長(zhǎng)度為8位*/
- {
- if((c<<i)&0x80)sda=1; /*判斷發(fā)送位*/
- else sda=0;
- _nop_();
- scl=1; /*置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位*/
- _nop_();
- _nop_(); /*保證時(shí)鐘高電平周期大于4μs*/
- _nop_();
- _nop_();
- _nop_();
- scl=0;
- }
- _nop_();
- _nop_();
- sda=1; /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
- _nop_();
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- _nop_();
- if(sda==1)ack=0;
- else ack=1; /*判斷是否接收到應(yīng)答信號(hào)*/
- scl=0;
- _nop_();
- _nop_();
- }
復(fù)制代碼
|
|