Cinderella6 发表于 2019-5-7 16:15:08

STM32L4xx LL库的硬件IIC问题

本帖最后由 Cinderella6 于 2019-5-8 17:02 编辑

各位好,最近在调试STM32L496,LL库的硬件IIC驱动,读取传感器数据读不到,我用软件IIC没问题,只是非常想用硬件方式替代软件方式,我的读取代码在下边,能否指点下是哪里出了问题,或者有做过LL库硬件iic,HAL库的也行,可否吧驱动借我参考下。谢谢了。/*
************************************************************
*      函数名称:      I2C_ReadByte
*
*      函数功能:      软件IIC读取一个字节
*
*      入口参数:      i2c_x:I2C组
*                              slave_addr:从机地址
*                              reg_addr:寄存器地址
*                              val:需要读取的数据缓存
*
*      返回参数:      0-成功                1-失败
*
*      说明:                val是一个缓存变量的地址
************************************************************
*/
_Bool I2C_ReadByte(I2C_TypeDef *i2c_x, unsigned char slave_addr, unsigned char reg_addr, unsigned char *val)
{
      
      unsigned char addr = 0;

    addr = slave_addr << 1;                        //IIC地址是7bit,这里需要左移1位,bit0:1-读      0-写
      
      iic_info.i2c_x = i2c_x;

#if(HW_I2C == 1)
      LL_I2C_SetSlaveAddr(iic_info.i2c_x, addr);
      LL_I2C_SetTransferRequest(iic_info.i2c_x, LL_I2C_REQUEST_WRITE);
      LL_I2C_SetTransferSize(iic_info.i2c_x, 1);
#endif
      
      IIC_Start();                                        //起始信号
      
#if(HW_I2C == 0)
      IIC_SendByte(addr);                              //发送设备地址(写)
      if(IIC_WaitAck(5000))                        //等待应答
                return IIC_Err;
#endif
      
      IIC_SendByte(reg_addr);                        //发送寄存器地址
      if(IIC_WaitAck(5000))                        //等待应答
                return IIC_Err;
      
      IIC_Stop();
      
#if(HW_I2C == 1)
      LL_I2C_SetSlaveAddr(iic_info.i2c_x, addr);
      LL_I2C_SetTransferRequest(iic_info.i2c_x, LL_I2C_REQUEST_READ);
      LL_I2C_SetTransferSize(iic_info.i2c_x, 1);
#endif
      
      IIC_Start();                                        //重启信号
      
#if(HW_I2C == 0)
      IIC_SendByte(addr + 1);                        //发送设备地址(读)
      if(IIC_WaitAck(5000))                        //等待应答
                return IIC_Err;
#endif
      
      *val = IIC_RecvByte();                        //接收
      IIC_NAck();                                                //产生一个非应答信号,代表读取接收
      
      IIC_Stop();                                                //停止信号
      
      return IIC_OK;

}

Cinderella6 发表于 2019-5-8 17:02:00

已解决。
开始带着F1的硬件iic思路去做,发现不行,应该是少设置了些参数。后来吧HAL库里边的i2c读写代码的核心部分抠出来,在LL库里边找相同功能的接口替换,就可以用了

lrzxc111 发表于 2019-5-8 20:19:49

嗯,谢谢分享解决之道
页: [1]
查看完整版本: STM32L4xx LL库的硬件IIC问题