0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何根據(jù)時序圖編寫高效IO模擬I2C程序

電子Online ? 來源:21ic電子網(wǎng) ? 2024-04-06 03:05 ? 次閱讀

很多人不知道怎么看著時序圖寫程序,下面結(jié)合一個非標(biāo)準(zhǔn)的I2C器件,教大家如何寫一個高效的IO模擬I2C時序。

8de2b62c-ee2d-11ee-a297-92fbcf53809c.png

觀察該時序,具備I2C的開始信號,I2C的結(jié)束信號,I2C的應(yīng)答、非應(yīng)答、響應(yīng)應(yīng)答,以及寫字節(jié)和讀字節(jié)的基本操作時序。

下面,我們一步一步分析。

1、I2C開始信號

觀察時序圖,在SCLK高電平的狀態(tài)下,在SDIO產(chǎn)生一個下降沿是為開始信號。

void I2C_Start()
{
  //設(shè)置I2C使用的兩個引腳為輸出模式
  pinMode(SCLK_PIN, OUTPUT);
  pinMode(SDIO_PIN, OUTPUT);


  //在SCL為高電平的時候讓SDA產(chǎn)生一個下降沿是為開始信號
  digitalWrite(SDIO_PIN, 1);
  digitalWrite(SCLK_PIN, 1);
  digitalWrite(SDIO_PIN, 0);
}

上述代碼即先將兩個引腳設(shè)置為輸出模式,然后在SCLK為高電平的時候在SDIO引腳輸出一個下降沿。

2、I2C停止信號

觀察時序圖,在SCLK為高電平的時候在SDIO引腳產(chǎn)生一個上升沿是為停止信號。

void I2C_Stop()
{
  pinMode(SDIO_PIN, OUTPUT);
  //在SCL為高電平的時候讓SDA產(chǎn)生一個上升沿是為停止信號
  digitalWrite(SDIO_PIN, 0);
  digitalWrite(SCLK_PIN, 1);
  digitalWrite(SDIO_PIN, 1);
}

這里采用的是Arduino編寫的IO基本操作,你可以替換成任意單片機(jī)的IO操作。

由于整個過程SCLK引腳一直是輸出狀態(tài),所以僅在開始信號中對SCLK初始化為輸出模式,而過程中可能會修改SDIO的輸入輸出模式,所以其他的函數(shù)開頭都要根據(jù)情況對SDIO引腳的模式進(jìn)行設(shè)置。

通過三行代碼實(shí)現(xiàn)在SCLK為高電平的時候在SDIO產(chǎn)生一個上升沿,實(shí)現(xiàn)停止信號。

3、寫字節(jié)操作

接下來,按照時序的順序編寫方便認(rèn)讀

I2C的讀寫字節(jié)是這么定義的:當(dāng)時鐘線為低電平的時候,允許修改數(shù)據(jù)線的電平狀態(tài),在時鐘線為高電平的時候讀取數(shù)據(jù)線的狀態(tài)。

因?yàn)槭菍懖僮?,因此我們要先將時鐘線SCLK拉低,再修改SDIO的值,然后拉高時鐘。拉高后,從機(jī)就會從總線上讀取SDIO的狀態(tài),接著一位一位的這么發(fā)送。

void I2C_Write(uint8_t dat)
{
  pinMode(SDIO_PIN, OUTPUT);
  //拉低時鐘線后可修改數(shù)據(jù)線的狀態(tài)
  digitalWrite(SCLK_PIN, 0); 
  for(int i=0;i<8;i++)
  {
    digitalWrite(SDIO_PIN, (bool)(dat&0x80)); 
    digitalWrite(SCLK_PIN, 1);//在高電平時候送出數(shù)據(jù)
    dat=dat<<1;
    digitalWrite(SCLK_PIN, 0);//拉低準(zhǔn)備下一個位的數(shù)據(jù)發(fā)送
  }
}

