[讨论] 关于i2c总线的问体,大家帮忙看看哪儿出问题了

天天ok   2015-4-24 13:09 楼主
用的从器件是e2prom,24c08,得不到想要的结果,个人觉得是read()函数出问题了,应该怎么改求助攻。
#include
#define uchar unsigned char
#define uint unsigned int
sbit scl=P3^4;
sbit sda=P3^5;
void delay(void ) /*/延时函数产生5us以上延时        */
{; ; ; ; ; }
void delay1(uchar i)
{
  uchar j;
for(i;i>0;i--)
     for( j=100;j>0;j--);
}

void start(void)/*/开始信号函数scl保持高电平,sda由高电平跳转到低电平 */
{
     sda=1;
         delay();
         scl=1;
         delay();
         sda=0;
         delay();
}  

void stop(void)/*/终止信号,scl保持高电平,sda由低电平到高电平*/
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}

void inition(void)/*/信号初始化        */
{
   sda=1;
   delay();
   scl=1;
   delay();       
}

void response(void)
{
        uchar i=0;
        while((sda==1)&&(i<10))i++;
}

void write(uchar date)/*/写数据函数,主机通过sda向从机传送数据          */
{
    uchar temp,j;
         temp=date;
         for(j=0;j<8;j++)
         {
          scl=0;
          delay();
          temp=(temp<<1);
          sda=CY;
          scl=1;
          delay();
         }
}

uchar read(void)
{
    uchar i,k;
        for(i=0;i<8;i++)
        {
          scl=0;
          delay();
          k=(k<<1)|sda;
          scl=1;
          delay();
          
        }
        return k;
}      

void main(void)
{
  uchar temp;
  inition();
  start();
  write(0xa0);/*/主机选从机;24c08 1010???r/w   0主机向从机写数据 1主机接收从机传来的数据          */
  response();
  write(3);/*/从机起始地址 ???????r/w 0写        */
  response();
  write(0xf0);/*/传送数据 */
  response();
  stop();

  delay1(200);
  start();
  write(0xa0);
  response();
  write(3);
  response();
  start();
  write(0xa1);
  response();
   temp=read();
  P0=temp;
  delay();
  stop();
  while(1);
}

回复评论 (3)

仔细分析一下时序和逻辑有没有错误的地方
点赞  2015-4-24 14:07
谢谢,错误有两处,一处在应答函数,应答时scl是高电平,一处在写数据处,一个数据写完,没有释放总线。我改了,能工作了.不知还有没有问题?


点赞  2015-4-24 17:58
上逻辑仪抓波形分析
点赞  2015-4-26 23:42
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复