论坛风格切换切换到宽版
  • 4560阅读
  • 0回复

用LPT口模拟I2C总线的C源程序(转自21ic bbs) [复制链接]

上一主题 下一主题
离线BD7CE
 
发帖
1280
只看楼主 倒序阅读 0楼 发表于: 2002-12-08
在pc上用并行口模拟i2c总线的c源代码 (21icbbs-沈文)



  在微机上模拟i2c总线的设计中,用并行口的d0(pin2)模拟scl信号,用d1(pin3)模拟sda信号。根据iic总线的电平规范,程序如下:
  #include <dos.h>
  #include <stdio.h>
  #include <conio.h>
  #include <bios.h>

  #define delay_time 10
  #define false 0
  #define true 1
  const unsigned char scl_pin=0x01;
  const unsigned char sda_oin=0x02;

  static void set_scl(void)
  {
    asm{
        mov dx,0x378
        in ax,dx
        or ax,scl_pin         //将scl置1
        out dx,ax
    }
  }

  static void clr_scl(void)
  {
    asm{
        mov dx,0x378
        in ax,dx
        or ax,0xff-scl_pin     //将scl置0
        out dx,ax
    }
  }

  static void set_sda(void)
  {
    asm{
        mov dx,0x378
        in ax,dx
        or ax,sda_pin         //将sda置1
        out dx,ax
    }
  }

  static void clr_sda(void)
  {
    asm{
        mov dx,0x378
        in ax,dx
        or ax,0xff-sda_pin     //将sda置0
        out dx,ax
    }
  }

  void delay(int t=delay_time)     //延时子程序
  {
    for(int i=0;i<t;i++);
  }

  void iic_start(void)         //启动i2c总线
  {
    //在scl为高电平时,使sda出现一个负跳变
    set_sda();
    set_scl();
    delay();
    clr_sda();
    delay();
    clr_scl();
    delay();
  }

  void iic_stop(void)           //终止i2c总线
  {
    //在scl为高电平时,使sda出现一个正跳变
    clr_sda();
    set_scl();
    delay();
    set_sda();
    delay();
    clr_scl();
    delay();
  }

  void send_0(void)           //发送bit0
  {
    //在scl为高电平时,使sda保持低电平
    clr_sda();
    set_scl();
    delay();
    clr_scl();
    delay();
  }

  void send_1(void)           //发送bit1
  {
    //在scl为高电平时,使sda保持高电平
    set_sda();
    set_scl();
    delay();
    clr_scl();
    delay();
  }

  int check_acknowledge(void)
  {
    //发送完每个字节检查slave的应答信号
    set_sda();             //主器件释放sda线
    set_scl();
    delay(delay_time/2);
    unsigned char b=inportb(0x378);   //采样信号线
    delay(delay_time/2);
    clr_scl();
    delay();
    if(b&0xsda_pin)         //salve返回1
        return flase;
    return true;
  }

使用上述代码,你可以在pc上用并行口模拟i2c,进行实验、监控和调试。