打印

IIC、24C28读写问题,读出来一直是0xff

[复制链接]
2887|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Jim618|  楼主 | 2015-12-17 16:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用瑞萨单片机读写24C128,读出来的一直都是0XFF,写好像也不对,但是我仔细检查了代码也没发现什么问题,代码如下,困扰我几天了,请高人纠正,谢谢!!!
#define SDA_IN                prc2=1 ; pd3 = 0x7d ;prc2=0 ;
#define SDA_OUT                prc2=1 ; pd3 = 0xfd ;prc2=0 ;

void IIC24_Start(void)   //开始
{
        SDA_OUT
        SDA = TRUE ;
        SCL = TRUE ;
   
        Delay(0x08) ;
   
        SDA = FALSE ;
        Delay(0x08) ;
        SCL = FALSE ;
}

void IIC24_Stop(void)      //结束
{
        SDA_OUT
        SDA = FALSE ;
        SCL = TRUE ;

        Delay(0x08) ;

        SDA = TRUE ;

        Delay(0x08) ;

        SCL = FALSE ;
}


void IIC_Clock(void)   //脉冲
{
        SCL = FALSE ;

        Delay(0x08) ;

        SCL = TRUE ;
        Delay(0x02) ;
   
        SDA_IN
   
        Delay(0x08) ;
   
        IICBit = SDA ;

        Delay(0x02) ;
   
        SDA_OUT
   
        Delay(0x02) ;
   
        SCL = FALSE ;
}


void IIC_Clock_Only(void)   //脉冲
{
        SCL = FALSE ;

        Delay(0x08) ;

        SCL = TRUE ;

        Delay(0x08) ;
   
        SCL = FALSE ;
}

/*
void IIC_nAck(void)//应答
{
        unsigned char z=0;
       
        while((SDA==1)&&(z<50))//条件判断, AT128_DAT=1,则没有应答。如果没有应答则延时:z<50,z++;后返回
        {
                z++;
//                Disp_IICValue        = 67 ;
                DispValue                = 78 ;
        }
        SCL=0;
        Delay(0x08) ;//5us延时
}
*/

void IIC_Ack(void)      //应答
{
        SDA_OUT
        SDA = FALSE ;
        IIC_Clock_Only() ;
}


void IIC_nAck(void)      //无应答
{
        SDA_OUT
        SDA = TRUE ;
        IIC_Clock_Only() ;
}

unsigned char IIC_OutputByte(void)         //读出一字节数据
{
        unsigned char nCounts,nData ;

        for(nCounts=0;nCounts<8;nCounts++)
        {
                nData = nData << 1 ;
                IIC_Clock() ;
                if(IICBit == 1)
                        nData = (nData | 0x01) ;
                else
                        nData = (nData & 0xfe) ;
        }
        return nData ;
}

void IIC_InputByte(unsigned char nData)      //写入一字节数据
{
        unsigned char nCounts ;

        for(nCounts=0;nCounts<8;nCounts++)
        {
                if((nData & 0x80) == 0x80)
                        SDA = 1 ;
                else
                        SDA = 0 ;
                IIC_Clock_Only() ;
                nData = nData << 1 ;
        }
}

void IIC_WriteByte(unsigned int nAddr,unsigned char nData)   //写单字节数据
{
        IIC24_Start() ;
        IIC_InputByte(WRITECOM);
        IIC_nAck() ;              
        IIC_InputByte((unsigned char)(nAddr>>8)) ;
        IIC_nAck() ;
        IIC_InputByte((unsigned char)nAddr) ;
        IIC_nAck() ;
        IIC_InputByte(nData) ;
        IIC_nAck() ;
        IIC24_Stop() ;
}


void IIC_WritePage(unsigned int nAddr,unsigned char nNum,unsigned char nData[])      //页写,最多写32字节,不能跨越物理页
{
        unsigned char nCounts ;

        IIC24_Start() ;
        IIC_InputByte(WRITECOM) ;
        IIC_nAck() ;
        IIC_InputByte((unsigned char)((nAddr & 0xff00)>>8)) ;
        IIC_nAck() ;
        IIC_InputByte((unsigned char)(nAddr & 0x00ff)) ;
        IIC_nAck() ;
        for(nCounts=0;nCounts<nNum;nCounts++)
        {
                IIC_InputByte(nData[nCounts]) ;
                IIC_nAck() ;
        }
        IIC24_Start() ;
}


_Bool IIC_Polling(void)
{
        unsigned int nTemp,nCounts = 0 ;
  
        while(nCounts<0x3ff)
        {
                IIC24_Start() ;
                IIC_InputByte(READCOM) ;
                IIC_nAck() ;
              if(IICBit == 0)
              {
                        nTemp = IIC_OutputByte() ;
                        IIC_nAck() ;
                        IIC24_Stop() ;
                        return TRUE ;
                }
                nCounts++ ;
        }
        return FALSE ;
}


//======随机读=====
unsigned char IIC_ReadByte(unsigned int nAddr)         //读单字节数据
{
        unsigned char nData ;

        IIC24_Start() ;
        IIC_InputByte(WRITECOM) ;
        IIC_nAck() ;
        IIC_InputByte((unsigned char)(nAddr>>8)) ;
        IIC_nAck() ;
        IIC_InputByte((unsigned char)nAddr) ;
        IIC_nAck() ;
        IIC24_Start() ;
        IIC_InputByte(READCOM) ;
        IIC_nAck() ;
        nData=IIC_OutputByte() ;
        Disp_IICValue        = nData ;
        IIC_nAck() ;
        IIC24_Stop() ;
   
        return nData ;
}

相关帖子

沙发
leastbad| | 2015-12-17 17:52 | 只看该作者
示波器

使用特权

评论回复
板凳
dirtwillfly| | 2015-12-17 18:30 | 只看该作者
观察下时序看看

使用特权

评论回复
地板
柏谕| | 2015-12-18 08:17 | 只看该作者
如果时序没错建议检查一下端口配置,我有次用新唐的模拟就是没配置好端口搞了好久

使用特权

评论回复
5
caoenq| | 2015-12-19 09:06 | 只看该作者
因为没写进去,所以读出来都是FF,要不就是数据线对电源短路

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