7232|3

143

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

搞不定了,求助高手,IIC读ID数据,数据读出来错误 [复制链接]

void BEKEN_I2C_Start(void)
{
        BK_SCL_H;
        BK_SDA_H;
        Delay1us;//(28us)
        BK_SDA_L;//START:when CLK is high,DATA change form high to low
        Delay1us;//延时要大于4.7us
        BK_SCL_L;//钳住I2C总线,准备发送或接收数据
        Delay1us;
}
void BEKEN_I2C_Stop(void)
{
        BK_SCL_L;//标记MPU_SCL_H
        BK_SDA_L;//STOP:when CLK is high DATA change form low to high
        Delay1us;
        BK_SCL_H;//标记MPU_SDA_H
        Delay1us;
        BK_SDA_H;//标记MPU_SCL_H
        Delay1us;
}
u8 BEKEN_I2C_ReceiveACK(void)
{
        /*u16 i,j;
        i=700;
        BK_SDA_H;
        //Delayus(4);
        BK_SCL_H;
        Delay1us;
        while(BK_SDA_read)//从机拉低数据线代表收到数据
        {
                i--;//延时等待一定的时间,例如可以等待0.5毫秒或者循环读2000次ACK,如果超过这个时间没有响应,就返回失败信息
                Delay1us;
        if(i<10)
        {
            BK_SCL_L;
            return TRUE;//1
        }
        }
        BK_SCL_L;
        Delay1us;
        return FALSE;//0*/
        
        BK_SCL_L;
        Delay1us;
        BK_SCL_H;
        Delay1us;
        if(BK_SDA_read)
        {
                BK_SCL_L;
                return TRUE;
        }
        BK_SCL_L;
    Delay1us;
        return FALSE;
}
void BEKEN_I2C_ack(void)
{
        BK_SCL_L;//标记,这里之前没有的
        BK_SDA_L;
    Delay1us;
    BK_SCL_H;
    Delay1us;
    BK_SCL_L;
    Delay1us;
}
void BEKEN_I2C_nack(void)
{
        BK_SCL_L;//标记,这里之前没有的
        BK_SDA_H;
    Delay1us;
    BK_SCL_H;
    Delay1us;
    BK_SCL_L;
    Delay1us;
}
void BEKEN_I2C_sendbyte(u8 val)
{
        u8 i;
        BK_SCL_L;//拉低时钟开始传输数据
        for(i=0;i<8;i++)
        {
                if(val&0x80)
                        BK_SDA_H;
                else
                        BK_SDA_L;
                val<<=1;
                BK_SCL_H;
                Delay1us;
                BK_SCL_L;
                Delay1us;
        }
}
u8 BEKEN_I2C_readbyte(void)
{
        u8 i,j,read_data=0;
        BK_SDA_H;
        for(i=0;i<8;i++)
        {
                read_data<<=1;
                BK_SCL_L;
                Delay1us;
                BK_SCL_H;
                Delay1us;
                if(BK_SDA_read)
                        read_data|=0x01;
        }
        BK_SCL_L;
    return read_data;
}



