您当前的位置:五五电子网电子知识单片机-工控设备ARM单片机并口模拟IIC的经验之谈 正文
并口模拟IIC的经验之谈

并口模拟IIC的经验之谈

点击数:7550 次   录入时间:03-04 11:52:37   整理:http://www.55dianzi.com   ARM单片机
的运算(用以获得13 脚电平状态,即打印机状态寄存器的位 4 的值),判断该变量是否为0,最后将判断结果
移入另外的一个用于存放‘已读取数据'的变量中,完成读取一位数据的操作,用写端口函数使SCL为低电平,
在下一个SCL的上升沿,同样用上面的方法将一位数据加入‘已读取数据'变量中。可用while循环控制要读的
位数和字节数。注意以上过程都是在 T1 为截止态时进行的。

主机(并口)接收应答:接收应答用于写 I2C 时,每写一字节数据到从机后,如果操作成功,从机在下一
个时钟内使 SDA 为低。主机查询应答可以加强操作的可靠性。接收应答和上面说的接收数据大致相同,只是仅 接收一位数据并且不存储,直接判断其值是否为 0,不为 0 时(即没有收到应答)转错误处理程序,为 0则继
续后面的操作。在实际编程时将这个步骤合并到写I2C的操作中。

有关延时:I2C器件对SDA和SCL上的高、低电平信号需保持的时间是有规定的。如:开始信号的高、低电平
要保持多长时间,数据信号的高、低电平最低要保持多长时间等。不同的器件对这个时间有不同的规定。查找
24LO02的数据手册,可以知道,它在不同的电压下对各信号要保持的时间分别在几百纳秒到几微秒之间。这个
时间也体现了I2C器件的读写速度。因为计算机的速度不同,要用计算机并口来模拟I2C很难将这个时间精确到
微秒。为了能够在不同的计算机上可靠的操作I2C总线,试验程序用了C语言的延时函数delay();这个函数能产
生的最小延时为1毫秒。虽然这样做降低了I2C的读写速度,但可以保证操作的可靠性。

程序代码:

/***************************************/
//控制的地址是0x378
//SDA信号: PIN13 模拟作为主机的输入;
//                PIN3 模拟作为主机的输出;
//SCL信号: PIN15 模拟作为主机的输入;
//                PIN5 模拟作为主机的输出;
/***************************************/
/*************************************/
//函数名称:IIC start 函数
//开始信号:在时钟线(SCL)为高电平其间,
//数据线(SDA)由高变低,将产生一个开始信号。
/*************************************/
void port2iicbase::i2c_start()
{
SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
delay(1);
SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
delay(1);
SetPortVal(PORT1,0x0d,1);/*scl 1, sda 0*/
delay(1);
SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
return;
}
/*************************************/
//函数名称:IIC stop 函数
//停止信号:在时钟线(SCL)为高电平其间,
//数据线(SDA)由低变高,将产生一个停止信号
/*************************************/
void port2iicbase::i2c_stop()
{
SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
delay(1);
SetPortVal(PORT1,0x0d,1);/*scl 1, sda 0*/
delay(1);/***/
SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
delay(1);/**/
SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
}
/*************************************/
//函数名称:IIC 写一个字节函数
/*************************************/
int port2iicbase::i2c_writebyte(char c)
{
short int count=7;
char temp;
DWORD dwPortVal;
char e;

while(count>=0)
{
   temp=c>>count;
   temp=temp<<7;          //确定传输的字节
   if (temp=='\x80')      //传输"1"
   {
    SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
    delay(1);
    SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
    delay(1);
    SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
    delay(1);
    SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
    delay(1);
   }
   else                   //传输"0"
   {
    SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
    delay(1);
    SetPortVal(PORT1,0x0d,1);/*scl 1, sda 0*/
    delay(1);
    SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
    delay(1);
   }
   count--;
}
/**ask**/
SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
delay(1);/***/
SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
delay(1);
// SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
// delay(1);/***/

GetPortVal(PORT2, &dwPortVal, 1);
e = (char)dwPortVal;
temp=e>>4;
temp=temp<<7;

if (temp=='\x0')
   return 0;
else
   MessageBox(NULL,"Not AcknowLEDge!!","发送错误",MB_OKCANCEL);
return 1;
}
/*************************************/
//函数名称:IIC 读一个字符函数
/*************************************/
char port2iicbase::i2c_readbyte()
{
unsigned short count=8;
char d,e,f='\x0';
DWORD dwPortVal;

while(count>0)
{
   SetPortVal(PORT1,0x07,1);/*scl 0, sda 1*/
   delay(1);/***/
   SetPortVal(PORT1,0x0f,1);/*scl 1, sda 1*/
   delay(1);

   GetPortVal(PORT2, &dwPortVal, 1);
   e = (char)dwPortVal;
   d=e>>4;
   d=d<<7;

   if(d=='\x80')
    d='\x1';
   f=f<<1;
   f=(f+d);                  //组合成字节
   count--;
}
return f;
}
/*************************************/
//函数名称:主机(并口)的发送应答
/*************************************/
void port2iicbase::i2c_ask()
{
SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
delay(1);/**/
SetPortVal(PORT1,0x0d,1);/*scl 1, sda 0*/
delay(1);
SetPortVal(PORT1,0x05,1);/*scl 0, sda 0*/
delay(1);
}

//////////////////////////////////
//发送数据按钮
/////////////////////////////////
void Cport2iicdlg1::OnWriteok()
{
// TOD Add your control notification handler code here
port2iicbase port2iic;
char s[100];
char temp[3];
int len;
int i;
char m_cValue;
unsigned int WriValue=0;
int time = 0;

unsigned short c;
char d,e;

#ifdef _PORT2IIC
SetDlgItemText(IDC_WRITE_STATUS,"正在发送....");
GetDlgItem(IDC_EDIT_WRITE)->GetWindowText(s, 100);
len = strlen(s);
c = len/2;
e='\x0';
d='\x0';
i = 0;
c = 5;
//写一页
//启动开始信号;
port2iic.i2c_start();
//发送控制信息
//"\xa0" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 0 写
//"\xa1" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 1 读
port2iic.i2c_writebyte('\xa0');
//发送地址
port2iic.i2c_writebyte(e);
while(c>0)
{
   temp[0] = s[i];
   temp[1] = s[i+1];
   temp[2] = 0x0;
   sscanf(temp,"%x",&WriValue);
   m_cValue = (char)WriValue;
   port2iic.i2c_writebyte(m_cValue);
   c = c-1;
   i+=2;
}
port2iic.i2c_stop();
#if 0
//24c01 写128个字节,调试写16个字;
c=20;
e='\x0';
d='\x0';
while(c>0)
{
   //启动开始信号;
   port2iic.i2c_start();
   //发送控制信息
   //"\xa0" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 0 写
   //"\xa1" = 1010(A2)(A1)(A0)(R/W) 其中(R/w) = 1 读
   port2iic.i2c_writebyte('\xa0');
   //发送地址
   port2iic.i2c_writebyte(e);
   port2iic.i2c_writebyte(d);
   port2iic.i2c_stop();
   d = c/5;
   c = c-1;
   e = e+1;
}
Sleep(50);
//任意读;
//读写入的数据
b = 0;
i = 0;

上一页  [1] [2] [3]  下一页


本文关键字:暂无联系方式ARM单片机单片机-工控设备 - ARM单片机

《并口模拟IIC的经验之谈》相关文章>>>