单片机 MSP430 模拟IIC编程(2)

原创 2015年11月21日 10:21:20


示例
//////////////////////////////////////////////////

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状态来决定输出??


今天在网上找到如下的答案:



    众所周知,实现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寄存器,代码量减少了!


单片机 MSP430 模拟IIC编程(1)

20151121 以下附上的是模拟IIC通信模块程序,是我在TI官网提供的投影仪评估板例程中拿出来的,本人还没有验证,暂且认为他可以工作,估计下个星期就会去验证他,到时候再修改。 其实贴出这个程序...
  • luoyouren
  • luoyouren
  • 2015年11月21日 10:17
  • 1286

MSP430F249IIC

/****************************************************************** **                             ...
  • bmbm546
  • bmbm546
  • 2013年04月12日 10:37
  • 888

MSP430学习的第一个模拟I2C程序

模拟I2C
  • yhyhdl
  • yhyhdl
  • 2016年09月07日 20:24
  • 1333

msp430g2553模拟iic接口

  • 2014年08月24日 19:39
  • 5KB
  • 下载

msp430——软件模拟II2C实例

运行代码 复制代码   #include   #define   SDA              BIT1   #define   SCL              BIT2   ...
  • u011392772
  • u011392772
  • 2016年08月10日 23:24
  • 278

IIC介绍

I²C(Inter-Integrated Circuit)是内部整合电路的称呼,是一种串行通讯总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边装置而发展...
  • u012781002
  • u012781002
  • 2014年03月05日 11:19
  • 914

Proteus中MSP430与SHT11的IIC通信问题

调了两天,MSP430始终接收不到数据,一直以为是代码的问题,今天无意中看到别人的一片文章,才发现问题出在上拉电阻上。DATA线的上拉电阻不能太大,10k不行,换成了1k就没问题了。mark一下,顺便...
  • seumonkey
  • seumonkey
  • 2012年05月21日 12:31
  • 1495

MSP430F5438 I2C学习笔记——AT24C02

对于大多数单片机来说,I2C成了一个老大难问题。从51时代开始,软件模拟I2C成了主流,甚至到ARMCortex M3大行其道的今天,软件模拟I2C依然是使用最广的方法。虽然软件模拟可以解决所有的问题...
  • xukai871105
  • xukai871105
  • 2013年08月24日 23:06
  • 14536

单片机控制IIC协议EEPROM芯片24C512之模块化编程(持续更新中)

这里将我编写的STC12C5A60S2单片机控制EEPROM芯片AT24C512的程序共享一下,是希望前辈们给予斧正 。...
  • yagnruinihao
  • yagnruinihao
  • 2014年02月28日 18:09
  • 2263

模拟IIC移植

因工程需要,需要将stm32f103上的模拟IIC
  • yueguang_16
  • yueguang_16
  • 2014年09月02日 22:01
  • 771
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:单片机 MSP430 模拟IIC编程(2)
举报原因:
原因补充:

(最多只允许输入30个字)