打印

仔细看IIC协议吧,虽说较简单,**还是不少的。

[复制链接]
1702|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xzhenggen|  楼主 | 2007-6-25 17:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg52.h"
#include "absacc.h"
#include "math.h"
#include "stdio.h"
#include "intrins.h"
#include "ad7896h.h"
#include "ds18b20h.h"
#include "timer.h"
#include "24c16.h"
#include "keyh.h"
#include "dac.h"
 uchar IDATA c_SumValue[2];
 uchar IDATA VlotageSum[2];
 void delay10(uint x);
 void I_init(void);
/*
void delay(uint x,uint y)
{
  uint i,j;
  for(i=0;i<=x;i++)
  {
     for(j=0;j<=y;j++)
     {
       _nop_();
       _nop_();
     }
  }
}
*/
void wait(void)
{
  byte i=50;
  for(i=0;i<8;i++);
}
void delay10(uint x)
{
  uint i=0;
  for(i=0;i<x;i++)
   _nop_();
}
void I_init(void)
{
  SCL = HIGH ;
  SDA=HIGH  ;
  wait();
}
void I_start(void)
{
  SCL = HIGH ;
  wait();
  SDA=LOW;
  wait();
  SCL=LOW;
  wait();

void I_stop(void)
{
  SDA=LOW;
  wait();
  SCL = HIGH ;
  wait();
  SDA=HIGH  ;
  wait();
  SCL=LOW;
  wait();
}
void I_send(byte a)
{
   byte i;
   for(i=0;i<8;i++)
   {
     if(a & 0x80)
      SDA=HIGH;
     else
      SDA=LOW;
     a=(a<<1);
     SCL = HIGH ;
     wait();
     SCL=LOW;
     wait();
   }
   SDA=HIGH;
   wait();
   SCL = HIGH ;
   wait();
   SCL=LOW;
   wait();
}
byte I_receive(void)
{
  byte a=0;
  byte i;
  for(i=0;i<8;i++)
  {
    a = a*2;
    SCL = HIGH ;
     wait();
    if(SDA) 
     a |= 1;
    SCL=LOW;
     wait(); 
  }
  SDA=HIGH;
   wait();
  return(a);
}
void I_addres_wri(byte ds,byte x,byte a)
{
  I_start();
  I_send(ds);
  I_send(x);
  I_send(a);
  I_stop();
  delay10(0x500);
}
byte I_addres_red(byte ds,byte x)
{
  byte a;
  I_start();
  I_send(ds);
  I_send(x);
  I_start();
  I_send(ds+1);
  a=I_receive();
  I_stop();
  return(a);
}
void wri_n(uchar z,uchar * x,uchar y,byte ds)
/*z:24c64addr,x,rom or ram or xdata addrds:写进24c16的分区,
第1区256b,ds=0xa0;第2区256b,ds=0xa2
第3区256b,ds=0xa4;第4区256b,ds=0xa6
第5区256b,ds=0xa8;第6区256b,ds=0xaa
第7区256b,ds=0xac;第8区256b,ds=0xae*/
{
  uchar i;
  uchar a;
  for(i=0;i<y;i++)
  {
    a=*(x+i);
    I_addres_wri(ds,z+i,a);
  }
}
 rea_n(uchar z,uchar * x,uchar y,byte ds)
/*z:24c64addr,x,rom or ram or xdata addr*/
{
  uchar i;
  for(i=0;i<y;i++)
  {
    *(x+i)=I_addres_red(ds,z+i);
  }
}

void read_wri16(void)
{
    c_SumValue[0]=VariablePi&0xff;
    c_SumValue[1]=(VariablePi&0xff00)>>8;
    wri_n(0,c_SumValue,2,0xa2);
    rea_n(0,VlotageSum,2,0Xa2);
    VariableVl=VlotageSum[1]*256+VlotageSum[0];
    //VariableVl=VariableVl&0xfff;
}
我的主函数读写上面的子程序read_wri16();不知为啥读数不正确?

相关帖子

沙发
NE5532| | 2007-6-25 18:59 | 只看该作者

先收应答脉冲。

使用特权

评论回复
板凳
wjy1107| | 2007-6-25 22:42 | 只看该作者

LS说的对阿

怎么没有检测ACK的过程呢?i2C不管是地址包还是数据包都应该是9位数据,你没检测第9位ACK那么就会出现问题啦。

使用特权

评论回复
地板
ayb_ice| | 2007-6-26 07:55 | 只看该作者

仔细看IIC协议吧,虽说较简单,**还是不少的。

使用特权

评论回复
5
xzhenggen|  楼主 | 2007-6-26 11:29 | 只看该作者

就是不能连续读写。。。。。。

使用特权

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

本版积分规则

55

主题

529

帖子

1

粉丝