基于realtek 解决iic 时钟拉伸问题

**

解决 realtek 库函数方式实现出现的 iic clock strech 时钟拉伸问题

**
很多小伙伴应该都用过 iic 但是接触过时钟拉伸这个细节的估计不多
简单的说就是通信过程中主机每次控制时钟线的电平需要判断从机是否准备好
在拉高时钟脚时需先切换成输入状态判断从机是否拉低时钟脚
如果从机拉住时钟脚 说明从机没有准备就绪 主机不能强行拉高 需等待从机释放

用realtek当主控和某器件通信 发现偶现一些不正常的现象 抓取逻辑分析仪看数据有时钟脉冲不均匀的情况
在这里插入图片描述

于是用示波器抓取发现有时钟线半高的电平
在这里插入图片描述
realtek的初始化函数并没有一个给用户设置时钟拉伸最大等待从机就绪超时的地方
但是 iic 写函数和读函数都包含了一个变量I2C_TimeOut 从代码看就是起这个作用的

/**
  * \brief  Send data in master mode through the I2Cx peripheral.
  * \param  I2Cx: Select the I2C peripheral. \ref I2C_Declaration
  * \param  pBuf: Byte to be transmitted.
  * \param  len: Data length to send.
  * \return I2C_Status: The status of I2Cx. \ref I2C_Status
  */
I2C_Status I2C_MasterWrite(I2C_TypeDef *I2Cx, uint8_t *pBuf, uint16_t len)
{
   
   
    uint16_t cnt = 0;
    uint32_t time_out = I2C_TimeOut;
    I2C_Status abort_status = I2C_Success;

    /* Check the parameters */
    assert_param(IS_I2C_ALL_PERIPH(I2Cx));

    /* Write in the DR register the data to be sent */
    for (cnt = 0; cnt < len; cnt++)
    {
   
   
        if (cnt >= len - 1)
        {
   
   
            /*generate stop signal*/
            I2Cx->IC_DATA_CMD = (*pBuf++) | I2C_0X10_STOP;
        }
        else
        {
   
   
            I2Cx->IC_DATA_CMD = *pBuf++
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值