久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標(biāo)題:
硬件和軟件兼容i2c協(xié)議的24Cxx系列EEPROM存儲器
[打印本頁]
作者:
51黑電子迷
時間:
2017-1-14 23:45
標(biāo)題:
硬件和軟件兼容i2c協(xié)議的24Cxx系列EEPROM存儲器
硬件上由于24c01的A0A1A2管腳不允許懸空,故暫時的想法是兼容24c02 ---24c16
使用一個dip8封裝的芯片插座,A0 A1 A2管腳都懸空即可,換芯片方便
軟件上24c02地址只有8位,而其他型號是大于8位的,故地址參數(shù)使用16位
256個字節(jié)作為一個大頁,即largePage,測試芯片24c04空間有512字節(jié)
上代碼,求測試和討論
#include "MY51.H"
//轉(zhuǎn)載請注明: 求測試討論
//stc89c52rc,11.0592MHz晶振
sbit sda=P2^0; //總線連接口定義
sbit scl=P2^1; //總線連接口定義
void delayus() //需要4個機(jī)器周期,大概4.34us
{
; //晶振頻率11.0592M,機(jī)器周期為1.085微秒
}
void iic_start() //啟動信號
{
sda=1;
scl=1;
delayus(); //sda和scl同為高電平保持4.7us以上
_nop_(); //1.085us,共5.78us
sda=0; //下降沿
delayus(); //sda低電平保持4us以上 ,這里是4.34us滿足要求
}
void iic_stop() //停止信號
{
sda=0;_nop_(); //準(zhǔn)備狀態(tài)
scl=1;
delayus(); //該狀態(tài)穩(wěn)定時間要求保持4us以上
sda=1; //scl高電平期間,sda來一個上升沿
delayus(); //sda保持4.7us以上,4.34加上函數(shù)返回時間大于4.7us
//注:此時scl和sda都為1
}
void iic_sendByte(u8 byteData) //mcu發(fā)送一個字節(jié)
{
u8 i;
u8 temp=byteData;
for(i=0;i<8;i++)
{
temp=temp<<1; //移動后最高位到了PSW寄存器的CY位中
scl=0; //準(zhǔn)備
_nop_(); //穩(wěn)定一下
sda=CY; //將待發(fā)送的數(shù)據(jù)一位位的放到sda上
_nop_();
scl=1; //每一個高電平期間,ic器件都會將數(shù)據(jù)取走
_nop_();
}
scl=0; //如果寫成scl=1;sda=1就是停止信號,不能這么寫
_nop_();
sda=1; //釋放總線,數(shù)據(jù)總線不用時要釋放
_nop_();
}
u8 iic_readByte() //讀一個字節(jié)
{
u8 i,temp;
scl=0; //準(zhǔn)備讀數(shù)據(jù)
_nop_();
sda=1; //釋放總線
_nop_();
for(i=0;i<8;i++)
{
scl=1; //mcu開始取數(shù)據(jù)
delayus(); //scl為高電平后,ic器件就會將1位數(shù)據(jù)送到sda上
//總共用時不會大于4.34us,然后就可以讓mcu讀sda了
temp=(temp<<1)|sda; //讀一位保存到temp中
scl=0;
delayus();
}
return temp;
}
bool iic_checkACK() //處理應(yīng)答信號
{
u8 errCounts=255; //定義超時量為255次
scl=1;
_nop_();
while(sda) //在一段時間內(nèi)檢測到sda=0的話認(rèn)為是應(yīng)答信號
{
if(0==errCounts)
{
scl=0; //鉗住總線
_nop_();
return FALSE; //沒有應(yīng)答信號
}
errCounts--;
}
scl=0; //鉗住總線,為下1次通信做準(zhǔn)備
_nop_();
return TRUE; //成功處理應(yīng)答信號
}
void iic_init() //總線初始化
{
scl=1;
sda=1;
delayus();
}
void iic_sendACK(bool b_ACK) //發(fā)送應(yīng)答或非應(yīng)答信號
{
scl=0; //準(zhǔn)備
_nop_();
if(b_ACK) //ACK 發(fā)送應(yīng)該信號
{
sda=0;
}
else //unACK 發(fā)送非應(yīng)答信號
{
sda=1;
}
_nop_();
scl=1;
delayus(); //大于4us的延時
scl=0; //鉗住scl,以便繼續(xù)接收數(shù)據(jù)
_nop_();
}
void AT24Cxx_writeByte(u16 address,u8 dataByte)//向24cxx寫一字節(jié)數(shù)據(jù)
{
u8 largePage = address/256; //24c04是512字節(jié)(尋址范圍0~511),largePage最大值是1
u8 addressOffset = address%256; //largePage=0的話地址范圍是(0~255)
iic_start();
iic_sendByte(0xa0|(largePage<<1));//控制字,前4位固定1010,后三位是器件地址,末位0是寫
iic_checkACK(); //mcu處理應(yīng)答信號
iic_sendByte(addressOffset); //指定要寫入的器件內(nèi)地址在 largePage塊中的偏移
iic_checkACK();
iic_sendByte(dataByte); //寫數(shù)據(jù)
iic_checkACK();
iic_stop();
delayms(2);
//按字節(jié)寫入時,24cxx在接收到停止信號后將數(shù)據(jù)擦寫到內(nèi)部,這需要時間
//并且在這段時間內(nèi)不會響應(yīng)總線上的任何請求,故讓mcu有2毫秒以上的等待
}
void AT24Cxx_writeData(u16 address,u8 numBytes,u8* buf)//寫入任意長度數(shù)據(jù)(最大256字節(jié))
{
while(numBytes--)
{
AT24Cxx_writeByte(address++,*buf++);
}
}
void AT24Cxx_readData(u16 beginAddr,u8 dataSize,u8* buf)//讀取任意長度字節(jié)到緩沖區(qū)buf中
{
u8 largePage = beginAddr/256; //計(jì)算largePage,256字節(jié)為一大頁
u8 addressOffset = beginAddr%256; //計(jì)算相對于largePage的偏移
iic_start(); //起始信號
iic_sendByte(0xa0|(largePage<<1)); //控制字,寫
iic_checkACK(); //處理應(yīng)答信號
iic_sendByte(addressOffset); //要讀取的目標(biāo)地址偏移
iic_checkACK(); //處理應(yīng)答信號
iic_start(); //發(fā)送起始信號
iic_sendByte(0xa1|(largePage<<1)); //控制字,讀
iic_checkACK(); //處理應(yīng)答信號
while(dataSize--) //讀取dataSize個字節(jié),最大256個字節(jié)
{ //dataSize用u16類型會暴掉ram的
*buf++=iic_readByte(); //讀取一個個字節(jié)并保存到緩沖區(qū)buf中
iic_sendACK(dataSize); //發(fā)送應(yīng)答,當(dāng)dataSize為0時mcu發(fā)送非應(yīng)答
}
iic_stop(); //發(fā)送停止信號
}
void main()//測試
{
u8 buf[3]; //接受數(shù)據(jù)的緩沖區(qū)
u8 arr[7]={0x06,1,2,3,4,0x55,0x33}; //待寫入的數(shù)據(jù)
iic_init(); //總線初始化
AT24Cxx_writeData(0x00+256,sizeof(arr),arr); //向指定地址處開始寫入7字節(jié)的數(shù)據(jù)
P1=0xff; //調(diào)試代碼,用P1口的led顯示
delayms(1000); //調(diào)試代碼
AT24Cxx_readData(0x00+256,sizeof(buf),buf); //從指定地址開始讀3個字節(jié)
P1=buf[2]; //也就是2 //led燈顯示數(shù)值
while(1)
{
P1=~P1;
delayms(500);
}
}
復(fù)制代碼
//my51.h中主要用到
#include<reg52.h>
#include"mytype.h"
void delayms(u16 ms) //軟延時函數(shù)
{
u16 i,j;
for(i=ms;i>0;i--)
{
for(j=113;j>0;j--)
{}
}
}
復(fù)制代碼
對代碼進(jìn)行了改進(jìn)
去掉了在寫數(shù)據(jù)時的
delayms(2);
這句軟延時代碼低效 ,而且沒有保障
改成加一個檢測函數(shù)
bool check_icWriteComplete() //檢測eeprom是否對內(nèi)部擦寫完成
{
iic_start();
iic_sendByte(0xa0);
return iic_checkACK();
}
復(fù)制代碼
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久精品综合网
|
国产高清视频在线观看
|
97精品国产97久久久久久免费
|
羞羞视频免费在线
|
国产精品久久性
|
午夜网站视频
|
韩日精品在线观看
|
免费国产成人av
|
国产在线成人
|
国产一级淫片免费视频
|
精品国产一区二区久久
|
国产一区二区视频免费在线观看
|
91精品国产91久久久
|
色久影院
|
色综合色综合色综合
|
欧美精品一区二区在线观看
|
日韩电影免费观看中文字幕
|
国产精品久久久久久一区二区三区
|
91n成人
|
男女午夜免费视频
|
偷拍自拍在线观看
|
久草网视频
|
日日夜夜草
|
欧美一二精品
|
亚洲成人一区二区
|
免费三级黄
|
免费天天干
|
麻豆精品国产91久久久久久
|
国产91丝袜在线播放
|
天堂一区二区三区
|
成人影院免费视频
|
国产乱码精品一品二品
|
国产1区
|
欧美一区成人
|
成人福利影院
|
国产高清不卡
|
91久久国产综合久久91精品网站
|
亚洲午夜在线
|
亚洲视频在线免费观看
|
精品视频一区二区三区在线观看
|
一区二区三区视频在线观看
|