㈠ 單片機的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個晶元