資源簡介
at24c1024驅(qū)動函數(shù),解開屏蔽即可測試。
代碼片段和文件信息
/************************************
eeprom:at24c1024?128kBytewp接地。
XUXING?2011.7.13
************************************/
#include?
#include?“delay.h“
#define?uint8?unsigned?char
#define?uint16?unsigned?int
#define?uint32?unsigned?long?
//用單片機模擬iic
sbit?iic_sda=P1^2;
sbit?iic_scl=P1^1;?
/***********************************
iic開始傳送函數(shù),在scl是高電平且恢復
低電平之前sda由高電平變?yōu)榈碗娖?br/>************************************/
void?iic_start(void)
{?
??iic_sda=1;??
??iic_scl=1;??
??iic_sda=0;??
??iic_scl=0;?
??
}
/*******************************************
停止傳送函數(shù)
********************************************/
void?iic_stop()
{
??iic_scl=0;
??iic_sda=0;??
??iic_scl=1;
??iic_sda=1;?
}
/********************************************
發(fā)送確認(應答)信號?,即在第九個串行上升沿時
將sda置低電平
void?iic_ack()
{
?delay_n_us(10);
?iic_sda?=0;
?delay_n_us(10);
?iic_scl=1;
?delay_n_us(10);
?iic_scl=0;
?delay_n_us(10);
}
*********************************************/
/************************************************
非應答
*************************************************/
void?iic_nack()
{
??
??iic_sda=1;??
??iic_scl=1;
??iic_scl=0;
?;
}
/*******************************************
發(fā)送一個字節(jié)形參d為要發(fā)送的數(shù)據(jù)。
mcu向eeprom?寫數(shù)據(jù)的時候首先傳送數(shù)據(jù)
則調(diào)用該函數(shù)
********************************************/
bit?iic_send_byte(uint8?d)
{
?uint8?i=8;
?bit?bit_ack;
?while(i--)
???{
????
if(d&0x80)?
?????????iic_sda=1;
else?
?????iic_sda=0;??//最高有效位先發(fā)送,直至最低有效位
????
iic_scl=1;
iic_scl=0;
d<<=1;
???}
?? ???// ??test?ack
???iic_sda=1;??
???iic_scl=1;???
???bit_ack=iic_sda;
???iic_scl=0;???
???return?bit_ack; ??//?本段程序時用于檢測是否ack的狀態(tài)
}
/***********************************************
接收一個八位數(shù)據(jù)?,當單片機接收eeprom傳來的數(shù)據(jù)時,
則調(diào)用該函數(shù)
***********************************************/
uint8?iic_receive_byte(void)
{
??uint8?i=8d;
??
??iic_sda=1;
??while(i--)
???{
?????d<<=1;
?iic_scl=1;
?if(iic_sda)
?????d++;
?iic_scl=0;
???}
???return?d;
}
/***********************************************
?寫eeprom操作,輸入?yún)⒘繛閱纹瑱C內(nèi)部存儲單元,
?還有eeprom的地址,?unsigned?int?count?數(shù)據(jù)串的長度
??如果單片機存儲的數(shù)據(jù)的地址為data?,要向eeprom的0x30寫數(shù)據(jù)
??數(shù)據(jù)串長度為10?,則調(diào)用?at24c1024_write(data0x3010)
??從單片機想eeprom中連續(xù)寫n個字節(jié)數(shù)據(jù)
************************************************/
void?at24c1024_write(uint8*?mcu_addrbit?addr_p0uint16?*at24c1024_addruint8?count)
?{
???while(count--)
???{
????iic_start();
if(addr_p0==1)
{
??iic_send_byte(0xa2);
}
else
{
???iic_send_byte(0xa0);
}
iic_send_byte(*at2
評論
共有 條評論