1520|0

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

单片机 MSP430 模拟IIC编程(2) [复制链接]

  • //////////////////////////////////////////////////  
  •   
  • void I2C_Master_Init(void)  
  • /**
  • * Initializes I2C. Makes SCL and SDA high.
  • */  
  • {  
  •     //bit banging  
  •     P3SEL &= ~(SCL | SDA);                    // Set GPIO function  
  •     P3OUT &= ~(SDA | SCL);  
  •   
  •     I2C_SetSCL_Low();  //although not required but want to make sure SCL is low when SDA goes high  
  •     I2C_SetSDA_High();  
  •     __no_operation();  
  •     I2C_SetSCL_High();  
  •     __no_operation();  
  • }  
  •   
  • //////////////////////////////////////////////////  
  • /* I2C SDA and SCL Lines */  
  • void I2C_SetSDA_High (void)  
  • {  
  •     P3DIR &= ~SDA;  
  • }  
  •   
  • //////////////////////////////////////////////////  
  • void I2C_SetSDA_Low (void)  
  • {  
  •     P3DIR |=  SDA;  
  • }  
  •   
  • //////////////////////////////////////////////////  
  • BOOL I2C_GetSDA_Input (void)  
  • {  
  •     return (P3IN & SDA ? 1 : 0);  
  • }  
  •   
  • //////////////////////////////////////////////////  
  • void I2C_SetSCL_High (void)  
  • {  
  •     P3DIR &= ~SCL;  
  • }  
  •   
  • //////////////////////////////////////////////////  
  • void I2C_SetSCL_Low (void)  
  • {  
  •     P3DIR |=  SCL;  
  • }  
  •   
  • //////////////////////////////////////////////////  
  • BOOL I2C_GetSCL_Input (void)  
  • {  
  •     return (P3IN & SCL ? 1 : 0);  
  • }  





对于以上的SCL,即IIC的时钟线的高低电平控制,我一开始恨不能理解:
时钟线的高低电平控制不应该直接PDIR设置为输出,然后控制POUT寄存器的0/1状态来决定输出??




今天在网上找到如下的答案:
file:///C:/Users/Administrator/Documents/My%20Knowledge/temp/aaaab7dc-7aaa-44fe-aeda-ac381f2664c0.jpg





    众所周知,实现I2C总线协议主要是控制SDA、SCL使其产生协议所规定各种时序。要控制P6.7、P6.6产生I2C总线要求各种时序,就要频繁使用到输入、输出以及方向寄存器。而要减少代码量,简化接口控制,最直接方法就是减少有关寄存器操作次数。要实现这一想法需要软硬件结合,充分利用I/O口特点以及I2C总线协议特点。



    仔细观察图3基本数据操作时序[1]可以发现:第一,I2C总线在无数据传输时均处于高电平状态;第二,SDA引脚是数据输入输出端,它状态变化最为复杂,控制它需要频繁使用P6IN、P6OUT、P6DIR三个寄存器。
  
    图2中R1、R2是上拉电阻,其阻值由选用I2C总线器件电器特性确定。在本文中这两个电阻不但起上拉作用,还有助于解决第一个问题。当P6.6、P6.7处于接收状态时,上拉电阻可以将该点电平拉升为VCC,从而确保总线空闲时有稳定高电平。  
     
    延续以上思路可以发现,方向寄存器相应位为输入时,就等于给I2C从器件发送了逻辑'1'。那么如何发送逻辑'0'呢?将对应方向控制位设为输出,然后输出寄存器相应位置为'0'就可以实现。再进一步,如果将输出寄存器对应为设为'0',只控制方向寄存器变化就可以发送两种逻辑电平。这样,在发送数据时只需要控制方向寄存器。对于SDA需要频繁切换输入输出状态特点,本方法可以减少15%左右代码量,并使程序更清晰。这样就为第二个问题找到了很好解决方法。


    综述:用上面的描述的方法操作模拟IIC时序,发送数据SCL/SDA只需要操作P6DIR寄存器,接收数据只需要操作P6IN/P6DIR寄存器,代码量减少了!


 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表