|
1、I2c啟動(dòng)
1.png (27.46 KB, 下載次數(shù): 128)
下載附件
2018-3-24 19:15 上傳
由上圖可知SDA在SCL為高電平時(shí)由高變?yōu)榈捅硎締?dòng)I2c,注意時(shí)間。
2、I2c關(guān)閉
2.png (26.85 KB, 下載次數(shù): 109)
下載附件
2018-3-24 19:15 上傳
由上圖可知SDA在SCL為高電平時(shí)由低變?yōu)楦弑硎締?dòng)I2c,注意時(shí)間。
3、數(shù)據(jù)0
3.png (21.36 KB, 下載次數(shù): 109)
下載附件
2018-3-24 19:15 上傳
由上圖可知SDA在SCL為高電平時(shí)拉低表示0,注意時(shí)間。
4、數(shù)據(jù)1
4.png (22.48 KB, 下載次數(shù): 112)
下載附件
2018-3-24 19:15 上傳
由上圖可知SDA在SCL為高電平時(shí)拉高表示0,注意時(shí)間。
5、I2c寫(xiě)數(shù)據(jù)(數(shù)據(jù)由51到設(shè)備)
5.jpg (19.28 KB, 下載次數(shù): 112)
下載附件
2018-3-24 19:15 上傳
由上圖可以看書(shū)寫(xiě)數(shù)據(jù)的步驟為:1)啟動(dòng)I2c;
2)寫(xiě)入設(shè)備地址(七位設(shè)備地址加一位讀寫(xiě)命令,最后1為讀,0為寫(xiě));
3)等待應(yīng)答(由設(shè)備發(fā)出,讀數(shù)據(jù)時(shí)由51給應(yīng)答),這一步可以和第二部寫(xiě)在一個(gè)函數(shù)中;
4)寫(xiě)入數(shù)據(jù)要存放的地址;
5)等待應(yīng)答;
6)寫(xiě)入數(shù)據(jù);
7)等待應(yīng)答;
8)關(guān)閉I2c。
若將等待應(yīng)答與寫(xiě)數(shù)據(jù)放在一個(gè)函數(shù)中可簡(jiǎn)化為:1)啟動(dòng)I2c;
2)寫(xiě)入設(shè)備地址
3)寫(xiě)入數(shù)據(jù)要存放的地址;
4)寫(xiě)入數(shù)據(jù);
5)關(guān)閉I2c。
6、I2c讀數(shù)據(jù)(51從設(shè)備中讀取數(shù)據(jù))
6.jpg (29.8 KB, 下載次數(shù): 123)
下載附件
2018-3-24 19:15 上傳
由上圖可以看書(shū)寫(xiě)數(shù)據(jù)的步驟為:1)啟動(dòng)I2c;
2)寫(xiě)入設(shè)備地址;
3)寫(xiě)入要讀取數(shù)據(jù)存放的地址;
4)啟動(dòng)I2c;
5)寫(xiě)入設(shè)備地址(第八位為1,表示讀數(shù)據(jù));
6)讀數(shù)據(jù);
7)給設(shè)備發(fā)送應(yīng)答信號(hào);
8)關(guān)閉I2c;
7、對(duì)應(yīng)的51程序
- #include <STC12C5A60S2.H>
- #define uchar unsigned char
- #define uint unsigned int
-
- sbit SCL=P2^1;
- sbit SDA=P2^0;
- uchar code duan[]=
- {
- 0xfc,0x60,0xda,
- 0xf2,0x66,0xb6,
- 0xbe,0xe0,0xfe,0xf6
- };
- void delay(uint time)
- {
- uint i,j;
- for(i=0;i<time;i++)
- for(j=0;j<10;j++);
- }
- void I2c_start()
- {
- SDA=1;
- delay(1);
- SCL=1;
- delay(1);
- SDA=0;
- delay(1);
- SCL=0;
- delay(1);
- }
- void I2c_stop()
- {
- SDA=0;
- delay(1);
- SCL=1;
- delay(1);
- SDA=1;
- delay(1);
- }
- //·¢Ëíack
- void I2c_sendAck(bit ack)
- {
- SDA = ack;
- SCL = 1;
- delay(1);
- SCL = 0;
- delay(1);
-
- }
- //»ñè¡ack
- bit I2c_getAck(void)
- {
- bit ack;
- SDA = 1;
- SCL = 1;
- delay(1);
- ack = SDA;
- SCL = 0;
- return ack;
- }
- uchar I2c_read()
- {
- uchar i,dat=0;
- SDA=1;
- delay(1);
- for(i=0;i<8;i++)
- {
- SCL=1;
- delay(1);
- dat<<=1;
- dat|=SDA;
- delay(1);
- SCL=0;
- }
- return dat;
- }
- void I2c_write(uchar dat)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- SDA=dat>>7;
- dat<<=1;
- delay(1);
- SCL=1;
- delay(1);
- SCL=0;
- delay(1);
- }
- I2c_getAck();
- }
- void I2c_toDevice(uchar deviceAdd,uchar datAdd,uchar dat)
- {
- I2c_start();
- I2c_write(deviceAdd);
- I2c_write(datAdd);
- I2c_write(dat);
- I2c_stop();
- }
- uchar I2c_fromDevice(uchar deviceAdd,uchar datAdd )
- {
- uchar dat;
- I2c_start();
- I2c_write(deviceAdd);
- I2c_write(datAdd);
- I2c_start();
- I2c_write(deviceAdd+1);
- dat=I2c_read();
- I2c_sendAck(1);
- I2c_stop();
- return dat;
- }
- void main()
- {
- uchar num;
- I2c_toDevice(0xa0,3,7);
- delay(130);
- num=I2c_fromDevice(0xa0,3);
- while(1)
- {
- P0=0x00;
- P1=duan[num];
- delay(10);
- P1=0x00;
- }
- }
復(fù)制代碼
8、注意事項(xiàng)
1)關(guān)閉I2c和啟動(dòng)I2c之間要有1ms間隔,給IO口準(zhǔn)備時(shí)間,否則亂碼。
2)關(guān)于應(yīng)答,當(dāng)寫(xiě)數(shù)據(jù)時(shí)由設(shè)備應(yīng)答,讀數(shù)據(jù)時(shí)MCU應(yīng)答。
3)讀數(shù)據(jù)時(shí)啟動(dòng)兩次I2c。
|
|