登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

24c64的问题

作者:sophiewang 栏目:单片机
24C64.html">24C64的问题
/*********************24C64.html">24C64读写操作************************/
/************
启动总线
*************/
void Start()
{
SDA=1;             /*发送起始条件的数据信号*/
_nop_();
SCL=1;     
_nop_();
_nop_();        
SDA=0;             /*发送起始信号*/
_nop_();
_nop_();
SCL=0;             /*钳住I2C总线,准备发送或接收数据 */
}
/***************************************************************************
停止IIC总线
****************************************************************************/
void Stop()
{
SCL=0;
_nop_();
SDA=0;                 /*发送结束条件的数据信号*/
_nop_();
SCL=1;                  /*发送结束条件的时钟信号*/
_nop_();             
SDA=1;
}
/***************************************************************************
对总线产生应答
****************************************************************************/
void Ack()
{
SDA=0;               /*在此发出应答信号 */
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
SCL=0;               /*清时钟线,钳住I2C总线以便继续接收*/
_nop_();
_nop_();
SDA=1;
}
/***************************************************************************
不对总线产生应答
****************************************************************************/
void NoAck()
{
SDA=1;               /*在此发出非应答信号 */
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
SCL=0;              /*清时钟线,钳住I2C总线以便继续接收*/
}
/***************************************************************************
检查应答位
/***************************************************************************/
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总线写一字节数据
****************************************************************************/
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写入多字节
输入:地址指针,E2ROM地址,字节数
****************************************************************************/
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写入单字节
输入: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总线上读一字节数据
****************************************************************************/
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读多字节;
输入:存放的地址指针,E2ROM地址,字节数
****************************************************************************/
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);
}

  数据写入正常,读出不太稳定,有时必须读两次才能读出正确的值.

2楼: >>参与讨论
isoar
写入之后不要马上读,加个延时后再读试试
 
3楼: >>参与讨论
后学
看datasheet上写的需要多少延时
 
参与讨论
昵称:
讨论内容:
 
 
相关帖子
请教SYNCOMS单片机的问题
求救:我的板子用RC500非常好,换上FM1702N连request都过不了?
C小程序
视频信号怎么成了黑白信号了???
请教前辈们几个问题啊!
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号