上述代碼正描述了這一情況:為了保證最后是低電平,這里將SCLK的第一次拉低放到循環(huán)外面,這樣可以用最少的執(zhí)行次數(shù)完成一個字節(jié)的寫任務(wù);同時,結(jié)束完一個字節(jié)寫入后時鐘線是低電平狀態(tài)(時序圖中寫入的第一個字節(jié)為DeviceID,第二個字節(jié)為寄存器地址+讀寫位)。

寫完一個字節(jié)后,從機(jī)會對寫入事件進(jìn)行應(yīng)答,這個時候主級可以從總線上讀取應(yīng)答信號。

4、讀取從機(jī)應(yīng)答引號

應(yīng)答信號在寫入完一個字節(jié)后的低電平后由從機(jī)送出,在時鐘為高電平的時候可以讀取出來,我們注意到寫入自己操作后時鐘線已經(jīng)是低電平了,因此這個時候

只要拉高時鐘線,接下來就可以讀取應(yīng)答信號,讀取完應(yīng)答信號根據(jù)時序圖應(yīng)該拉低時鐘準(zhǔn)備下一個字節(jié)的寫入。

bool I2C_RACK()
{
  bool ack;
  pinMode(SDIO_PIN, INPUT);


  digitalWrite(SCLK_PIN, 1);//接收應(yīng)答信號,當(dāng)時鐘拉高時候,從機(jī)送出應(yīng)答信號
  ack = digitalRead(SDIO_PIN);
  digitalWrite(SCLK_PIN, 0);//讀取完應(yīng)答信號后拉低時鐘。
  return ack;
}

如上代碼所示,即為接收從機(jī)應(yīng)答,拉高時鐘,讀取應(yīng)答,再拉低,返回應(yīng)答。如果從機(jī)應(yīng)答了,這里會讀取到一個低電平。

后面就是再寫入一個寄存器+讀寫位的地址,參靠上面的寫入操作。

寫入寄存器地址后,緊跟著又一個接收從機(jī)應(yīng)答信號,然后從機(jī)就會送出數(shù)據(jù),送出的數(shù)據(jù)分高字節(jié)和低字節(jié),高低字節(jié)間要有一個主機(jī)發(fā)送給從機(jī)的應(yīng)答信號,這樣從機(jī)酒知道主機(jī)收到了數(shù)據(jù),就會送出后面的低字節(jié)數(shù)據(jù)。

5、讀字節(jié)操作

注意,前面說過,讀寫都是總線在時鐘低電平時候修改數(shù)據(jù)線,在高電平送出。

因此,主機(jī)讀取從機(jī)送來的數(shù)據(jù)仍然是在高電平時候讀取。

uint8_t I2C_Read()
{
  uint8_t dat=0;
  pinMode(SDIO_PIN, INPUT);
  for(int i=0;i<8;i++)
  {
    digitalWrite(SCLK_PIN, 1);//讀取數(shù)據(jù)時候是在時鐘的高電平狀態(tài)讀取
    dat=dat<<1;
    if(digitalRead(SDIO_PIN))
    {
      dat=dat|1;
    }
    digitalWrite(SCLK_PIN, 0);//拉低時鐘線準(zhǔn)備下一個位的讀取
  }
  return dat;
}

操作過程是將SDIO數(shù)據(jù)線的IO設(shè)置為輸入模式,準(zhǔn)備讀取,然后拉高時鐘,讀取數(shù)據(jù),移位,拉低循環(huán)讀取8位數(shù)據(jù)。

注意,操作完一個字節(jié)讀取任務(wù)后,時鐘線還是低電平。

讀取完一個字節(jié)后,主機(jī)要給從機(jī)發(fā)送一個應(yīng)答信號,這樣從機(jī)會接著發(fā)低字節(jié)數(shù)據(jù)。

6、主機(jī)發(fā)送應(yīng)答信號給從機(jī)

void I2C_ACK()
{
pinMode(SDIO_PIN, OUTPUT);
digitalWrite(SDIO_PIN, 0);//給從機(jī)發(fā)送應(yīng)答信號,即拉低數(shù)據(jù)線,然后拉高時鐘讓從機(jī)讀取該應(yīng)答
digitalWrite(SCLK_PIN, 1);
digitalWrite(SCLK_PIN, 0);//執(zhí)行完應(yīng)答后拉低時鐘線,準(zhǔn)備下一步動作。
}

