原创 ATmega8 TWI接口测试

2011-4-17 22:20 4619 13 14 分类: MCU/ 嵌入式

        最近用到了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             SLAVE_ADDRESS 0xA0//定义AVR从机地址

#define LEDon       PORTD|=(1<<PD5)
#define LEDoff      PORTD&=(~(1<<PD5))

unsigned char status = 0;

volatile unsigned char sendata = 0;
volatile unsigned char recdata = 0;

void System_Init(void);

int main(void)
{
    System_Init();
    sei();
    while(1)
    {
        switch(recdata)
        {
            case 0x55:
            {
                LEDon;
                sendata = 0x01;
                TWCR |= (1<<TWEA);
                break;
            }
            default:
            {
                LEDoff;
                break;
            }
        }   
    }
}

//中断服务函数

ISR(TWI_vect)

{
    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;   
}

程序说明:

  1.  关键字volatile,不要忽略,或者修改Makefile中的优化等级,否则可能造成参数无法传递。
  2.  程序中,没有对TWI数据传输过程中可能出现的一些错误状态进行处理,仅仅是简单测试。
  3.  TWI与I2C总线一样要加外部上拉电阻,或使能内部上拉电阻。
  4.  实际应用中,如不希望在命令解释过程中产生TWI中断,可清零TWEA位,将器件从总线中剥离

测试结果:





PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

yupin1ger_144042119 2012-8-22 16:44

hao
相关推荐阅读
用户1633380 2012-10-03 01:24
AD9通过Excel快速制作原理图符号
1.根据Datasheet中的器件引脚描述,制作元器件引脚表格,格式如下:   ObjectKind X1 Y1 Orientatio...
我要评论
1
13
关闭 站长推荐上一条 /3 下一条