導航:首頁 > 操作系統 > 單片機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相關的資料

熱點內容
qdim命令使用 瀏覽:873
截圖R命令 瀏覽:654
基於單片機的智能台燈設計 瀏覽:685
多餘app是怎麼兌換皮膚的 瀏覽:552
sql資料庫查詢表命令 瀏覽:551
簡單音樂網站源碼 瀏覽:644
運動健康app華為手錶怎麼連接 瀏覽:748
肌肉塑造全書pdf下載 瀏覽:796
安卓簡約拼圖用什麼軟體好 瀏覽:289
fx1n加密程序 瀏覽:844
淘客阿里雲伺服器 瀏覽:476
100壓縮打造 瀏覽:422
安卓手機怎麼和蘋果平板傳文件 瀏覽:973
開始選項卡中的頁眉和頁腳命令選項 瀏覽:424
pdf的字體怎麼改 瀏覽:856
python讀寫視頻 瀏覽:88
科魯茲壓縮機軸承 瀏覽:353
word文檔轉換成pdf文件找不到 瀏覽:27
組件注冊命令 瀏覽:760
安卓大屏導航用的是什麼運放 瀏覽:443