導航:首頁 > 操作系統 > 單片機i2c

單片機i2c

發布時間:2022-01-28 15:53:32

單片機的I2C問題

兄弟,我一直用c來編程,很少用,匯編,給你一下建議吧。24c02,我印象中,頁寫是八個位元組,寫時先把單片機制為主機,再發start,再就是slave,即24c02的地址和寫讀信號,再就是數據要寫的地址,最後是數據,這里的ack信號很重要啊,
我用的16,自帶i2c介面,=================================================================
//=======ATmega16
//========7.3728MHZ
//==========24c02讀寫,顯示
//================================================================
#include <iom16v.h>
#include <macros.h>
#include "delay.h"
#include "lcd.h"

#define uchar unsigned char
#define uint unsigned int

/**************************************************************************
* 函數名稱: ERROR();
* 功 能: 蜂鳴器報錯
* 參 數:無
* 描 述:PA0口置低可以鳴響蜂鳴器
**************************************************************************/
void ERROR()
{
uint i;
DDRA |= (1 << PA0);
PORTA &= ~(1 << PA0);
for( i = 0 ; i < 10000 ; i ++);
PORTA |= (1 << PA0);
}
//********************************************************************8
//*函數 向24c02發送一個位元組
//*名稱 wtwib();
//*參數 地址,數據
//*********************************************************************/
void wtwib(uchar ad,uchar da)
{ TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//發送start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWDR =da; //send the data to the bus
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
delayms(4);
}
//=================================================================
//=======read a byte from 24c02
//========rtwib()
//==========need address
//================================================================
uchar rtwib(uchar ad)
{ uchar da;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x10)
ERROR();
TWDR = 0xA1; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x40)
ERROR();
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x58)
ERROR();
da = TWDR;
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
delayms(4);
return da;
}
//========================================================
//====== send a page to the 24c02
//====== wtwis();
//=======need address and data and number;
//=========================================================
void wtwip(uchar ad,uchar n,uchar *da)
{ uchar i;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//發送start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
for(i=0;i<n;i++)
{ TWDR =da[i]; //send the data to the bus
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
delayms(4);

}
//====================================================
//========read a string from the 24C02
//========rtwis();
//========need address,number
//=====================================================
void rtwis(uchar ad,uchar *p,uchar n)
{ uchar i;
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x08)
ERROR();
TWDR =0xA0; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
TWDR =ad; //adress of the data
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x28)
ERROR();
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//send the signal of start
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x10)
ERROR();
TWDR =0xA1; //adress of e2prom
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x18)
ERROR();
for(i=0;i<n;i++)
{ TWCR = (1<<TWINT) | (1<<TWEN)|(1<<TWEA);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != 0x50)
ERROR();
p[i]=TWDR;
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//send the stop signal
delayms(4);
}
void main()
{ uchar a[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},i=0;
init_lcd();
TWBR = 0x1F;
TWSR = 0x02;
for(i=0;i<16;i++)
wtwib( i,a[i]); //單位元組寫
for(i=0;i<16;i++)
a[i]=0;
//rtwis(0x00,a,16);//連續讀

for(i=0;i<16;i++) //單位元組讀
a[i]=rtwib( i);

for(i=0;i<16;i++)
send_d(a[i]+48);

㈡ 51單片機I2C匯流排讀寫程序這一步是什麼意思啊

cy是進位標志,這些設置都是根據i2c匯流排的協議來寫的,可以查查它的時序圖理解下。

㈢ 哪些單片機具備I2C匯流排介面

IIC一般用模擬的較多,就是用普通IO口來模擬IIC時序,網上可以很容易找到相應的代碼。但是有很多單片機還是有IIC硬體模塊的,比如AVR系列的單片機是自帶基於狀態機的IIC模塊。stm32也有IIC硬體模塊。TI的msp430系列單片機也具有IIC模塊。有IIC的的單片機有很多。你要選型的話建議你根據單片機的處理能力來選擇,然後找到技術文檔來查看是否有IIC介面。

㈣ 單片機如何一個I2C匯流排連接2個I2C器件

從地址一般是固化的(有些晶元可以通過硬體設定,但不可隨意更改為你說的0或者11) 相同的從地址器件在同一I2C裡面只能掛一個

㈤ 單片機i2c匯流排編程,

return 一旦執行,就退出函數了。

也就是說 如果flag==0 那麼就return0 後面的就不執行了,退出函數

㈥ 單片機中的SPI,I2C,單匯流排,匯流排什麼意思,什麼用,什麼區別,

嘿嘿 你提出的問題很多呀 我來幫你解答吧
1 先來回答你什麼是匯流排:
匯流排就是一個公共的計算機的連接線 所有外圍設備 都可以通過它與計算機相連接 是信息傳遞的通道 在它上面可以掛很多個外設元件。
2 匯流排的種類很多:
如晶元級的匯流排 如 SPI,I2C,單匯流排 近距離進行CPU與其它外圍晶元的連接
他們多是採用串列方式傳送 數據的 即一位一位傳送數據 可以節省傳送線的條數
SPI 需要3條線: 一條時鍾線 一條數據接收線 一條數據發送線
I2C 需要2跳線 一條時鍾線 一條 數據線
單匯流排 即是用一條數據線來通訊 如DS18B20數字溫度感測器
還有RS-232 用於計算機和計算機或單片機進行數據通訊的
還有RS-485 、CAN等工業現場匯流排 用於遠距離通訊 距離可達1000米。
3 匯流排的概念、種類、區別 都給你介紹了 呵呵 滿意 就給加分啊

㈦ i2c單片機里什麼意思

i2c是一種同步串列數字信號匯流排介面,用於實現多個器件或設備之間的通信。它包含有一根時鍾線和數據線,最高通信速度可達400Kb/s.一些高檔單片機帶有該介面,但普通單片機可以用通用IO口模擬 i2c時序。

㈧ 最近剛學單片機一直搞不明白請單片機的I2C匯流排是什麼怎麼實現,需要單獨的晶元來實現嗎

它是一條匯流排,包括兩條導線:一條數據線SDA,一條時鍾線SCL。
單片機通過這條匯流排,和外接的各個晶元進行通信。

想傳送一位元組數據,就必須在數據線SDA上一位一位的傳輸;
每傳送一位,在時鍾線SCL上要輸出一個脈沖。

另外還有「起始」、「終止」和「應答」位,這些看時序圖即可理解。

匯流排上,可以掛接多個器件,這就有了「從地址」的問題;
在某個器件內部,可能有多個存儲單元,這就有了「字地址」的問題。
I2C匯流排,確實是很羅嗦的。

㈨ 單片機的I2C問題

你要問什麼

㈩ 在一個單片機上怎樣實現連接兩個i2c

不用分開。i2c是有器件地址的。8位地址,出去全0和全1的識別還可以掛載126個晶元

閱讀全文

與單片機i2c相關的資料

熱點內容
伺服器程序怎麼刪除 瀏覽:655
阿里年薪70萬程序員名單照片 瀏覽:573
android定製輸入法 瀏覽:758
linux下編譯android 瀏覽:311
電影重建文件夾 瀏覽:981
第五人格香香解壓 瀏覽:626
我的世界手機版推薦什麼伺服器 瀏覽:706
安卓怎麼下載空戰 瀏覽:586
程序員賣房入市 瀏覽:117
android視頻播放窗口 瀏覽:288
17元特效的app名字叫什麼 瀏覽:838
小米手機什麼時候配置安卓 瀏覽:262
三種命令方塊 瀏覽:565
hp伺服器怎麼重新做系統 瀏覽:480
電腦與單片機無線 瀏覽:611
雲伺服器錢怎麼提現 瀏覽:878
華為運動app怎麼退出登錄 瀏覽:796
程序員那麼可愛陸漓金句 瀏覽:879
java如何將自己電腦設置成伺服器 瀏覽:859
域名怎麼制定伺服器8080埠 瀏覽:667