Проблема с использованием интерфейса 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));
но примеры кода вообще не имеют цикла.