本帖最后由 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;
- }
复制代码
|
开始带着F1的硬件iic思路去做,发现不行,应该是少设置了些参数。后来吧HAL库里边的i2c读写代码的核心部分抠出来,在LL库里边找相同功能的接口替换,就可以用了
评分
查看全部评分