Перейти к содержанию
    

Зависает TWI

Первый раз имею дело с 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;
        }
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...