你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

IIC读数据,数据读出来错误

[复制链接]
liu553824989 提问时间:2016-7-27 11:57 /
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<len;i++)
    {
        BEKEN_I2C_sendbyte(pBuf[i]);
        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<len-1;i++)
                {
                        pBuf[i] = BEKEN_I2C_readbyte();
                        BEKEN_I2C_ack();
                        temp =        pBuf[i];
                }
                pBuf[i] = BEKEN_I2C_readbyte();
                BEKEN_I2C_nack();
                temp =        pBuf[i];
               
                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
        }
}

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

上面是别人的样机,下面是我写的
收藏 评论0 发布时间:2016-7-27 11:57

举报

0个回答

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版