Код: Выделить всё
void WaitTWI(uint8_t step)
{
//Step/error code
DisplayTemp(50+step);
while (!(TWCR & (1<<TWINT)));
}
int8_t LM75_ReadTemp(void)
{
uint8_t lm_hi, lm_lo;
//Turn on internal pull-up
DDRC&=~((1<<PC4) | (1<<PC5));
PORTC=(1<<PC4) | (1<<PC5);
TWSR=0;
//100KHz SCL
TWBR=32;
//START
TWCR=(1<<TWEN) | (1<<TWSTA) | (1<<TWINT);
WaitTWI(1);
//SLA+R
TWDR=SENSOR_ADDR | TWI_READ;
TWCR=(1<<TWEN) | (1<<TWINT);
WaitTWI(2);
if (TWSR!=TWI_SLA_SUCCESS)
return LM75_ERROR; //No device or device error
//1st read + ACK
TWCR=(1<<TWEN) | (1<<TWEA) | (1<<TWINT);
WaitTWI(3);
lm_hi=TWDR;
//2nd read + NACK
TWCR=(1<<TWEN) | (1<<TWINT);
WaitTWI(4);
lm_lo=TWDR;
//STOP
TWCR=(1<<TWEN) | (1<<TWSTO) | (1<<TWINT);
WaitTWI(5); //<--- HANGS HERE
//Turn TWI off
TWCR=0;
return (int8_t)(((((uint16_t)lm_hi << 8) | (uint16_t)lm_lo) >> 5)/8);
}
Подтяжка на линиях SDA/SCL 2K, пробовал с внутренними резисторами порта. Пробовал два экземпляра LM75A.
Лыжи определенно не едут, так что взываю к бывалым людям.
