综合技术交流
直播中

ss

6年用户 8762经验值
擅长:电源/新能源 制造/封装 RF/无线
私信 关注
[经验]

单片机IIC通讯实例

`  IIC通讯在单片机开发中是比较常见的一种通讯协议,也有很多网友对其进行了详细分析,但是作者发现网友大多是对IIC进行理论上的讲解,很少有具体分析通讯内容,现在作者将以数字电位器(CAT5140)为实例为你讲解单片机如何通过IIC进行通讯。(数字电位器可以理解位一个滑动变阻器,RH为滑动变阻器上端,RL为滑动变阻器下端,RW为滑动端)。
  第一步我们当然要读CAT5140的数据手册,对于IIC通讯的器件,我们重点关注如下信息:首先,自然是要看器件支持的通讯速度以及VCC电压范围,如图(1)我们就可以知道CAT5140最大支持400KHz的通讯速率,供电范围在2.5-5.5V。
   1.png
  图(1)器件资料
  然后我们就要获取器件地址了,如图(2)我们就可以知道器件地址为0x50+读写位。
   2.png
  图(2)器件地址
  获取器件地址后,我们便要根据器件的脚位描述来画线路图了,图(3)为器件脚位描述。
   3.png
  图(3)器件脚位描述
  根据描述,可以得出如下线路图,SCL和SDA接单片机IIC通讯口即可。
   4.png
  图(4)器件连接图
  画出线路图后,我们就要进行最后一步了,那就是驱动该器件。下面我们来看往CAT5140的寄存器地址(0x00)写数据的操作过程。可以看出整个过程复位9个步骤(有些器件是直接给时序图)。
   5.png
  写数据步骤
  可以大致描述为:开始信号-写器件地址(0x50)-从机应答-写寄存器地址(0x00)-从机应答-写数据(0x1a)-从机应答-如需要重复写数据则重复6和7两个步骤即可-主机发送停止信号。
  按照这个步骤我们就可以实现器件的驱动,如果出现问题,我们可以通过示波器或者逻辑分析仪抓取信号波形,如下图,只要逐步对比,就可以看出是哪个步骤出错了。
  
  通过分析SDA和SCL的波形,与数据手册给出的步骤吻合,所以这个器件我们驱动成功。如有些器件给出的是时序图,那我们就直接对比时序图就好。
  如文章对你有帮助,欢迎关注作者,后面作者将为你推送更有价值的文章!如大家如有疑问,请把问题发到评论区,我们一起讨论。如各位路过的大佬有更好的方法,欢迎发到评论区分享给大家,谢谢~~
  //附上参考程序
  //addr 器件地址
  //RegAddr 寄存器地址
  //dat 写入寄存器的数据
  void IIC_SendOneByte(u8 addr,u8 RegAddr,u8 dat)
  {
  u8 i = 0;
  IIC_Init();
  IIC_Start();
  for(i=0;i《8;i++)
  {
  if(addr & 0x80)
  SDA = 1;
  else
  SDA = 0;
  NOP(2);
  SCL = 1;
  NOP(4);
  SCL = 0;
  addr 《《= 1;
  }
  IIC_WateACK(); //等待从机应答
  NOP(8);
  for(i=0;i《8;i++)
  {
  if(RegAddr & 0x80)
  SDA = 1;
  else
  SDA = 0;
  NOP(2);
  SCL = 1;
  NOP(8);
  SCL = 0;
  RegAddr 《《= 1;
  }
  IIC_WateACK(); //等待从机应答
  NOP(16);
  SCL = 0;
  NOP(16);
  // SDAM = 0;
  for(i=0;i《8;i++)
  {
  if(dat & 0x80)
  SDA = 1;
  else
  SDA = 0;
  NOP(4);
  SCL = 1;
  NOP(8);
  SCL = 0;
  NOP(4);
  dat 《《= 1;
  }
  IIC_WateACK(); //等待从机应答
  IIC_Stop(); //主机发送停止信号
  }

` 6.png

更多回帖

发帖
×
20
完善资料,
赚取积分