Проблема с использованием интерфейса AVR TWI

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

Сначала я объясню проблему. Это то, что я сделал.

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

(Считайте, что термины имеют их обычные значения. SLAW = SLA+W (Адрес ведомого + запись)...)

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

i2c.stop() реализован так;

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

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

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

1 ответ

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

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

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

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

Другие вопросы по тегам