_Diman_ 0 13 декабря, 2011 Опубликовано 13 декабря, 2011 · Жалоба Первый раз имею дело с TWI, наверно что то не так делаю.. Зависает здесь while ( (TWCR & (1<<TWINT))==0 ) {if (--t==0) uart_puts("Zavis TWI STA\r");} Функцию обрезал, что бы не захламлять код. Доходит до case 5:, там не получает ASK, идет на case 0 и виснет на TWI_Start() мк 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; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться