打印

请教:C8051F020的I2C操作24LC512存储器的问题

[复制链接]
1702|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pcf00|  楼主 | 2013-3-14 13:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前采用的查询方式,总线上挂了2个器件:24LC512和一个时钟IC,目前时钟没有问题了,就卡在存储器上,不知道是写不进去还是读不出来,相关代码如下:
初始化:
  SMB0CN  = 0x40; // SMBus Control Register,控制寄存器,这里只是使能I2C
  SMB0ADR = 0x00; // SMBus Address Register,用于从模式时设置从地址
  SMB0CR  = 0x25; // SMBus Clock Rate Register,这里是在22.1184M 频率下算出的值
写操作:
  /********************************************/
// 函数名称 : wr_iic
// 功    能 : 向从设备写入数据
// 入口函数 : iic_data ,数据;WiicAddr,从器件地址;n, 数据个数
// 出口函数 : --
// 说    明 : --
/********************************************/
void WR_iic(unsigned char* iic_data,unsigned char WiicAddr,unsigned int n)
{
unsigned int k;
if(WiicAddr==ADDR24512)EP24WP = 0;
   else EP24WP = 1;
    WiicAddr=WiicAddr&IIC_WD;
while(BUSY);
do
{  
  STO = 0;
  STA = 1;             // Send a start signal
  //SI=0;
  while(!SI);
  while(SMB0STA!=0x08);

  STA = 0;
  
  SMB0DAT = WiicAddr ;     //Send a ADRESS
  SI=0;
  while(!SI);
}while(SMB0STA!=0x18);
for(k=0;k<n;k++)
{
  do
  {
    SI = 0;
    SMB0DAT =iic_data[k] ;        
    while(!SI);
  }while(SMB0STA!=0x28);
}
STO = 1;
SI = 0;
EP24WP = 1;
}
读操作:
/********************************************/
// 函数名称 : rd_iic24
// 功    能 : 向从设备写入数据
// 入口函数 : DEVAddr,从器件地址;n, 数据个数 ; Addr24 数据地址
// 出口函数 : iic_data ,数据;
// 说    明 : --
/********************************************/
void RD_iic24(unsigned char* iic_data,unsigned char DevAddr,unsigned int Addr24,unsigned int n)
{
unsigned int k;
unsigned char ADDr1,ADDr2;
unsigned char temp[2];
   
unsigned char rst =0;
    if(DevAddr==ADDR24512)EP24WP = 0;
   else EP24WP = 1;
    ADDr1 = DevAddr&IIC_WD;
ADDr2 = DevAddr|IIC_RD;
temp[0] = Addr24>>8;
temp[1] = Addr24;
while(BUSY);
do
{
  STO = 0;
  STA = 1;             // Send a start signal
  while(!SI);
  while(SMB0STA!=0x08);
  STA = 0;
  SMB0DAT = ADDr1 ;     //Send a DEVICE ADRESS
  SI=0;
  while(!SI);
}while(SMB0STA!=0x18);
AA = 1;
for(k=0;k<2;k++)
{
  do
  {
      SI = 0;
   SMB0DAT =temp[k] ;        
   while(!SI);
  }while(SMB0STA!=0x28);
}
SI = 0; //STO = 1;
do        // begin to receive data
{
  STO = 0;
  STA = 1;             // Send a start signal
  while(!SI);  
  while(SMB0STA!=0x10);
  SI = 0;
  STA = 0;
  SMB0DAT = ADDr2 ;     //Send eeprom_read ADRESS  
  while(!SI);
}while(SMB0STA!=0x40);
SI = 0;
for(k=0;k<n-1;k++)   //开始发送页数据
{
  do
  {
   SI=0;
   while(!SI);  
   iic_data[k] = SMB0DAT;
  }while(SMB0STA!=0x50);
}
AA=0;
do       //最后一个字节,发送非应答信号
{
  SI=0;
  while(!SI);  
  iic_data[n-1] = SMB0DAT;
}while(SMB0STA!=0x58);
STO = 1;
SI  = 0;
EP24WP = 1;
}

大侠们看看问题在哪里

相关帖子

沙发
pcf00|  楼主 | 2013-3-14 14:05 | 只看该作者
大神们指点一下。。。。。。。。。急啊!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

54

主题

311

帖子

2

粉丝