拉低數(shù)據(jù)線,然后在高電平的時候讓從機(jī)去讀取,之后拉低時鐘線準(zhǔn)備下一步接收動作。

當(dāng)再接收一個字節(jié)后,就讀取完成了,這個時候就是產(chǎn)生一個非應(yīng)答信號,然后發(fā)給總線結(jié)束信號,告訴從機(jī)一個讀寫周期結(jié)束了。

7、主機(jī)非應(yīng)答信號

什么是非應(yīng)答信號呢?

就是接收完了數(shù)據(jù),釋放數(shù)據(jù)線,不去拉低數(shù)據(jù)線。

void I2C_NACK()
{
  //非應(yīng)答信號:即主機(jī)不再對從機(jī)進(jìn)行應(yīng)答,主機(jī)釋放數(shù)據(jù)線,即拉高數(shù)據(jù)線,然后給時鐘一個周期信號(拉高再拉低)
  pinMode(SDIO_PIN, OUTPUT);
  digitalWrite(SDIO_PIN, 1);
  digitalWrite(SCLK_PIN, 1);
  digitalWrite(SCLK_PIN, 0);
}

將SDIO引腳設(shè)置為輸出,拉高數(shù)據(jù)線,即為釋放數(shù)據(jù)線,然后拉高拉低時鐘,即在時鐘線產(chǎn)生一個時鐘周期信號。

然后發(fā)送結(jié)束信號。結(jié)束信號在開頭已經(jīng)講明,即在時鐘線為高電平的狀態(tài)下,在數(shù)據(jù)線產(chǎn)生一個上升沿。

觀察以上代碼沒一個多余重復(fù)的操作動作,即完美的視線了時序圖上的所有操作。

接下來就是利用上述的I2C成分進(jìn)行對寄存器的讀寫操作了。

8、讀寄存器

由于圖中設(shè)備的DeviceID 為0x80,即直接寫進(jìn)來,從機(jī)判斷是讀還是寫的字節(jié)在寄存器地址。

因此,將寄存器的地址左移一位,在末尾補(bǔ)上是讀(1)還是寫(0)。

uint16_t read_reg(uint8_t reg)
{
  uint16_t dat=0;
  reg=(reg<<1)|1;
  I2C_Start();
  I2C_Write(0x80);
  I2C_RACK();
  I2C_Write(reg);
  I2C_RACK();
  dat=I2C_Read();
  dat=dat<<8;
  I2C_ACK();
  dat=dat|I2C_Read();
  I2C_NACK(); 
  I2C_Stop();
  return dat;
}

9、寫寄存器操作

void write_reg(uint8_t reg, uint16_t dat)
{
  reg=(reg<<1);
  I2C_Start();
  I2C_Write(0x80);
  I2C_RACK();
  I2C_Write(reg);
  I2C_RACK();
  I2C_Write(dat>>8);
  I2C_RACK();
  I2C_Write(dat&0xFF);
  I2C_NACK();
  I2C_Stop();
}

最后,對寄存器讀寫函數(shù)測試。

void setup() 
{
  Serial.begin(115200);
  Serial.println("Hello I2C");
  write_reg(0x02,0x2250);
  Serial.println(read_reg(0x02),HEX);
  write_reg(0x02,0x2281);
  Serial.println(read_reg(0x02),HEX);
}


void loop() 
{


}

8df3bc56-ee2d-11ee-a297-92fbcf53809c.jpg

讀取的數(shù)值與寫入的是一樣的。

最后曬出完整的測試代碼:

#define SCLK_PIN 8
#define SDIO_PIN 9




void I2C_Start()
{
  //設(shè)置I2C使用的兩個引腳為輸出模式
  pinMode(SCLK_PIN, OUTPUT);
  pinMode(SDIO_PIN, OUTPUT);


  //在SCL為高電平的時候讓SDA產(chǎn)生一個下降沿是為開始信號
  digitalWrite(SDIO_PIN, 1);
  digitalWrite(SCLK_PIN, 1);
  digitalWrite(SDIO_PIN, 0);
}


