I2C学习记录以及实验遇到的问题记录

i2c通信时产生的问题?

  1. i2c通信时无法产生时钟,SCL/SDA没有。
    可能原因:
    (1)先确定从机硬件的焊接和链接问题,SCL与模块上的引脚是通的是否存在虚焊,程序上也将外设的i2c时钟使能但是在逻辑分析仪上仍然没有时钟的脉冲信号
    (2)是否存在SCL与地短路的情况
    (3)I2C从机主动拉低SCL线在规范中是一个合法的行为,称之为Clock Stretching(时钟扩展,我一般叫他时钟同步)。
    通常是主机请求数据( 收或者发)后从机需要一些时间处理,且没有多余Buffer可以接收接或者提供接下来的数据的时候从机则会拉低SCL一段时间直到有新的数据准备好。
    SCL挂死(也就是前面所说一直拉低SCL)这种情况在标准I2C从器件上基本不会出现,因为只要芯片还在正常工作buffer总算有准备好的时候,自然就就释放SCL了。
    往往是使用MCU作为I2C从机时,程序设计上的问题导致MCU无法读取&填充buffer而导致,重点分析MCU I2C中断服务程序。
    (4)对于每一个接收设备(从设备,slaver),当它被寻址后,都要求在接收到每一个字节后产生一个响应。因此,the master device 必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。
    在这个脉冲期间,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。这表示该设备给出了一个ACK。如果它不拉低SDA线,就表示不响应(NACK)。
  2. 是否存在 i2c地址不对;有些平台的i2c地址需要右移一位,有些不需要。例如如果IO芯片的地址是0xDA, 那么你的函数里面可能需要使用使用(0xDA>>1)作为设备的地址?
    3.数据线输出的脉冲时乱序的。
    答:
    硬件的焊接出现问题会导致脉冲数据乱序。同时因为使用了两个外接电源,但是逻辑分析仪只有一个接地。另一个一直悬空,所以数据线的脉冲时序是乱的,无法正确得到数据脉冲。

学习记录:
从主机写入从机的值然后在读出所写入的值,以此证明主从机通信成功。
1.向slaver写一个寄存器地址过去。
2.读取slaver。就是这样两步,可是这样的想法在读取从机时却出现了问题,总是无法得到ACK一直是NAK。
上述两步我是通过这样的方法实现的:
1.调用i2c_Write_BOTTOM发送一个字节的数据(寄存器地址)过去。
2.调用i2c_READ_BOTTOM读取一个字节。完毕。
之所以这么做是基于这样的想法:当向slaver写入(发送)一个寄存器地址过去后,
slaver就会把当前的读写指针(假想的)指向这个寄存器,此后,读取的时候自然是读到这个寄存器的值了。
(i2c write是以ack+stop结束通信,而i2c read是以nack+stop结束通信的,原因如下:
i2c write的时候,master在写完最后一个字节之后slave会回ACK,然后master发送stop信号结束通信
i2c read的时候,master在接收完slave发送的最后一个字节之后会回NAK,因为这个时候master已经接收到足够的字节,NAK告诉slave不要在发送数据了。)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值