|
楼主 |
发表于 2005-8-25 14:13:30
|
显示全部楼层
我自己仿照Uart编程的方法编了个中断方式的程序,进行双机通讯的,如下,希望大家指点一下(代码片断)
#define Twi_ACK() (TWCR = (1<<TWEA)|(1<<TWINT)|(1<<TWEN)|(1<<TWIE))
#define Twi_NoACK() (TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWIE))
发送方:
/*======= TWI中断处理 ==============*/
SIGNAL (SIG_2WIRE_SERIAL)
{
switch(TW_STATUS)
{
case TW_START:
case TW_REP_START:
TWDR = SLA_W;
Twi_NoACK();
break;
case TW_MT_SLA_ACK:
if(twi_counter)
{
--twi_counter;
TWDR = twi_buf[twi_rd_index];
if(++twi_rd_index == TWI_BUF_SIZE) twi_rd_index = 0;
}
Twi_NoACK();
break;
case TW_MT_DATA_ACK:
if(twi_counter)
{
--twi_counter;
TWDR = twi_buf[twi_rd_index];
if(++twi_rd_index == TWI_BUF_SIZE) twi_rd_index = 0;
Twi_NoACK();
}
else
Twi_Stop();
break;
case TW_MT_SLA_NACK:
Twi_Stop();
break;
default:
Twi_Start();
break;
}
}
/*====== 往TWI口缓冲区中发送数据 =======*/
void PutTwiChar(uchar c)
{
while(twi_counter == TWI_BUF_SIZE);
cli();
//--------------------------------------------------------//////////
if(twi_counter);// ||((TWCR & _BV(TWINT)) == 0));////////// *******
//--------------------------------------------------------//////////
else
Twi_Start();
twi_buf[twi_wr_index] = c;
if(++twi_wr_index == TWI_BUF_SIZE) twi_wr_index = 0;
++twi_counter ;
sei();
}
接收方:
SIGNAL (SIG_2WIRE_SERIAL)
{
switch(TW_STATUS)
{
case TW_SR_SLA_ACK:
Twi_ACK();
break;
case TW_SR_DATA_ACK:
twi_buf[twi_wr_index] = TWDR;
++ twi_counter;
if(++twi_wr_index == TWI_BUF_SIZE) twi_wr_index = 0;
Twi_ACK();
break;
case TW_SR_STOP:
Twi_ACK();
break;
default:
Twi_ACK();
break;
}
}
单向的数据传输,用起来还可以(做显示用,用一个单片机负责显示,接收主机的数据),只是标注 ******* 的地方,可能不稳定。
if(twi_counter);// ||((TWCR & _BV(TWINT)) == 0))
如果把 ||((TWCR & _BV(TWINT)) == 0)) 这个条件加上,运行有些问题;如果不判断可能会在发送还没有完成时写入Start把数据损坏了,这个地方不是很确定,还请马老师指点一下。也就是说我的问题是在我发送数据还没有结束时(TWINT为低时)如果发送Start命令会不会冲了我正在发送的数据,串口会好像
-----此内容被c7140于2005-08-25,14:21:28编辑过 |
|