日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

51單片機(jī)I2C總線驅(qū)動(dòng)程序

單片機(jī)
2019-08-04 18:01
收藏

SI2I2C總線是PHLIPS公司推出的一種串行總線,是具備多主機(jī)系統(tǒng)所需的包括總線裁決和高低速器件同步功能的高性能串行總線。

I2C總線只有兩根雙向信號(hào)線。一根是數(shù)據(jù)線SDA,另一根是時(shí)鐘線SCL。

一.I2C系統(tǒng)結(jié)構(gòu)

 

每個(gè)接到I2C總線上的器件都有唯一的地址。主機(jī)與其它器件間的數(shù)據(jù)傳送可以是由主機(jī)發(fā)送數(shù)據(jù)到其它器件,這時(shí)主機(jī)即為發(fā)送器。由總線上接收數(shù)據(jù)的器件則為接收器。

二.數(shù)據(jù)位的有效性規(guī)定

 

I2C總線進(jìn)行數(shù)據(jù)傳送時(shí),時(shí)鐘信號(hào)為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時(shí)鐘線上的信號(hào)為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。

三.字節(jié)傳送與應(yīng)答

 

每一個(gè)字節(jié)必須保證是8位長(zhǎng)度。數(shù)據(jù)傳送時(shí),先傳送最高位(MSB),每一個(gè)被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位(即一幀共有9位)。

四.驅(qū)動(dòng)程序

#define uchar unsigned char

#define uint unsigned int

#define somenop() _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_()

sbit SCL=P2^1;

sbit SDA=P2^0;

1

2

3

4

5

1.起始信號(hào)和終止信號(hào)

 

SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號(hào);

SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號(hào)。

起始和終止信號(hào)都是由主機(jī)發(fā)出的,在起始信號(hào)產(chǎn)生后,總線就處于被占用的狀態(tài);在終止信號(hào)產(chǎn)生后,總線就處于空閑狀態(tài)

void I2C_Start() //起始

{

SCL=1;

somenop();

SDA=1;

somenop();

SDA=0;

somenop();

SCL=0;

somenop();

}

void I2C_Stop() //終止

{

SDA=0;

somenop();

SCL=1;

somenop();

SDA=1;

somenop();

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

2.發(fā)送數(shù)據(jù)

void I2C_SendByte(uchar dat, uchar ack) //發(fā)送一個(gè)字節(jié)

{

uchar i,j,b=0;

for(i=0;i<8;i++)

{

SCL=0;

somenop();

SDA=(bit)(dat&0x80); //每次取最高位進(jìn)行發(fā)送

dat<<=1; //從最高位開(kāi)始發(fā)送,左移使每一位逐漸成為最高位

SCL=1; //上升沿時(shí)發(fā)送數(shù)據(jù)

somenop();

}

SCL=0;

somenop();

SDA=1;

somenop();

SCL=1;

_nop_();

while((SDA==1)&&(j<250)) j++; //等待應(yīng)答,也就是等待從設(shè)備把SDA拉低

SCL=0;

_nop_();

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

3.讀取數(shù)據(jù)

uchar I2C_ReadByte() //讀一個(gè)字節(jié)

{

uchar i,dat=0;

SCL=0; //此處也可以不置低,因?yàn)槠鹗己桶l(fā)送一個(gè)字節(jié)之后SCL都是0

somenop();

SDA=1; //拉高準(zhǔn)備數(shù)據(jù)讀取

_nop_();

for(i=0;i<8;i++) //讀取8位數(shù)據(jù)

{

SCL=1;

somenop();

dat<<=1;

if(SDA==1)

dat=dat|0x01;

somenop();

SCL=0; //下降沿時(shí)讀取數(shù)據(jù)

somenop();

}

return dat;

}

相關(guān)推薦