音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網
技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe

24c64的問題

作者:sophiewang 欄目:測控之家
24C64.html">24C64的問題
/*********************24C64.html">24C64讀寫操作************************/
/************
啟動總線
*************/
void Start()
{
SDA=1;             /*發(fā)送起始條件的數據信號*/
_nop_();
SCL=1;     
_nop_();
_nop_();        
SDA=0;             /*發(fā)送起始信號*/
_nop_();
_nop_();
SCL=0;             /*鉗住I2C總線,準備發(fā)送或接收數據 */
}
/***************************************************************************
停止IIC總線
****************************************************************************/
void Stop()
{
SCL=0;
_nop_();
SDA=0;                 /*發(fā)送結束條件的數據信號*/
_nop_();
SCL=1;                  /*發(fā)送結束條件的時鐘信號*/
_nop_();             
SDA=1;
}
/***************************************************************************
對總線產生應答
****************************************************************************/
void Ack()
{
SDA=0;               /*在此發(fā)出應答信號 */
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
SCL=0;               /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
_nop_();
_nop_();
SDA=1;
}
/***************************************************************************
不對總線產生應答
****************************************************************************/
void NoAck()
{
SDA=1;               /*在此發(fā)出非應答信號 */
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
SCL=0;              /*清時鐘線,鉗住I2C總線以便繼續(xù)接收*/
}
/***************************************************************************
檢查應答位
/***************************************************************************/
bit TestAck()
{
SDA=1;_nop_();
SCL=0;_nop_();
SCL=1;_nop_();
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
if(SDA==1)return(1);
SCL=0;_nop_();
return(0);

}
/***************************************************************************
向IIC總線寫一字節(jié)數據
****************************************************************************/
void Send(uchar input)
{
uchar j=8;
SCL=0;_nop_();
while(j--)
{
  SDA=(bit)(input&0x80);_nop_();
  input=input<<1;
  SCL=1;_nop_();
  SCL=0;_nop_();
}
}
/***************************************************************************
24C64寫入多字節(jié)
輸入:地址指針,E2ROM地址,字節(jié)數
****************************************************************************/
uchar Write24C64.html">24C64(uchar *Wdata,uint RomAddr,uchar num)
{
uchar VALUE;
Start();
Send(WriteDeviceAddr);           //設置控制字
if(TestAck()==1)return(1);
VALUE=RomAddr/256;
Send(VALUE);
if(TestAck()==1)return(1);
VALUE=RomAddr%256;
Send(VALUE);
if(TestAck()==1)return(1);

for(;num>0;num--) {
  Send(*Wdata);
  Wdata++;
  if(TestAck()==1)return(1);
}
Stop();
delayNms(100);
return(0);
}

/*************************
24C64寫入單字節(jié)
輸入:E2ROM地址,數據
*************************/
uchar Write24C64.html">24C64_byte(uint address,uchar ddata)
{
  uchar VALUE;
  Start();
  Send(WriteDeviceAddr);
  _nop_();
  if(TestAck()==1)return(1);
  VALUE=address/256;
  Send(VALUE);
  _nop_();
  if(TestAck()==1)return(1);
  VALUE=address%256;
  Send(VALUE);
  _nop_();
  if(TestAck()==1)return(1);
  Send(ddata);
  _nop_();
  if(TestAck()==1)return(1);
  Stop();
  delayNms(100);
  return(0);
  }
  
/***************************************************************************
從IIC總線上讀一字節(jié)數據
****************************************************************************/
uchar Receive()
{
uchar j=8,rbyte=0;
while(j--)
{
  SCL=1;
  rbyte=rbyte<<1;
  rbyte=rbyte|SDA;
  SCL=0;_nop_();_nop_();
}
return(rbyte);
}
/***************************************************************************
24C64.html">24C64讀多字節(jié);
輸入:存放的地址指針,E2ROM地址,字節(jié)數
****************************************************************************/
uchar Read24C64.html">24C64(uchar *RamAddr,uint RomAddr,uchar bytes)
{
uchar VALUE;
Start();
Send(WriteDeviceAddr);
delayNms(1);
if(TestAck()==1)return(1);
VALUE=RomAddr/256;
Send(VALUE);
delayNms(1);
if(TestAck()==1)return(1);
VALUE=RomAddr%256;
Send(VALUE);
delayNms(1);
if(TestAck()==1)return(1);

delayNms(10);
Start();
Send(ReadDviceAddr);
delayNms(1);
if(TestAck()==1)return(1);
  
while(bytes)
{
*RamAddr=Receive();
Ack();
RamAddr++;
bytes--;
}
NoAck();
Stop();
delayNms(100);
return(0);
}

    寫入數據時正常,讀數據很不穩(wěn)定,有時讀出的數據正確,有時就不對(除了第一個全是ff),不明白是什么原因。

參與討論
昵稱:
討論內容:
 
 
相關帖子
dtmf fsk編碼/解碼芯片
一個簡單的監(jiān)測方案,我不會呀,幫幫忙
交流有功功率測量的問題
誰用過max135?
請教MC34063應用中遇到的問題
免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號