【模拟IIC函数分析】为什么模拟IIC中的起始条件函数中,要先变化SDA电平,再变化CLK电平,接着变化SDA形成上升或下降沿,最后将CLK拉低?

        起始和终止条件函数默认了,在调用前SCL已经确保为0了,这样才能改变SDA,但是第一次起始条件较为特殊,我们初始化引脚默认为高电平空闲状态,此时SCL虽然未确保低电平,但是确保了SDA为高电平,这样保证了不会误判,因为SDA只能从高电平下降为低电平,为什么会这样?因为在第一次起始条件前,我们会默认其空闲状态(即SDA,CLK均为高电平),注意SDA,CLK都是确定值;而在后续的电平变化中,我们只能保证SCL在函数调用前确定为低电平,因为CLK是一直由主机控制的,也就是说,只有主机可以改变SCL的电平,从机不会;但是SDA就不一样了,在数据交换的过程中,主机会释放SDA的控制权,那么此时SDA的电平是由从机控制的,主机负责接收,也就是说,这个主机接收到的SDA电平,是不确定的,所以在主机每次发送命令或数据前,需要自己首先改变SDA的电平(SCL此时已提前置为低),然后再改变SCL,接着改变SDA,形成上升或下降沿,最后的最后一定不要忘了将SCL提前拉低,为下次的iic函数调用,做好铺垫。

        终止条件函数,(SCL此时已提前置为低)先拉低SDA,再拉高SCL,最后拉高SDA形成上升沿,终止IIC通讯。终止条件后,SCL,SDA都回归到高电平,即空闲状态。

关于SDA控制权变化的几个节点有:

  1. 主机发送从机读写地址命令后,释放SDA控制权(SDA拉高),等待从机应答信号。
  2. 主机发送完从机寄存器地址后,释放SDA控制权(SDA拉高),等待从机应答信号。
  3. 主机发送完一个字节后,释放SDA控制权(SDA拉高),等待从机应答信号。(这一条其实已涵盖了前两条)
  4. 主机接收完一个字节后,从机释放SDA控制权(SDA拉高),主机发送应答信号。(我们编写的是主机IIC函数,从机不用管)
  5. 在整个IIC通讯过程中,时钟信号CLK的控制权一直在主机手里,所以在主机的IIC函数中,函数退出前一定不要忘了将CLK提前拉低,为下次的iic函数调用,做好铺垫。(终止函数不用铺垫)
  6. 无论应答信号是0还是1,应答完都要放手,所以SDA还是高电平,所以不需要拉低SDA啊
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值