|
我用M16做主机,M8做从机(M8中断方式正常),当M16不使用中断方式正常。使用中断方式出现怪异的结果
以下是我的测试程序(节选)
int main(void)
{
// 设波特率为9600
Init_UART(51);
// 设置看门狗
wdt_enable(WDTO_60MS);
// 允许睡眠模式
set_sleep_mode(0);
// TCCR0分频64
TCCR0 = 0x03;
// 开定时器0中断
//sbi(TIMSK,TOIE0);
// 设置TWI
TWBR = (CPU_CLOCK/SCL_CLK-16)/2;
PORTC |= 0x03;
// 允许全局中断
sei();
print("Start
");
gcSignal = 0;
TWI_TxHead = 0;TWI_RxHead = 0;TWI_TxTail = 0;TWI_RxTail = 0;
unsigned char ascii[3] = {0,0,0};
while(1)
{
wdt_reset();
if(bit_is_set(gcSignal, UART_RECEIVED))
{
cbi(gcSignal, UART_RECEIVED);
TransmitByte(UART_RxBuf[UART_RxHead]);print("
"); //回显
TWI_Send_Byte(UART_RxBuf[UART_RxHead]);
UART_RxHead = (UART_RxHead + 1) & UART_RX_BUFFER_MASK;
}
if(bit_is_set(gcSignal, TWI_RECEIVED))
{
cbi(gcSignal, TWI_RECEIVED);
print("TWSR = ");char_to_ascii(gcTWSR, ascii);print(ascii);print("
");
switch(gcTWSR)
{
case TW_START: //0x08
if(gcTWI_State == TWI_START)
{
gcTWI_State = TWI_SLA_W;
TWDR = 0x02 | TW_WRITE;
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
}
break;
case TW_REP_START: //0x10
if(gcTWI_State == TWI_START)
{
gcTWI_State = TWI_SLA_W;
TWDR = 0x02 | TW_WRITE;
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
}
break;
case TW_MT_SLA_ACK: //0x18
if(gcTWI_State == TWI_SLA_W)
{
gcTWI_State = TWI_DATA_W;
TWI_TxTail = (TWI_TxTail + 1) & TWI_TX_BUFFER_MASK;
TWDR = TWI_TxBuf[TWI_TxTail];
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
}
break;
case TW_MT_SLA_NACK: //0x20
if(gcTWI_State == TWI_SLA_W)
{
gcTWI_State = TWI_DATA_W;
TWI_TxTail = (TWI_TxTail + 1) & TWI_TX_BUFFER_MASK;
TWDR = TWI_TxBuf[TWI_TxTail];
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
}
break;
case TW_MT_DATA_ACK: //0x28
if(gcTWI_State == TWI_DATA_W)
{
gcTWI_State = TWI_STOP;
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWSTO);
}
break;
case TW_MT_DATA_NACK: //0x30
if(gcTWI_State == TWI_DATA_W)
{
gcTWI_State = TWI_STOP;
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWSTO);
}
break;
case TW_MR_SLA_ACK: //0x40
break;
case TW_MR_SLA_NACK: //0x48
break;
case TW_MR_DATA_ACK: //0x50
break;
case TW_MR_DATA_NACK: //0x58
break;
case TW_NO_INFO: //0xF8
break;
default:
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWSTO);
}
}
}
}
SIGNAL(SIG_UART_DATA)
{
/* check if all data is transmitted */
if(UART_TxHead != UART_TxTail )
{
/* calculate buffer index */
UART_TxTail = (UART_TxTail + 1) & UART_TX_BUFFER_MASK;
UDR = UART_TxBuf[UART_TxTail]; /* start transmition */
}
else cbi(UCSRB,UDRIE); // disable UDR interrupt
}
SIGNAL(SIG_UART_RECV)
{
unsigned char cReceivedByte;
cReceivedByte = UDR;
UART_RxBuf[UART_RxTail] = cReceivedByte;
UART_RxTail = (UART_RxTail + 1) & UART_RX_BUFFER_MASK;
sbi(gcSignal, UART_RECEIVED);
}
SIGNAL(SIG_2WIRE_SERIAL)
{
gcTWSR = TWSR;
sbi(gcSignal, TWI_RECEIVED);
}
-----此内容被Tomcat于2005-05-22,12:11:12编辑过
-----此内容被Tomcat于2005-05-22,12:40:36编辑过 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|