Проблема, товарищи. Второй день бьюсь пальцами об клавиатуру, а хочется головой об стену.
Не могу заставить правильно работать связку AtMega32A и LM75A. Написал код для получения байта данных из датчика, все проверки сделал, а оно не работает... Точнее, прорабатывает до конца функции, но байт так и не возвращает. Да еще и виснет потом, если повторно запрос температуры сделать.
Вот код инициализации TWI:
Вот код самого запроса температуры:
Может мне кто помочь? На самом датчике линии SDA и SCL подтянуты резисторами к Vcc, по питанию установлен конденсатор.
Не могу заставить правильно работать связку AtMega32A и LM75A. Написал код для получения байта данных из датчика, все проверки сделал, а оно не работает... Точнее, прорабатывает до конца функции, но байт так и не возвращает. Да еще и виснет потом, если повторно запрос температуры сделать.
Вот код инициализации TWI:
Код: Выделить всё
void funcTWIInit(void) //Инициализация шины i2c
{
PORTC |= (1<<PC0)|(1<<PC1); //Внутренние подтягивающие резисторы
DDRC &= ~((1<<PC0)|(1<<PC1));
TWBR = 10; //Настройка скорости работы
TWSR = 0x00;
}
Код: Выделить всё
char funcGetTemperature()
{
//USART_Transmit('0');
uint8_t temp = 0x00;
//Формируем START
TWCR = (1<<TWEN) | (1<<TWINT) | (1<<TWSTA);
//Ждем ответа датчика
while (!(TWCR & (1<<TWINT)));
//Если START принят, то
if ((TWSR & 0xF8) == 0x08)
{
//USART_Transmit('1');
//Загружаем адрес для чтения
TWDR = 0x9F; //Адрес датчика 1001111 (0x4F) плюс бит чтения - 10011111 (0x9F)
//Отправляем пакет с адресом
TWCR=(1<<TWEN)|(1<<TWINT);
//Ждем ответа датчика
while (!(TWCR & (1<<TWINT)));
//Если адрес принят, то
if ((TWSR & 0xF8) == 0x40)
{
//USART_Transmit('2');
//Запрашиваем байт данных
TWCR=(1<<TWEN)|(1<<TWINT);
//Ждем ответа датчика
while (!(TWCR & (1<<TWINT)));
//Если данные получены, то
if ((TWSR & 0xF8) == 0x58)
{
//USART_Transmit('3');
//Читаем байт данных
temp = TWDR;
//Формируем STOP
TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTO);
}
}
}
return temp;
}
