【问题标题】:I2C master transmitter using interrupt使用中断的 I2C 主发送器
【发布时间】:2016-05-23 21:43:40
【问题描述】:

我正在使用 atmega32 并尝试使用中断使主发送器,但它会导致无限跳转到中断,因为 TWINT(I2C 标志)总是在没有 I2C 操作时设置,并且仅在操作期间被清除,我该如何解决这个问题?

这里是主代码,它每秒增加 PORTD,当按下按钮时,它会将 PORTD 的当前状态发送到从机微控制器,并且发生中断并且 portb 增加 2,真正发生的是在发送start 信号它不断跳到中断(portb 不断增加)而不发送任何东西。

#define F_CPU 8000000UL
#include <avr/io.h>
#include<util/delay.h>
#include <avr/interrupt.h >

void i2c_master_init()
{TWSR=0;
TWBR=0x47;
TWCR=(1<<TWEN); 
}

void i2c_start()
{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
while((TWCR & (1<<TWINT))==0);  
}

void i2c_send(unsigned char data)
{
TWDR=data;
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWIE);  
}

void i2c_stop()
{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);   
}


ISR(TWI_vect)
{   PORTB+=2;                      // PORTB+=2 when an interrupt occurs

}


int main(void)
{
DDRD=0xff;
DDRB=0b11111110;
sei();
i2c_master_init();
i2c_start();
i2c_send(0b00000010);          //sending SLA+W


while(1)
{  
if((PINB & 1)==0)             //check if the button is pressed
{i2c_send(PORTD);         //send the current state of PORTD
while((PINB & 1)==0);     //wait until the button is released
}   
_delay_ms(1000);
PORTD++;                      //increment PORTD every second    
}

return 0;
}

【问题讨论】:

  • 设置为低电平有效?
  • 定义“无 I2C 操作”。你用的是哪个控制器?至少有 5 种不同类别的 AVR 控制器(32 位、8 位、汽车......)。你的问题很模糊。
  • 这个问题很可能是因为你的代码有错误。如果您想要比这更好的答案,事实证明您必须提供更多细节。
  • @Rev1.0 抱歉缺少细节,我正在使用 atmega32 ,没有操作只是意味着主机现在没有传输任何东西,在这种状态下 TWINT 被设置,因此中断连续发生,我在帖子里加了代码
  • @Lundin 抱歉缺少细节,我正在使用 atmega32,并在帖子中添加了代码

标签: c embedded avr


【解决方案1】:

在 AVR 中,当我激活中断时,标志会在跳转到 ISR 之前自动清除。

根据文档,该标志不会自动清除:

必须由软件通过向其写入逻辑 1 来清除 TWINT 标志。请注意,在执行中断程序时,该标志不会被硬件自动清除。另请注意,清除此标志会启动 TWI 的操作,因此必须在清除此标志之前完成对 TWI 地址寄存器 (TWAR)、TWI 状态寄存器 (TWSR) 和 TWI 数据寄存器 (TWDR)​​ 的所有访问。

即使 TWI 概念非常简单,但实施起来也并非一帆风顺。再看一下 ATMega32 数据表。那里详细解释了通信顺序。

另外请记住,您可以通过写入“1”来清除中断标志(设置为 0)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2018-06-20
    • 2015-08-14
    • 1970-01-01
    相关资源
    最近更新 更多