2013-02-13 2 views
0

Я пытаюсь получить доступ к модулю HMC5883L с помощью atmega2560. Я написал класс (I2C), содержащий основные методы, необходимые для связи I2C.Проблема с использованием интерфейса AVR TWI

Во-первых, я объясню проблему. Это то, что я сделал.

int main(){ 
    I2C i2c; //an object with basic I2C communication methods 

    i2c.init(); 
    i2c.start(); 
    i2c.sendSLAW(); 
    ... 
    i2c.write(...); 
    ... //configure registers, CRA, CRB, MR ... 
    i2c.stop(); 
    while (1) 
    { 
     i2c.start();   
     i2c.sendSLAR();  
      .... //read x,y,z register values 
     i2c.stop();  
      .... //say, display x,y,z readings 
     _delay_ms(500); 
    } 
} 

(Рассмотрим термины имеют свои обычные значения. Шинкованной = ОАС + W (Адрес ведомого + запись) ...)

Все идет хорошо, пока дело доходит до цикла. В петле, кажется, застрял на i2c.stop()

i2c.stop() реализован следующим образом;

void I2C::I2C_stop(){ 
    TWCR = (1<<TWINT)|(1<<TWSTO)|(1<<TWEN); 
    while (TWCR & (1<<TWSTO)); 
} 

Я сделал что-то не так? Как я могу это решить?

(Все остальные функции реализованы просто как в примерах технического описания.)

ответ

0
while (TWCR & (1<<TWSTO)); 

не выглядит правильно. Флаг TWSTO указывает на остановку, и вы правильно записываете ее для остановки. Но он остается равным 1, что создает бесконечный цикл. Во всяком случае, вам понадобится

while !(TWCR & (1<<TWSTO)); 

, но примеры кода не имеют петли вообще.

Смежные вопросы