void I2C_Stop()
{
  pinMode(SDIO_PIN, OUTPUT);
  //在SCL為高電平的時候讓SDA產(chǎn)生一個上升沿是為停止信號
  digitalWrite(SDIO_PIN, 0);
  digitalWrite(SCLK_PIN, 1);
  digitalWrite(SDIO_PIN, 1);
}


void I2C_Write(uint8_t dat)
{
  pinMode(SDIO_PIN, OUTPUT);
  //拉低時鐘線后可修改數(shù)據(jù)線的狀態(tài)
  digitalWrite(SCLK_PIN, 0); 
  for(int i=0;i<8;i++)
  {
    digitalWrite(SDIO_PIN, (bool)(dat&0x80)); 
    digitalWrite(SCLK_PIN, 1);//在高電平時候送出數(shù)據(jù)
    dat=dat<<1;
    digitalWrite(SCLK_PIN, 0);//拉低準(zhǔn)備下一個位的數(shù)據(jù)發(fā)送
  }
}


uint8_t I2C_Read()
{
  uint8_t dat=0;
  pinMode(SDIO_PIN, INPUT);
  for(int i=0;i<8;i++)
  {
    digitalWrite(SCLK_PIN, 1);//讀取數(shù)據(jù)時候是在時鐘的高電平狀態(tài)讀取
    dat=dat<<1;
    if(digitalRead(SDIO_PIN))
    {
      dat=dat|1;
    }
    digitalWrite(SCLK_PIN, 0);//拉低時鐘線準(zhǔn)備下一個位的讀取
  }
  return dat;
}




bool I2C_RACK()
{
  bool ack;
  pinMode(SDIO_PIN, INPUT);


  digitalWrite(SCLK_PIN, 1);//接收應(yīng)答信號,當(dāng)時鐘拉高時候,從機(jī)送出應(yīng)答信號
  ack = digitalRead(SDIO_PIN);
  digitalWrite(SCLK_PIN, 0);//讀取完應(yīng)答信號后拉低時鐘。
  return ack;
}


void I2C_ACK()
{
  pinMode(SDIO_PIN, OUTPUT);
  digitalWrite(SDIO_PIN, 0);//給從機(jī)發(fā)送應(yīng)答信號,即拉低數(shù)據(jù)線,然后拉高時鐘讓從機(jī)讀取該應(yīng)答
  digitalWrite(SCLK_PIN, 1);
  digitalWrite(SCLK_PIN, 0);//執(zhí)行完應(yīng)答后拉低時鐘線,準(zhǔn)備下一步動作。
}


void I2C_NACK()
{
  //非應(yīng)答信號:即主機(jī)不再對從機(jī)進(jìn)行應(yīng)答,主機(jī)釋放數(shù)據(jù)線,即拉高數(shù)據(jù)線,然后給時鐘一個周期信號(拉高再拉低)
  pinMode(SDIO_PIN, OUTPUT);
  digitalWrite(SDIO_PIN, 1);
  digitalWrite(SCLK_PIN, 1);
  digitalWrite(SCLK_PIN, 0);
}


uint16_t read_reg(uint8_t reg)
{
  uint16_t dat=0;
  reg=(reg<<1)|1;
  I2C_Start();
  I2C_Write(0x80);
  I2C_RACK();
  I2C_Write(reg);
  I2C_RACK();
  dat=I2C_Read();
  dat=dat<<8;
  I2C_ACK();
  dat=dat|I2C_Read();
  I2C_NACK(); 
  I2C_Stop();
  return dat;
}


void write_reg(uint8_t reg, uint16_t dat)
{
  reg=(reg<<1);
  I2C_Start();
  I2C_Write(0x80);
  I2C_RACK();
  I2C_Write(reg);
  I2C_RACK();
  I2C_Write(dat>>8);
  I2C_RACK();
  I2C_Write(dat&0xFF);
  I2C_NACK();
  I2C_Stop();
}




void setup() 
{
  Serial.begin(115200);
  Serial.println("Hello I2C");
  write_reg(0x02,0x2250);
  Serial.println(read_reg(0x02),HEX);
  write_reg(0x02,0x2281);
  Serial.println(read_reg(0x02),HEX);
}


