最近用到了ATmega8单片机的TWI接口。AVR单片机作为从机,通过TWI接口接收STM32的指令,并返回数据。用到了ATmega8的两种工作模式:从机接收模式和从机发送模式。用Proteus进行了一下简单的仿真,TWI主机发送0x55,点亮LED,从机返回数据0x01;TWI主机发送 其它数据时,LED处于熄灭状态。电路图如下:
测试代码(gcc):
#include <avr/interrupt.h>
#include <avr/io.h>
#include <util/twi.h>
#define LEDon PORTD|=(1<<PD5)
#define LEDoff PORTD&=(~(1<<PD5))
volatile unsigned char sendata = 0;
volatile unsigned char recdata = 0;
int main(void)
{
System_Init();
sei();
while(1)
{
switch(recdata)
{
case 0x55:
{
LEDon;
sendata = 0x01;
TWCR |= (1<<TWEA);
break;
}
default:
{
LEDoff;
break;
}
}
}
}
//中断服务函数
{
status = TW_STATUS;
switch(status)
{
/* Slave RX */
case TW_SR_SLA_ACK:
break;
case TW_SR_DATA_ACK:
recdata = TWDR;
break;
case TW_SR_STOP:
//TWCR &= (~(1<<TWEA));
break;
/* Slave TX */
case TW_ST_SLA_ACK:
TWDR = sendata;
break;
case TW_ST_DATA_ACK:
break;
case TW_ST_LAST_DATA:
break;
default :
break;
}
TWCR |= (1<<TWINT);
}
//系统初始化函数
void System_Init(void){
DDRD |= (1<<DDD5);
DDRC &= (~((1<<DDC4)|(1<<DDC5)));
PORTC |= ((1<<PC4)|(1<<PC5));
TWAR |= (SLAVE_ADDRESS&0xFE);
TWCR |= (1<<TWEA);
TWCR |= (1<<TWEN);
TWCR |= (1<<TWIE);
LEDoff;
}
程序说明:
测试结果:
yupin1ger_144042119 2012-8-22 16:44