當(dāng)前位置:首頁 > 單片機 > 單片機
[導(dǎo)讀]/************************************************** EEPROM讀寫操作 晶振:內(nèi)部 8M***************************************************/#include#include#define uchar unsigned char#define uint unsigned int

/**************************************************
EEPROM讀寫操作
晶振:內(nèi)部 8M
***************************************************/
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar syserr;
void delay_EEPROM(uchar n) //延時
{
unsigned int a,b;
for(a=0;a for(b=0;b<100;b++)
;
}
//------在此設(shè)定芯片型號------
#define e2prom 256// <---在此設(shè)定芯片型號, 1代表24C01; 16代表24C16; 512代表24C512

#if e2prom==1
#define PAGE_SIZE 8
#define SIZE 0x007f
#elif e2prom==2
#define PAGE_SIZE 8
#define SIZE 0x00ff
#elif e2prom==4
#define PAGE_SIZE 16
#define SIZE 0x01ff
#elif e2prom==8
#define PAGE_SIZE 16
#define SIZE 0x03ff
#elif e2prom==16
#define PAGE_SIZE 16
#define SIZE 0x07ff
#elif e2prom==32
#define PAGE_SIZE 32
#define SIZE 0x0fff
#elif e2prom==64
#define PAGE_SIZE 32
#define SIZE 0x1fff
#elif e2prom==128
#define PAGE_SIZE 64
#define SIZE 0x3fff
#elif e2prom==256
#define PAGE_SIZE 64
#define SIZE 0x7fff
#elif e2prom==512
#define PAGE_SIZE 128
#define SIZE 0xffff
#endif
//--------------------------

//--------在此設(shè)定芯片地址-------
#define W_ADD_COM 0xa0//寫字節(jié)命令及器件地址(根據(jù)地址實際情況改變), 1010 A2 A1 A0 0
#define R_ADD_COM 0xa1//讀命令字節(jié)及器件地址(根據(jù)地址實際情況改變), 1010 A2 A1 A0 1
//-------------------------------

#define SLAW0x18//SLA_W 已正常發(fā)送代碼,判斷器件是否正常應(yīng)答的常量.

//-----在此改變預(yù)置錯誤號-----
#define ERR_SLAW10//寫字節(jié)命令及器件地址錯, 在此也就是讀寫器件錯!!
//---------------------------

//-----------4個I2總線公用函數(shù), 可供其它I2總線器件的程序調(diào)用--------------
void i2cstart(void);//總線上起動開始條件
uchar i2cwt(uchar a);//把一個字節(jié)數(shù)據(jù)輸入器件, 返回TWI狀態(tài)
uchar i2crd(void);//i2c讀要調(diào)用的函數(shù)
void i2cstop(void);//總線上起動停止條件
//------------------------------------------------------------------------

uchar * wt24c_fc(uchar *p, uint ad, uchar n);//向24Cxx寫入數(shù)據(jù)wt24c_h()所要調(diào)用的函數(shù)

//向24Cxx寫入數(shù)據(jù)
//參數(shù): *p_rsc要輸出數(shù)據(jù)的主機內(nèi)存地址指針; ad_dst要寫入數(shù)據(jù)的i2c的地址(雙字節(jié)); num數(shù)據(jù)個數(shù)
//參數(shù)條件: ad_dst: ad_dst+(num-1)不能大于器件的最高地址; num必須>0;
void wt24c(uchar *p_rsc, uint ad_dst, uint num)
{ uint n;

n=ad_dst/PAGE_SIZE;//確定地址與塊地址的差
if(n)
n=(ulong)PAGE_SIZE*(n+1)-ad_dst;
else
n=PAGE_SIZE-ad_dst;

if(n>=num)//如果ad_dst所在的數(shù)據(jù)塊的末尾地址 >= ad_dst + num, 就直接寫入num個數(shù)據(jù)
{
wt24c_fc(p_rsc, ad_dst, num);
if(syserr!=0)
return;
}
else//如果ad_dst所在的數(shù)據(jù)塊末尾地址 < ad_dst + num, 就先寫入ad_dst所在的數(shù)據(jù)塊末尾地址與 ad_dst 之差個數(shù)據(jù)
{
p_rsc=wt24c_fc(p_rsc, ad_dst, n);
if(syserr!=0)
return;

num-=n; //更新剩下數(shù)據(jù)個數(shù)
ad_dst+=n;//更新剩下數(shù)據(jù)的起始地址

//把剩下數(shù)據(jù)寫入器件
while(num>=PAGE_SIZE)//先按PAGE_SIZE為長度一頁一頁的寫入
{p_rsc=wt24c_fc(p_rsc, ad_dst, PAGE_SIZE);
if(syserr!=0) return;

num-=PAGE_SIZE;//更新剩余數(shù)據(jù)個數(shù)
ad_dst+=PAGE_SIZE;//更新剩下數(shù)據(jù)的起始地址
}

if(num)//把最后剩下的小于一個PAGE_SIZE長度的數(shù)據(jù)寫入器件
wt24c_fc(p_rsc, ad_dst, num);
}
}


//從24cxx讀出數(shù)據(jù)
//參數(shù): *p_dst要讀入數(shù)據(jù)的主機內(nèi)存地址指針; ad_rsc要輸出數(shù)據(jù)的i2c的地址(整形); num數(shù)據(jù)個數(shù)(整形)
//參數(shù)條件: ad_dst+(num-1)不能大于器件的最高地址; num必須>0;
void port_init(void)
{

PORTC = 0xFF;
DDRC &= 0xfc;
}
//TWI initialize
// bit rate:100
void twi_init(void)
{
TWCR= 0x00; //disable twi
TWBR= 0x20; //set bit rate
TWSR= 0x00; //set prescale
TWAR= 0x00; //set slave address
TWCR= 0x04; //enable twi
}
void rd24c(uchar *p_dst, uint ad_rsc, uint num)
{
uchar t=0;
#if e2prom<32
t=ad_rsc>>8;
t<<=1;
#endif
i2cstart();//發(fā)送起始信號
if(i2cwt(W_ADD_COM+t)==SLAW)//發(fā)送SLA_W, 寫字節(jié)命令及器件地址
{
#if e2prom>=32
i2cwt(ad_rsc>>8);//ad_rsc的高位, 發(fā)送要讀出數(shù)據(jù)的地址
#endif
i2cwt(ad_rsc);//ad_rsc的低位

i2cstart();//再發(fā)送起始信號
i2cwt(R_ADD_COM+t);//發(fā)送SLA_R, 讀命令字節(jié)及器件地址

for(;num>0;num--)
{
*p_dst=i2crd();//從器件讀出一個字節(jié)
p_dst++;
}
}
else
syserr=ERR_SLAW;//寫字節(jié)命令及器件地址錯或?qū)Ψ綗o應(yīng)答

i2cstop();

}
//向24Cxx寫入數(shù)據(jù)wt24c_h()所要調(diào)用的函數(shù)
//返回寫入n個字節(jié)后的主機內(nèi)存指針

uchar * wt24c_fc(uchar *p, uint ad, uchar n)
{
uchar t=0;
#if e2prom<32
t=ad>>8;
t<<=1;
#endif
i2cstart();//發(fā)送起始信號
if(i2cwt(W_ADD_COM+t)==SLAW)//發(fā)送SLA_W, 寫字節(jié)命令及器件地址
{
#if e2prom>=32
i2cwt(ad>>8);//ad_dst的高位到器件
#endif
i2cwt(ad);//ad_dst的低位到器件

for(;n>0;n--)//發(fā)送要寫入的數(shù)據(jù)
{ i2cwt(*p);
p++;
}
}
else syserr=ERR_SLAW;//寫字節(jié)命令及器件地址錯

i2cstop();
delay_EEPROM(10);//延時6ms

return(p);
}

//-------------------------------以下為其它I2總線器件可調(diào)用的函數(shù)--------------------------

//總線上起動開始條件
void i2cstart(void)
{
TWCR= BIT(TWINT) | BIT(TWSTA) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)));
}

//把一個字節(jié)數(shù)據(jù)輸入器件, 返回TWI狀態(tài)
uchar i2cwt(uchar a)
{
TWDR = a;
TWCR = BIT(TWINT) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)));
_NOP();
return(TWSR&0b11111000);
}

//i2c讀要調(diào)用的函數(shù)
//從器件讀出一個字節(jié)
uchar i2crd(void)
{
TWCR= BIT(TWINT) | BIT(TWEA) | BIT(TWEN);
while (!(TWCR & BIT(TWINT)));
return(TWDR);

}


//總線上起動停止條件
void i2cstop(void)
{
TWCR = BIT(TWINT) | BIT(TWSTO) | BIT(TWEN);
}


本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