void loop() 
{


}

看完這篇文章,你學(xué)會純手工擼IO模擬I2C時序的代碼了嗎?

審核編輯:黃飛

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 總線
    +關(guān)注

    關(guān)注

    10

    文章

    2859

    瀏覽量

    87914
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4284

    瀏覽量

    62325
  • 高電平
    +關(guān)注

    關(guān)注

    6

    文章

    144

    瀏覽量

    21305
  • I2C驅(qū)動
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    7029
  • 時鐘線
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    3607

原文標(biāo)題:看時序圖寫I2C驅(qū)動,教你如何自己手?jǐn)]非標(biāo)I2C驅(qū)動函數(shù)

文章出處:【微信號:電子Online,微信公眾號:電子Online】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    利用IO模擬I2C時序進(jìn)而實(shí)現(xiàn)I2C通訊的步驟

    模擬I2C時序進(jìn)而實(shí)現(xiàn)I2C通訊的。給很多想學(xué)習(xí)硬件I2C通訊的小伙伴帶來了困難。下面先介紹一下配置步驟1.E
    發(fā)表于 01-24 08:22

    I2C總線驅(qū)動程序

    1 /**————————————————————2 〖說明〗I2C總線驅(qū)動程序(用兩個普通IO模擬I2
    發(fā)表于 08-13 17:04 ?64次下載

    I2C總線驅(qū)動程序的實(shí)現(xiàn)

    I2C總線驅(qū)動程序的實(shí)現(xiàn) I2C 驅(qū)動程序的簡介本驅(qū)動程序為標(biāo)準(zhǔn)的51 系列CPU 編寫,讓C
    發(fā)表于 09-26 17:25 ?5700次閱讀
    <b class='flag-5'>I2C</b>總線驅(qū)動<b class='flag-5'>程序</b>的實(shí)現(xiàn)

    基于GAL的I2C總線時序模擬

    本文給出了用可編程邏輯器件GAL配合ISA總線模擬I2C總線時序來對FI1256 MK2進(jìn)行控制的方法。該方法與PCI總線進(jìn)行模擬的方法相類
    發(fā)表于 03-27 11:33 ?2860次閱讀
    基于GAL的<b class='flag-5'>I2C</b>總線<b class='flag-5'>時序模擬</b>

    I2C總線的結(jié)構(gòu)、工作時序模擬編程

    I2C總線的結(jié)構(gòu)、工作時序模擬編程
    發(fā)表于 10-24 14:34 ?13次下載
    <b class='flag-5'>I2C</b>總線的結(jié)構(gòu)、工作<b class='flag-5'>時序</b>和<b class='flag-5'>模擬</b>編程

    軟件模擬i2c實(shí)現(xiàn)io時序電路的技巧

    關(guān)于 Bit Bang 的解釋:Use software to control serial communication at general-purpose I/O pins,簡單來講就是使用軟件通過 IO 腳去實(shí)現(xiàn) I2C
    的頭像 發(fā)表于 11-06 09:32 ?1.5w次閱讀
    軟件<b class='flag-5'>模擬</b><b class='flag-5'>i2c</b>實(shí)現(xiàn)<b class='flag-5'>io</b>腳<b class='flag-5'>時序</b>電路的技巧

    深度解析IO模擬時序(SPI)的注意事項

    有硬件I2C、SPI時盡量用硬件操作,省去IO模擬繁瑣的時序調(diào)試。但在內(nèi)部資源不夠時就要用IO模擬
    的頭像 發(fā)表于 01-17 09:37 ?1.6w次閱讀
    深度解析<b class='flag-5'>IO</b><b class='flag-5'>模擬</b><b class='flag-5'>時序</b>(SPI)的注意事項

    80C51單片機(jī)模擬I2C總線的主機(jī)程序分享

    I2C總線協(xié)議程序 在使用的過程中一定要注意時序、時間的問題。 i2c.c /* I2C.c 標(biāo)準(zhǔn)80
    發(fā)表于 12-05 15:39 ?3365次閱讀
    80<b class='flag-5'>C</b>51單片機(jī)<b class='flag-5'>模擬</b><b class='flag-5'>I2C</b>總線的主機(jī)<b class='flag-5'>程序</b>分享

    使用51單片機(jī)IO模擬I2C程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用51單片機(jī)IO模擬I2C程序免費(fèi)下載。
    發(fā)表于 08-02 17:34 ?5次下載
    使用51單片機(jī)<b class='flag-5'>IO</b><b class='flag-5'>模擬</b><b class='flag-5'>I2C</b>的<b class='flag-5'>程序</b>免費(fèi)下載

    DSP配置I2C通訊(非IO口軟件模擬時序

    TMS320F28377D為例,使用ti公司dsp開發(fā)工具ccs10.1配置i2c模塊。寫這篇文章的緣由,因?yàn)槭忻嫔虾芏郉SP其實(shí)內(nèi)部是具有硬件I2C接口的,但由于網(wǎng)絡(luò)上大部分資料和例程都是利用IO
    發(fā)表于 11-29 14:06 ?16次下載
    DSP配置<b class='flag-5'>I2C</b>通訊(非<b class='flag-5'>IO</b>口軟件<b class='flag-5'>模擬</b><b class='flag-5'>時序</b>)

    嵌入式內(nèi)核及驅(qū)動開發(fā)-09IIC子系統(tǒng)框架使用(I2C協(xié)議和時序,I2C驅(qū)動框架,I2C從設(shè)備驅(qū)動開發(fā),MPU6050硬件連接

    從設(shè)備adapter i2c 控制器對象數(shù)據(jù)包對象讀寫數(shù)據(jù)設(shè)備樹中添加MPU6050信息內(nèi)核選配添加設(shè)備樹節(jié)點(diǎn)編寫驅(qū)動程序 mpu6050_i2c_drv.cI2c協(xié)議和
    發(fā)表于 12-06 14:06 ?17次下載
    嵌入式內(nèi)核及驅(qū)動開發(fā)-09IIC子系統(tǒng)框架使用(<b class='flag-5'>I2C</b>協(xié)議和<b class='flag-5'>時序</b>,<b class='flag-5'>I2C</b>驅(qū)動框架,<b class='flag-5'>I2C</b>從設(shè)備驅(qū)動開發(fā),MPU6050硬件連接

    硬件I2C模擬I2C

    硬件I2C對應(yīng)芯片上的I2C外設(shè),有相應(yīng)I2C驅(qū)動電路,其所使用的I2C管腳也是專用的,因而效率要遠(yuǎn)高于軟件模擬
    發(fā)表于 12-28 19:14 ?81次下載
    硬件<b class='flag-5'>I2C</b>與<b class='flag-5'>模擬</b><b class='flag-5'>I2C</b>

    經(jīng)過驗(yàn)證的GPIO模擬I2C時序代碼

    使用STM32的GPIO模擬I2C總線時序,GPIO設(shè)置為開漏模式,SDA和SCK外部必須使用上拉電阻,一般是4.7K。開漏模式的好處是,可以同時讀取輸入電平,而無需切換輸入/輸出模式。注意事項:在
    發(fā)表于 12-28 19:36 ?13次下載
    經(jīng)過驗(yàn)證的GPIO<b class='flag-5'>模擬</b><b class='flag-5'>I2C</b><b class='flag-5'>時序</b>代碼

    ESP 12E I2c基卡的I2C IO卡設(shè)計

    電子發(fā)燒友網(wǎng)站提供《ESP 12E I2c基卡的I2C IO卡設(shè)計.zip》資料免費(fèi)下載
    發(fā)表于 08-15 09:27 ?3次下載
    ESP 12E <b class='flag-5'>I2c</b>基卡的<b class='flag-5'>I2C</b> <b class='flag-5'>IO</b>卡設(shè)計

    STC單片機(jī)IO模擬I2C(主從)文件資料

    STC單片機(jī)IO模擬I2C(主從)文件資料免費(fèi)下載。
    發(fā)表于 08-29 10:13 ?12次下載