реклама на сайте
подробности

 
 
> twi(i2c)-интерфейс, обеспечение надежности передачи
namelos
сообщение Nov 22 2007, 15:04
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Доброе время суток всем.
Разрабатываю систему измерения и контроля температуры на 36 датчиков, состоящую из 3 контроллеров(slaves) на 12 датчиков(опрос, контроль, вкл./выкл. реле) и контроллера(master) отображения информации на GLCD и ввода данных на рабочие контроллеры(запись в eeprom). Коммуникация главного контроллера осуществляется по twi(i2c)-интерфейсу.
Пока работаю с макеткой. Нашел bug при обрывaнии линии twi, зависает главный контроллер, т.к. TWI Interrupt не был обнулен, т.е не произошло нормального завершения передачи информации.
Вопрос такой, уважаемые эмбеддеры, для контроля работы twi обязательно использовать еще таймер, который при зависании квитирует Interrupt?
И еще, slaves посылают пакеты в 40 байт, обязательна ли при такой длине пакета crc проверка?
Заранее всем спасибо.

Сообщение отредактировал namelos - Nov 22 2007, 15:05
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
namelos
сообщение Nov 23 2007, 20:30
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 77
Регистрация: 4-08-06
Пользователь №: 19 324



Код

ISR (TWI_vect)
{
    static uint8_t twi_ptr_Buf;
    switch (TWSR)
      {
        // START or Repeated START has been transmitted
        case TW_START:  case TW_REP_START:       
            twi_ptr_Buf= 0;                     // Set buffer pointer to the TWI Address location
        
        // SLA+W or Data byte has been tramsmitted and ACK received
        case TW_MT_SLA_ACK: case TW_MT_DATA_ACK:      
            
            if (twi_ptr_Buf < twi_msgSize)
          {
                TWDR = twi_Buf[twi_ptr_Buf++];
                TWCR = (1<<TWEN)|                      // TWI Interface enabled
               (1<<TWIE)|(1<<TWINT)|               // Enable TWI Interupt and clear the flag to send byte
               (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|    //
               (0<<TWWC);
                      //  
          }
            else                    // Send STOP after last byte
          {
                twi_statusReg.lastTransmitOK = TRUE;   // Set status bits to completed successfully.
                TWCR = (1<<TWEN)|                        // TWI Interface enabled
               (0<<TWIE)|(1<<TWINT)|                  // Disable TWI Interrupt and clear TWINT the flag
               (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|    // Initiate a STOP condition.
               (0<<TWWC);                            
          }
      break;
        
        // Data byte has been received and ACK tramsmitted
        case TW_MR_DATA_ACK:      
          twi_Buf[twi_ptr_Buf++] = TWDR;
            // SLA+R has been tramsmitted and ACK received
            case TW_MR_SLA_ACK:      
      
            if (twi_ptr_Buf <(uint8_t) (twi_msgSize-1) )            // Detect the before last byte to NACK it.!!!!
          {
                TWCR = (1<<TWEN)|                             // TWI Interface enabled
               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
               (1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send ACK after reception
               (0<<TWWC);
                                                  
          }
            //Send NACK after next reception
            else                    
          {
                TWCR = (1<<TWEN)|                                 // TWI Interface enabled
               (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag to read next byte
               (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|           // Send NACK after reception
               (0<<TWWC);
                    
                                 //
          }    
          break;
        
        case TW_MR_DATA_NACK:     // Data byte has been received and NACK transmitted
          
            twi_Buf[twi_ptr_Buf] = TWDR;                    //here will be last byte saved
          twi_statusReg.lastReceiveOK = TRUE;          // Set status bits to completed successfully.
      
            TWCR = (1<<TWEN)|                          // TWI Interface enabled
             (0<<TWIE)|(1<<TWINT)|                  // Disable TWI Interrupt and clear the flag
             (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|       // Initiate a STOP condition. TWSTO reset
             (0<<TWWC);
        
            __asm__ volatile("nop");
            __asm__ volatile("nop");

            TWCR = (1<<TWEN)|                          // TWI Interface enabled
             (0<<TWIE)|(0<<TWINT)|                  // Disable TWI Interrupt and clear the flag
             (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|       // Initiate a STOP condition. TWSTO reset
             (0<<TWWC);
                                    //
      break;      
        
        case TW_MR_ARB_LOST:          // Arbitration lost
      TWCR = (1<<TWEN)|                                 // TWI Interface enabled
             (1<<TWIE)|(1<<TWINT)|                      // Enable TWI Interupt and clear the flag
             (0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)|           // Initiate a (RE)START condition.
             (0<<TWWC);
                                            //
      break;

        case TW_MT_SLA_NACK:      // SLA+W has been tramsmitted and NACK received
            case TW_MR_SLA_NACK:      // SLA+R has been tramsmitted and NACK received    
                case TW_MT_DATA_NACK:     // Data byte has been tramsmitted and NACK received
                        case TW_NO_INFO:          // No relevant state information available; TWINT = ”0”
                            case TW_BUS_ERROR:        // Bus error due to an illegal START or STOP condition
                                default:    
                            
                                twi_state = TWSR;      // Store TWSR and automatically sets clears noErrors bit.
                                                     // Reset TWI Interface
                          TWCR = (1<<TWEN)|                  // Enable TWI-interface and release TWI pins
                         (0<<TWIE)|(1<<TWINT)|              // Disable Interupt
                         (0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)|   // No Signal requests
                         (0<<TWWC);

                    //delay 100µs
                        _delay_ms (0.1);//100
                            TWCR = (1<<TWEN)|                          // TWI Interface enabled
                     (0<<TWIE)|(0<<TWINT)|                  // Disable TWI Interrupt and clear the flag
                     (0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)|       // Initiate a STOP condition. TWSTO reset
                     (0<<TWWC);
    }                      

}
инt main(void)
{
for(;;)
{

    if( !(TWCR & _BV(TWIE)) )
    {
            //Check if the last opeation was OK
        if(twi_statusReg.lastReceiveOK) // Last transmission competed successfully.
            twi_get_data_message ( );        
    
        twi_start_data_transceiver( ...);
    }        
}

}


добавил 2 нопа, стал обнуляться TWIE. Потом перестал обнуляться TWIE после ERROR- добавил delay. А сейчас повисает slave, он держит SCL на нуле. Разбираюсь пока. Всем спасибо большое за интерес к моей теме.

Сообщение отредактировал namelos - Nov 23 2007, 20:34
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- namelos   twi(i2c)-интерфейс   Nov 22 2007, 15:04
- - umup   да, TWI на АВР часто глухо виснет при замыканиях/о...   Nov 22 2007, 15:29
|- - defunct   Цитата(umup @ Nov 22 2007, 18:29) да, TWI...   Nov 22 2007, 17:23
- - namelos   Цитата(umup @ Nov 22 2007, 19:29) да, TWI...   Nov 22 2007, 15:41
|- - Dog Pawlowa   Цитата(namelos @ Nov 22 2007, 19:41) umup...   Nov 22 2007, 17:02
- - umup   defunct никак не могу понять - как отловить заверш...   Nov 22 2007, 20:08
|- - IgorKossak   Цитата(umup @ Nov 22 2007, 22:08) defunct...   Nov 22 2007, 20:37
- - namelos   Спасибо, defunct. A как насчет crc-проверки после ...   Nov 22 2007, 20:50
|- - defunct   Цитата(namelos @ Nov 22 2007, 23:50) A ка...   Nov 23 2007, 10:35
- - umup   IgorKossak а если нужно отловить момент завершения...   Nov 23 2007, 11:12
|- - defunct   Цитата(umup @ Nov 23 2007, 14:12) а если ...   Nov 23 2007, 11:29
|- - IgorKossak   Цитата(umup @ Nov 23 2007, 13:12) IgorKos...   Nov 23 2007, 13:43
- - namelos   Цитата(IgorKossak @ Nov 23 2007, 17:43) П...   Nov 23 2007, 18:16
|- - bodja74   Цитата(namelos @ Nov 23 2007, 21:16) А ка...   Nov 23 2007, 19:00
- - namelos   Цитата(bodja74 @ Nov 23 2007, 23:00) 3 Со...   Nov 23 2007, 19:34
|- - singlskv   Цитата(namelos @ Nov 23 2007, 22:34) Конт...   Nov 23 2007, 20:19
|- - bodja74   Цитата(namelos @ Nov 23 2007, 22:34) несо...   Nov 23 2007, 20:33
|- - bodja74   Все ,что может быть понято неправильно ,понимается...   Nov 23 2007, 21:16
- - namelos   Цитата(bodja74 @ Nov 24 2007, 00:33) Не п...   Nov 23 2007, 20:38
|- - bodja74   Цитата(namelos @ Nov 23 2007, 23:38) Код ...   Nov 23 2007, 20:46
- - namelos   Повторюсь, пакета данных. Если вы посмотрите на In...   Nov 23 2007, 20:52


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01382 секунд с 7
ELECTRONIX ©2004-2016