I2C匯流排的連續讀和連續寫

2022-09-03 16:42:14 字數 2555 閱讀 4909

想寫個在給位址後能一直讀或寫的程式,因為郭天祥的教程裡只有單個位元組讀寫示例。可在網上找了好久沒找到合適的示例,只好自己看著手冊,慢慢摸索。皇天不負苦心人呀,終於出來了。

寫完程式的同時也學會了怎樣看手冊的時序圖。

還有此**只實現了同時寫讀兩個位元組,至於在未達到晶元頁面通訊量的最大值的範圍內都可以用for迴圈實現。下面就是**: 

#include

#include

#define uchar unsigned char

sbit sda = p2^0;

sbit scl = p2^1;

delay()

init()

//    sda = 1;

//    delay();

//    scl = 1;

//    delay();

start()

sda = 1;

//    delay();

scl = 1;

delay();

sda = 0;

delay();

stop()

sda = 0;

//    delay();

scl = 1;

delay();

sda = 1;

delay();

respons_i2c()

uchar i;

scl = 1;

delay();

while((sda == 1) && (i < 250)) i++;

scl = 0;

delay();

void write_byte_i2c(uchar date)

uchar i;

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

date = date<<1;

scl = 0;

delay();

sda = cy;

delay();

scl = 1;

delay();

scl = 0;

delay();

sda = 1;   //釋放匯流排以收應答訊號

delay();

void write_i2c(uchar maddr,uchar addr,uchar length,uchar date)

uchar i;

start();

write_byte_i2c(maddr);

respons_i2c();

write_byte_i2c(addr);

respons_i2c();

for(i = 0; iwrite_byte_i2c(date[i]);

respons_i2c();

stop();

void delay1(uchar x)

uchar a,b;

for(a=x;a>0;a--)

for(b=200;b>0;b--);

uchar read_byte_i2c()

uchar i,date;

scl = 0;

delay();

sda = 1;    //釋放匯流排

delay();

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

scl = 1;

delay();

date = (date<<1)|sda;

scl = 0;

delay();

return date;

uchar *read_i2c(uchar maddr,uchar addr,uchar length)

uchar i =0;

uchar date[2];

start();

write_byte_i2c(maddr&0xfe);

respons_i2c();

write_byte_i2c(addr);

respons_i2c();

start();

write_byte_i2c(maddr);

respons_i2c();

date[0] = read_byte_i2c();

//    for(i = 1; iscl = 0;

delay();

sda = 0;

delay();

scl = 1;

delay();

date[1] = read_byte_i2c();

stop();

return date;

main()

uchar code a=;

uchar b[2];

init();

write_i2c(0xa0,0x0a,2,a);

delay1(100);

strcpy(b, read_i2c(0xa1,0x0a,1));

while(1) 

p1 = 0xff;

p1 = b[1];

delay1(255);

p1 = 0xff;

p1 = b[0];      

delay1(255);

【注釋】此**在tx-1c中通過

i2c連續讀寫間隔 I2C匯流排協議分析

i2c匯流排是由philips公司開發的一種簡單 雙向二線制同步序列匯流排。它只需要兩根線即可在連線於匯流排上的裝置之間通訊。i2c的兩根線sda 序列資料線 和scl 序列時鐘線 都是雙向i o線,介面電路為開漏輸出,需通過上拉電阻接電源vcc,當匯流排空閒時,兩根線都是高電平。常見的硬體結構圖 ...

SCCB 匯流排和I2C匯流排區別

sccb seriai camera controlbus 是簡化的i2c協議,sio l是序列時鐘輸入線,sio o是序列雙向資料線,分別相當於i2c協議的scl和sda。sccb的匯流排時序與i2c基本相同,它的響應訊號ack被稱為乙個傳輸單元的第9位,分為don t care和na。don t...

i2c匯流排時序

一心想踏入linux device driver的世界,想著i2c匯流排相對於usb等其他匯流排較為簡單,就以i2c作為切入點,希望可以逐步理解ldd的設計思想,並能理解其裝置模型的概念。在此對近期於i2c匯流排及驅動原始碼的理解做備忘,以免徒勞。平台友善之臂s70 tiny6410 cpusams...