|
twi(i2c)-интерфейс, обеспечение надежности передачи |
|
|
|
Nov 22 2007, 15:04
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
 |
Ответов
|
Nov 23 2007, 20:30
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
Сообщений в этой теме
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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|