?? at24c01.c
字號:
/************************************************
文件:AT24C01.c
用途:AT24C01操作函數
注意:
創建:2008.1.26
修改:2008.1.26
Copy Right (c) www.avrvi.com AVR與虛擬儀器
************************************************/
#include "..\config.h"
unsigned char syserr;
/*************************************************************************
** 函數名稱: unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
** 功能描述: 向24Cxx寫入數據wt24c_h()所要調用的函數
** 輸 入:
** 輸出 : 返回寫入n個字節后的主機內存指針
** 全局變量: 無
** 調用模塊:
** 說明:
** 注意:
**************************************************************************/
unsigned char * wt24c_fc(unsigned char *p, unsigned int ad, unsigned char n)
{
unsigned char t=0;
#if e2prom<32
t=ad>>8;
t<<=1;
#endif
i2cstart(); //發送起始信號
if(i2cwt(W_ADD_COM+t)==SLAW)//發送SLA_W, 寫字節命令及器件地址
{
#if e2prom>16
i2cwt(ad>>8); //ad_dst的高位到器件
#endif
i2cwt(ad); //ad_dst的低位到器件
for(;n>0;n--) //發送要寫入的數據
{
i2cwt(*p);
p++;
}
}
else syserr=ERR_SLAW; //寫字節命令及器件地址錯
i2cstop();
delay_nms(6); //延時6ms
return(p);
}
/*************************************************************************
** 函數名稱:
** 功能描述: 向24Cxx寫入數據
** 輸 入: *p_rsc要輸出數據的主機內存地址指針; ad_dst要寫入數據的i2c的地址(雙字節); num數據個數
** 輸出 :
** 全局變量: 無
** 調用模塊:
** 說明:ad_dst: ad_dst+(num-1)不能大于器件的最高地址; num必須>0;
** 注意:
**************************************************************************/
void wt24c(unsigned char *p_rsc, unsigned int ad_dst, unsigned int num)
{
unsigned int n;
n=ad_dst/PAGE_SIZE; //確定地址與塊地址的差
if(n) n=(unsigned long)PAGE_SIZE*(n+1)-ad_dst;
else n=PAGE_SIZE-ad_dst;
if(n>=num) //如果ad_dst所在的數據塊的末尾地址 >= ad_dst + num, 就直接寫入num個數據
{
wt24c_fc(p_rsc, ad_dst, num);
if(syserr!=0) return;
}
else //如果ad_dst所在的數據塊末尾地址 < ad_dst + num, 就先寫入ad_dst所在的數據塊末尾地址與 ad_dst 之差個數據
{
p_rsc=wt24c_fc(p_rsc, ad_dst, n);
if(syserr!=0) return;
num-=n; //更新剩下數據個數
ad_dst+=n; //更新剩下數據的起始地址
//把剩下數據寫入器件
while(num>=PAGE_SIZE) //先按PAGE_SIZE為長度一頁一頁的寫入
{
p_rsc=wt24c_fc(p_rsc, ad_dst, PAGE_SIZE);
if(syserr!=0) return;
num-=PAGE_SIZE; //更新剩余數據個數
ad_dst+=PAGE_SIZE; //更新剩下數據的起始地址
}
if(num) //把最后剩下的小于一個PAGE_SIZE長度的數據寫入器件
wt24c_fc(p_rsc, ad_dst, num);
}
}
/*************************************************************************
** 函數名稱:
** 功能描述: 從24cxx讀出數據
** 輸 入: *p_dst要讀入數據的主機內存地址指針; ad_rsc要輸出數據的i2c的地址(整形); num數據個數(整形)
** 輸出 :
** 全局變量: 無
** 調用模塊:
** 說明:ad_dst+(num-1)不能大于器件的最高地址; num必須>0;
** 注意:
**************************************************************************/
void rd24c(unsigned char *p_dst, unsigned int ad_rsc, unsigned int num)
{
unsigned char t=0;
#if e2prom<32
t=ad_rsc>>8;
t<<=1;
#endif
i2cstart(); //發送起始信號
if(i2cwt(W_ADD_COM+t)==SLAW)//發送SLA_W, 寫字節命令及器件地址
{
#if e2prom>16
i2cwt(ad_rsc>>8); //ad_rsc的高位, 發送要讀出數據的地址
#endif
i2cwt(ad_rsc); //ad_rsc的低位
i2cstart(); //再發送起始信號
i2cwt(R_ADD_COM+t); //發送SLA_R, 讀命令字節及器件地址
for(;num>0;num--)
{
*p_dst=i2crd(); //從器件讀出一個字節
p_dst++;
}
}
else syserr=ERR_SLAW; //寫字節命令及器件地址錯或對方無應答
i2cstop();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -