мк AtMega88, датчик SHT21
Код
uint8_t TWI_Start(void){
TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTA);
uint32_t t=0;
while ( (TWCR & (1<<TWINT))==0 ) {if (--t==0) uart_puts("Zavis TWI STA\r");}
if (TWSR!=TWI_START)return 0;
return 1;
}
uint8_t TWI_Byte_Ask_Wr(uint8_t byte, uint8_t Ask, uint8_t Write){
if (Write) TWDR=byte;
uint8_t twcr;
if (Ask) twcr=(1<<TWEN)|(1<<TWINT)|(1<<TWEA);
else twcr=(1<<TWEN)|(1<<TWINT);
TWCR = twcr;
uint32_t t=0;
while ( (TWCR & (1<<TWINT))==0 ){if (--t==0) uart_puts("Zavis TWI TWI_Byte_Ask_Wr\r");};
return TWSR;
}
void sht21(void){//раз в 1мс
static uint8_t Time;
uint8_t Error=1;
switch (State)
{
case 0:
//TWI_Stop();//TWCR=_BV(TWEN)|_BV(TWINT);
TWCR=_BV(TWINT);
Time=30;
State++;
uart_puts("\rSt=0\r");
case 1:
if (--Time==0) {State++;uart_puts("St=1 End\r");}
Error=0;
break;
case 2:
if (TWI_Sta_AdrW_Cmd_Send(SOFT_RESET)){
TWI_Stop(); //STOP
Time=30;
Error=0;
State++;
uart_puts("St=2\r");
}
break;
case 3:
if (--Time==0) {State++;uart_puts("St=3 End\r");}
Error=0;
break;
//-----USER REGISTR READ--------
case 4:
if (TWI_Sta_AdrW_Cmd_Send(USER_REG_R)){//Command Read user reg
Error=0;
State++;
uart_puts("St=4\r");
}
break;
//USER REGISTR READ
case 5:
if (TWI_Start()){ //Start
if (TWI_Byte_Ask_Wr(I2C_ADR_R,NASK, 0)==TWI_MRX_ADR_ACK){ //Adress+Read
if (TWI_Byte_Ask_Wr(0,NASK, 0)==TWI_MRX_DATA_ACK) { //Read Data TWI
if (TWDR!=0b00000010) State++;
else {
TWI_Stop(); //STOP
State+=2;
uart_puts("Go St=7\r");
}
Error=0;
uart_puts("St=5\r");
}
}
}
break;
}
if (Error){
uart_puts("\rError");
State=0;
}
}
TWCR = (1<<TWEN)|(1<<TWINT)|(1<<TWSTA);
uint32_t t=0;
while ( (TWCR & (1<<TWINT))==0 ) {if (--t==0) uart_puts("Zavis TWI STA\r");}
if (TWSR!=TWI_START)return 0;
return 1;
}
uint8_t TWI_Byte_Ask_Wr(uint8_t byte, uint8_t Ask, uint8_t Write){
if (Write) TWDR=byte;
uint8_t twcr;
if (Ask) twcr=(1<<TWEN)|(1<<TWINT)|(1<<TWEA);
else twcr=(1<<TWEN)|(1<<TWINT);
TWCR = twcr;
uint32_t t=0;
while ( (TWCR & (1<<TWINT))==0 ){if (--t==0) uart_puts("Zavis TWI TWI_Byte_Ask_Wr\r");};
return TWSR;
}
void sht21(void){//раз в 1мс
static uint8_t Time;
uint8_t Error=1;
switch (State)
{
case 0:
//TWI_Stop();//TWCR=_BV(TWEN)|_BV(TWINT);
TWCR=_BV(TWINT);
Time=30;
State++;
uart_puts("\rSt=0\r");
case 1:
if (--Time==0) {State++;uart_puts("St=1 End\r");}
Error=0;
break;
case 2:
if (TWI_Sta_AdrW_Cmd_Send(SOFT_RESET)){
TWI_Stop(); //STOP
Time=30;
Error=0;
State++;
uart_puts("St=2\r");
}
break;
case 3:
if (--Time==0) {State++;uart_puts("St=3 End\r");}
Error=0;
break;
//-----USER REGISTR READ--------
case 4:
if (TWI_Sta_AdrW_Cmd_Send(USER_REG_R)){//Command Read user reg
Error=0;
State++;
uart_puts("St=4\r");
}
break;
//USER REGISTR READ
case 5:
if (TWI_Start()){ //Start
if (TWI_Byte_Ask_Wr(I2C_ADR_R,NASK, 0)==TWI_MRX_ADR_ACK){ //Adress+Read
if (TWI_Byte_Ask_Wr(0,NASK, 0)==TWI_MRX_DATA_ACK) { //Read Data TWI
if (TWDR!=0b00000010) State++;
else {
TWI_Stop(); //STOP
State+=2;
uart_puts("Go St=7\r");
}
Error=0;
uart_puts("St=5\r");
}
}
}
break;
}
if (Error){
uart_puts("\rError");
State=0;
}
}