在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,进行实验、监控和调试。