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

STM32L4xx LL库的硬件IIC问题

[复制链接]
Cinderella6 提问时间:2019-5-7 16:15 /
本帖最后由 Cinderella6 于 2019-5-8 17:02 编辑

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

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

  24. #if(HW_I2C == 1)
  25.         LL_I2C_SetSlaveAddr(iic_info.i2c_x, addr);
  26.         LL_I2C_SetTransferRequest(iic_info.i2c_x, LL_I2C_REQUEST_WRITE);
  27.         LL_I2C_SetTransferSize(iic_info.i2c_x, 1);
  28. #endif
  29.         
  30.         IIC_Start();                                        //起始信号
  31.         
  32. #if(HW_I2C == 0)
  33.         IIC_SendByte(addr);                                //发送设备地址(写)
  34.         if(IIC_WaitAck(5000))                        //等待应答
  35.                 return IIC_Err;
  36. #endif
  37.         
  38.         IIC_SendByte(reg_addr);                        //发送寄存器地址
  39.         if(IIC_WaitAck(5000))                        //等待应答
  40.                 return IIC_Err;
  41.         
  42.         IIC_Stop();
  43.         
  44. #if(HW_I2C == 1)
  45.         LL_I2C_SetSlaveAddr(iic_info.i2c_x, addr);
  46.         LL_I2C_SetTransferRequest(iic_info.i2c_x, LL_I2C_REQUEST_READ);
  47.         LL_I2C_SetTransferSize(iic_info.i2c_x, 1);
  48. #endif
  49.         
  50.         IIC_Start();                                        //重启信号
  51.         
  52. #if(HW_I2C == 0)
  53.         IIC_SendByte(addr + 1);                        //发送设备地址(读)
  54.         if(IIC_WaitAck(5000))                        //等待应答
  55.                 return IIC_Err;
  56. #endif
  57.         
  58.         *val = IIC_RecvByte();                        //接收
  59.         IIC_NAck();                                                //产生一个非应答信号,代表读取接收
  60.         
  61.         IIC_Stop();                                                //停止信号
  62.         
  63.         return IIC_OK;

  64. }
复制代码


收藏 评论2 发布时间:2019-5-7 16:15

举报

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

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2 自问自答

查看全部评分

lrzxc111 回答时间:2019-5-8 20:19:49
嗯,谢谢分享解决之道
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版