/*************************************************
  Function:       BEKEN_I2c_Write
  Description:    write a array
  Input:          reg: register number
                  pBuff: a buffer contain written data
                  len:the length of written data      
  Output:         None
  Return:         None
*************************************************/
void BEKEN_I2c_Write(u8 reg,u8 *pBuf,u8 len)
{
    u8 i;
    u8 Addr;
    Addr=dev_addr;//device address.

    if(reg <= 0x0b)       //Analog registers saved by analog_reg_val[][] for read operation
    {
        analog_reg_val[reg][0] = pBuf[0];
        analog_reg_val[reg][1] = pBuf[1];
        analog_reg_val[reg][2] = pBuf[2];
        analog_reg_val[reg][3] = pBuf[3];
    }

    BEKEN_I2C_Start();
    BEKEN_I2C_sendbyte(Addr);
    BEKEN_I2C_ReceiveACK();

    reg=reg<<1;
    BEKEN_I2C_sendbyte(reg);   
    BEKEN_I2C_ReceiveACK();
         
    for(i=0;i     {
        BEKEN_I2C_sendbyte(pBuf);
        BEKEN_I2C_ReceiveACK();
    }
    BEKEN_I2C_Stop();

}

/*************************************************
  Function:       BEKEN_I2c_Read
  Description:    read a array
  Input:          reg: register number
                  len:the length of read data   

  Output:         pBuff: a buffer contain read data
  Return:         None
*************************************************/

void BEKEN_I2c_Read(u8 reg,u8 *pBuf,u8 len)
{
    u8 i;
    u8 Addr;
    u8 temp;   
    Addr=dev_addr;//device address.

    if(reg <= 0x0b)         //Analog registers not read directly from chip,recalled from analog_reg_val[][]
    {
            pBuf[0] = analog_reg_val[reg][0];
        pBuf[1] = analog_reg_val[reg][1];
        pBuf[2] = analog_reg_val[reg][2];
        pBuf[3] = analog_reg_val[reg][3];
    }
        else
        {
                BEKEN_I2C_Start();
                BEKEN_I2C_sendbyte(Addr);  
                BEKEN_I2C_ReceiveACK();
               
                reg=reg<<1;
                reg|=0x01;
                BEKEN_I2C_sendbyte(reg);
                BEKEN_I2C_ReceiveACK();
               
                for(i=0;i                 {
                        pBuf = BEKEN_I2C_readbyte();
                        BEKEN_I2C_ack();
                        temp =        pBuf;
                }
                pBuf = BEKEN_I2C_readbyte();
                BEKEN_I2C_nack();
                temp =        pBuf;
               
                BEKEN_I2C_Stop();
        }

        if(reg==0x21)//reg0x10[31:16]=SW_VERSION_NO
        {
                pBuf[0] =(u8)((SW_VERSION_NO&0xff00)>>8);
                pBuf[1] =(u8)(SW_VERSION_NO&0x00ff);
                #ifdef DEBUG_INFO
                pBuf[0] =(u8)((debug_info&0xff00)>>8);
                pBuf[1] =(u8)(debug_info&0x00ff);
                #endif
        }
}

图片上面是别人的样机,下面是我写的

QQ图片20160727115530.png (13.91 KB, 下载次数: 1)

QQ图片20160727115530.png
此帖出自stm32/stm8论坛

最新回复

I2C的问题,大部分在时序上,需要仔细检查。可以在Proteus上仔细仿真看看,它的I2C仪表还是很好用的。 另外看看上拉电阻是否合适,内部的弱上拉通常在几十K,有时不能正常工作。  详情 回复 发表于 2016-7-27 14:09
点赞 关注
 

回复
举报

1万

帖子

25

TA的资源

版主

沙发
 
看图示,前面数据一样,但是到0x95,你的数据就成了0x0F。
此帖出自stm32/stm8论坛

点评

是的,读出来的数据就变了,找不出原因啊  详情 回复 发表于 2016-7-27 12:37
 
 

回复

143

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
dcexpert 发表于 2016-7-27 12:23
看图示,前面数据一样,但是到0x95,你的数据就成了0x0F。

是的,读出来的数据就变了,找不出原因啊
此帖出自stm32/stm8论坛
 
 

回复

1万

帖子

25

TA的资源

版主

4
 
I2C的问题,大部分在时序上,需要仔细检查。可以在Proteus上仔细仿真看看,它的I2C仪表还是很好用的。

另外看看上拉电阻是否合适,内部的弱上拉通常在几十K,有时不能正常工作。
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后一周!2025 英飞凌消费、计算与通讯创新大会-北京站
会议时间:3月18日(周二)09:30签到
参会奖励:电动螺丝刀套装、户外登山包、京东卡

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表