IIC通讯在单片机开发中是比较常见的一种通讯协议,也有很多网友对其进行了详细分析,但是作者发现网友大多是对IIC进行理论上的讲解,很少有具体分析通讯内容,现在作者将以数字电位器(CAT5140)为实例为你讲解单片机如何通过IIC进行通讯。(数字电位器可以理解位一个滑动变阻器,RH为滑动变阻器上端,RL为滑动变阻器下端,RW为滑动端)。
第一步我们当然要读CAT5140的数据手册,对于IIC通讯的器件,我们重点关注如下信息:首先,自然是要看器件支持的通讯速度以及VCC电压范围,如图(1)我们就可以知道CAT5140最大支持400KHz的通讯速率,供电范围在2.5-5.5V。
图(1)器件资料
然后我们就要获取器件地址了,如图(2)我们就可以知道器件地址为0x50+读写位。
图(2)器件地址
获取器件地址后,我们便要根据器件的脚位描述来画线路图了,图(3)为器件脚位描述。
图(3)器件脚位描述
根据描述,可以得出如下线路图,SCL和SDA接单片机IIC通讯口即可。
图(4)器件连接图
画出线路图后,我们就要进行最后一步了,那就是驱动该器件。下面我们来看往CAT5140的寄存器地址(0x00)写数据的操作过程。可以看出整个过程复位9个步骤(有些器件是直接给时序图)。
写数据步骤
可以大致描述为:开始信号-写器件地址(0x50)-从机应答-写寄存器地址(0x00)-从机应答-写数据(0x1a)-从机应答-如需要重复写数据则重复6和7两个步骤即可-主机发送停止信号。
按照这个步骤我们就可以实现器件的驱动,如果出现问题,我们可以通过示波器或者逻辑分析仪抓取信号波形,如下图,只要逐步对比,就可以看出是哪个步骤出错了。
时序图1
时序图2
通过分析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(); //主机发送停止信号
}
举报/反馈

单片机技术交流站

468获赞 1971粉丝
分享单片机线路及学习方法
关注
0
0
收藏
分享