打印

大伙们帮我看看24C01的驱动程序哪出问题了

[复制链接]
1901|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hufa123|  楼主 | 2010-4-1 18:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
连续调用两个写函数 后个就没写进去,读函数也不正常,哪出问题了  
驱动函数如下:
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit Scl=P1^0;
sbit Sda=P1^1;
uchar i;
uchar shuxian[6]={0x01,0x02,0x03};//临时存储
void Start(void)        /*起始条件*/
{
        Sda=1;
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Sda=0;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
}
void Stop(void) /*停止条件*/
{
        Sda=0;
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Sda=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
}
void Ack(void)  /*应答位*/
{
        Sda=0;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=0;
}
void  NoAck(void)       /*反向应答位*/
{
        Sda=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=1;
        _nop_ ();
        _nop_ ();
        _nop_ ();
        _nop_ ();
        Scl=0;
}
void Send(uchar Data)   /*发送数据子程序,Data为要求发送的数据*/
{
        uchar BitCounter=8;       /*位数控制*/
        uchar temp;     /*中间变量控制*/
        do
        {
           temp=Data;
           Scl=0;
           _nop_ ();
           _nop_ ();
           _nop_ ();
           _nop_ ();
           if((temp&0x80)==0x80)/* 如果最高位是1*/
                Sda=1;
           else
                Sda=0;
           Scl=1;
           temp=Data<<1;        /*RLC*/
           Data=temp;
           BitCounter--;
         }while(BitCounter);
         Scl=0;
}
uchar Read(void) /*读一个字节的数据,并返回该字节值*/
{
        uchar temp=0;
        uchar temp1=0;
        uchar BitCounter=8;
        Sda=1;
        do{
          Scl=0;
          _nop_ ();
          _nop_ ();
          _nop_ ();
          _nop_ ();
          Scl=1;
          _nop_ ();
          _nop_ ();
          _nop_ ();
          _nop_ ();
          if(Sda)       /*如果Sda=1;*/
                temp=temp|0x01;  /*temp的最低位置1*/
          else
                temp=temp&0xfe;  /*否则temp的最低位清0*/
          if(BitCounter-1)
          {   temp1=temp<<1;
              temp=temp1;
          }
          BitCounter--;
        }while(BitCounter);
        return(temp);
}
void WrToROM(uchar Data[],uchar Address,uchar Num)
{
     uchar i=0;
     uchar *PData;
     PData=Data;
     Start();        
     Send(0xa0);   
     Ack();
     Send(Address);  
     Ack();
     for(i=0;i<Num;i++)
     {
        Send(*(PData+i));
        Ack();
     }
     Stop();
}
void  RdFromROM(uchar Data[],uchar Address,uchar Num)
{
     uchar i=0;
     uchar *PData;
     PData=Data;
     for(i=0;i<Num;i++)
     {
        Start();
        Send(0xa0);
        Ack();
        Send(Address+i);
        Ack();
        Start();
        Send(0xa1);
        Ack();
        *(PData+i)=Read();
        Scl=0;
        NoAck();
        Stop();
   }
}
是不是跟我的PROTUES仿真有关系啊?

相关帖子

沙发
hufa123|  楼主 | 2010-4-1 18:36 | 只看该作者
自己顶下 着急等待中ING 前辈们指点下江山··

使用特权

评论回复
板凳
zuidaeji| | 2010-4-2 01:10 | 只看该作者
按你的流程,你自己画一下时序就知道问题在哪了

另:程序有点乱,你就那么喜欢while,那么不待见for么???

注释可以用//嘛,何必用繁琐的/*

其实读和写函数都可以只用1个变量就可以完成

SCL和SDA变化的地方,你有些地方加了4个nop,有些地方一个都没有,有去了解过为什么要加nop,而且为什么要加这么多吗

使用特权

评论回复
地板
hufa123|  楼主 | 2010-4-3 20:10 | 只看该作者
谢谢你的评语 我在回去悟

使用特权

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

本版积分规则

186

主题

393

帖子

2

粉丝