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

 
 
> Помогите советом. I2C, Мож кто сталкивался.
SasaVitebsk
сообщение Jun 17 2007, 13:20
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



У меня есть в устр-ве шина I2C. На ней сидит мастер - atmega640(I2C софтовый) пару микрух памяти 24с512 и atmega48(I2C аппаратный слэйв). Всё это подпёрто резисторами 3.9кОм. Общая протяжённость шины составляет ~30см.

Изначально работал побайтно с 24с512 и блоком с mega48. Всё работало суперустойчиво. Сутками. Ни единого сбоя. С какого-то момента я попытался значительно повысить скорость на чтение (а заодно на запись) с 24с512. Для этого я ввёл буфер на 32 байта и начал писать/читать блоками по 32 байта. В принципе всё работает, но периодически возникают сбои. Я выяснил. Сбои возникают как при чтении, так и при записи. Их характер - случайный и хаотический. Создаётся ощущение, что сбои - результат помех. Увеличение задержек - не дало результата.

Может кто сталкивался с чем-нибудь подобным и может подсказать? Пока не знаю куда рыть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Jun 18 2007, 22:42
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Код

//Инициализация порта TWI
void TWI_Init(void)
{
  TWI_DDR &= ~(1<<SDA);                                    // SDA на ввод
  TWI_PORT |= (1<<SDA);                                    // подпереть
  TWI_DDR &= ~(1<<SCL);                                    // SCL на ввод
  TWI_PORT |= (1<<SCL);                                    // подпереть
  TWCR=TWI_OK;                                            // Режим Slave
}


Код
#pragma    vector=TWI_vect                                    // I2C
__interrupt    static void    i2c(void)
{
uint8_t    static  AdrStatus;                            // Смещение внутри структуры

switch(TWSR & 0xF8){
  case TWI_ADDR_W:                                        // Приняли свой адрес
    Flag.ErrIIC=0;
    Flag.AdrIIC=1;
    break;
  case TWI_DATA_W:                                        // Читаем Адрес структуры или саму структуру (Установка времени)
    if(Flag.AdrIIC){                                    // Читаем Адрес структуры
      Flag.AdrIIC=0;                                    // Сбросили признак
      AdrStatus=TWDR & 0x1f;                            // установить смещение
    }
    else{                                                // Читаем саму структуру (Установка времени)
      if(AdrStatus>13){
        AdrStatus=0;                                    // Игнорировать ошибки
        break;                                            // Недопустить запись в область ячеек памяти
      }
      *(&Status.Year+AdrStatus++)=TWDR;                    // Записать и перейти на следующий
      Flag.SetDay=1;                                    // Был установлен день
    }
    break;
  case TWI_WP:                                            // Стоп или повторный старт
  case TWI_STOP:                                        // Стоп
  case TWI_A_STOP:                                        // Стоп
    if(Flag.SetDay){                                    // Если было установлено время, то
       LastDay=LastDayOfMonth[Status.Month];            // Определим последний день месяца
       Flag.SetDay=0;                                    // Сбросить признак
    }
    break;
  case TWI_ADDR_R:                                        // Читаем
  case TWI_DATA_R:                                        // Читаем
    TWDR= *(&Status.Year+AdrStatus++);                    // Прочитать и перейти на следующий
    if(AdrStatus>13)AdrStatus=0;                        // Игнорировать ошибки
    break;
  default: Flag.ErrIIC=1;                                // Иначе ошибка
}
TWCR=TWI_OK;                                            // Подтвердить приём
}


Код
//==== I2C =====
  TWAR=0x16;                                            // Адрес Slave = 16/17


Код
#define FCLK            8000000                    // Частота контроллера
#define TCLK            125                        // Частота контроллера в нс

#define VERSIJA            0x18                    // Версия ПО 1.8

#define INT0            2                        // Нога INT0
#define INT0_PIN        PIND                    // Порт INT0

//========================================
//======== TWI ===========
#define TWI_ADDR_W        0x60                    // Передача "Адрес + W"
#define TWI_DATA_W        0x80                    // Передача "Записать данные"
#define TWI_WP            0xa0                    // Передача "Записать данные и стоп"

#define TWI_ADDR_R        0xa8                    // Передача "Адрес + R"
#define TWI_DATA_R        0xb8                    // Передача "Читать данные"
#define TWI_STOP        0xc0                    // Передача "Читать стоп"
#define TWI_A_STOP        0xc8                    // Передача "Читать стоп"

#define TWI_OK            0xc5                    // Подтверждение приёма

#define SDA                0x4                        // Линия порта SDA
#define SCL                0x5                        // Линия порта SCL
#define TWI_PORT        PORTC                    // Порт I2C
#define TWI_DDR            DDRC                    // Порт I2C

#define PWR_BAT            0x1                        // Включение батарейного питания
#define BAT_PORT        PORTC                    // Порт включения батарейного питания
#define    PWR_BAT_ON        BAT_PORT |=    (1<<PWR_BAT)// Подключить батарейку
#define    PWR_BAT_OFF        BAT_PORT &= ~(1<<PWR_BAT)// Выключить батарейку
Go to the top of the page
 
+Quote Post
defunct
сообщение Jun 18 2007, 23:37
Сообщение #3


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(SasaVitebsk @ Jun 19 2007, 01:42) *
default: Flag.ErrIIC=1;

На первый взгляд никакого криминала нет.

По дефолту попробуйте сделать переинициализацию шины
TWCR = (1 << TWIE); // twen - 0
TWDR = 0;
TWAR = SLAVE_ADDRESS;
TWCR = (1 << TWEN) | (1 << TWIE) | (1 << TWINT) | (1 << TWEA);

(и конечно же под отладкой поставить точку останова на default case и посмотреть когда туда попадает)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- SasaVitebsk   Помогите советом. I2C   Jun 17 2007, 13:20
- - singlskv   Цитата(SasaVitebsk @ Jun 17 2007, 17:20) ...   Jun 17 2007, 13:37
- - zltigo   То:singlskv - насточтельная просьба избегать совер...   Jun 17 2007, 14:04
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 18:04) То:si...   Jun 17 2007, 14:18
|- - zltigo   Цитата(singlskv @ Jun 17 2007, 17:18) Ну ...   Jun 17 2007, 16:40
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 20:40) У LPC...   Jun 17 2007, 16:46
|- - zltigo   Цитата(singlskv @ Jun 17 2007, 19:46) Ну ...   Jun 17 2007, 17:00
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 21:00) Никак...   Jun 17 2007, 17:24
|- - zltigo   Цитата(singlskv @ Jun 17 2007, 20:24) но ...   Jun 17 2007, 18:13
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 22:13) Норма...   Jun 17 2007, 18:44
||- - zltigo   Цитата(singlskv @ Jun 17 2007, 21:44) ......   Jun 17 2007, 18:53
||- - singlskv   Цитата(zltigo @ Jun 17 2007, 22:53) А чег...   Jun 17 2007, 19:31
||- - zltigo   Цитата(singlskv @ Jun 17 2007, 22:24) ......   Jun 17 2007, 19:36
|- - singlskv   Цитата(zltigo @ Jun 17 2007, 22:13) Норма...   Jun 17 2007, 18:58
|- - zltigo   Цитата(singlskv @ Jun 17 2007, 21:58) есл...   Jun 17 2007, 19:14
- - SasaVitebsk   Экспериментировал от 1МГц до 100кГц. На высоких ск...   Jun 17 2007, 16:15
|- - singlskv   Цитата(SasaVitebsk @ Jun 17 2007, 20:15) ...   Jun 17 2007, 16:33
- - bodja74   А софтовый I2C следит за SCL при растяжке ACK слей...   Jun 17 2007, 17:04
|- - SasaVitebsk   Цитата(bodja74 @ Jun 17 2007, 20:04) А со...   Jun 17 2007, 18:54
|- - Dog Pawlowa   Цитата(SasaVitebsk @ Jun 17 2007, 21:54) ...   Jun 17 2007, 20:38
- - SasaVitebsk   Я, к примеру, совершенно не удивился сообщению zlt...   Jun 17 2007, 20:23
|- - zltigo   Цитата(SasaVitebsk @ Jun 17 2007, 23:23) ...   Jun 17 2007, 20:38
|- - SasaVitebsk   Цитата(zltigo @ Jun 17 2007, 23:38) Увы, ...   Jun 17 2007, 20:46
|- - zltigo   Цитата(SasaVitebsk @ Jun 17 2007, 23:46) ...   Jun 17 2007, 21:19
|- - SasaVitebsk   Цитата(zltigo @ Jun 18 2007, 00:19) Можно...   Jun 17 2007, 21:55
|- - zltigo   Цитата(SasaVitebsk @ Jun 18 2007, 00:55) ...   Jun 17 2007, 22:21
|- - SasaVitebsk   Цитата(zltigo @ Jun 18 2007, 01:21) Да, п...   Jun 17 2007, 23:18
|- - defunct   Цитата(SasaVitebsk @ Jun 18 2007, 02:18) ...   Jun 17 2007, 23:51
|- - Dog Pawlowa   Цитата(SasaVitebsk @ Jun 18 2007, 02:18) ...   Jun 18 2007, 07:24
|- - zltigo   Цитата(SasaVitebsk @ Jun 18 2007, 02:18) ...   Jun 18 2007, 07:37
|- - SasaVitebsk   Цитата(zltigo @ Jun 18 2007, 10:37) Нет, ...   Jun 18 2007, 08:43
|- - defunct   Цитата(zltigo @ Jun 18 2007, 10:37) Какой...   Jun 18 2007, 11:04
|- - zltigo   Цитата(defunct @ Jun 18 2007, 14:04) в пр...   Jun 18 2007, 12:21
|- - defunct   Цитата(zltigo @ Jun 18 2007, 15:21) (а ме...   Jun 18 2007, 22:06
- - SasaVitebsk   Кое что прояснилось. Буду, конечно ещё дальше копа...   Jun 18 2007, 21:35
- - singlskv   1. нужно обязательно добавить обработку состояния ...   Jun 18 2007, 23:57
- - mrcashe   Кстати говоря, на такой шине при поллинге надо обя...   Jun 19 2007, 04:54
|- - SasaVitebsk   Цитата(mrcashe @ Jun 19 2007, 07:54) Кста...   Jun 19 2007, 08:19
|- - singlskv   Цитата(SasaVitebsk @ Jun 19 2007, 12:19) ...   Jun 19 2007, 08:41
- - SasaVitebsk   Всем спасибо за участие. В любом случае я узнал но...   Jun 30 2007, 00:37
|- - defunct   Цитата(SasaVitebsk @ Jun 30 2007, 03:37) ...   Jun 30 2007, 01:07
|- - Dog Pawlowa   Цитата(SasaVitebsk @ Jun 30 2007, 03:37) ...   Jun 30 2007, 04:15
- - sensor_ua   ЦитатаМожно работать с массивами и указателями. Чт...   Jul 1 2007, 06:26
- - mrcashe   ЦитатаПодскажите спецы кто как работает в Си. Можн...   Jul 1 2007, 08:35
|- - defunct   Цитата(mrcashe @ Jul 1 2007, 11:35) В раз...   Jul 1 2007, 13:09
|- - zltigo   Цитата(defunct @ Jul 1 2007, 16:09) Для п...   Jul 1 2007, 13:31
- - sensor_ua   ЦитатаЭто что-то новое. Размер массива в Си, вообщ...   Jul 1 2007, 10:36
- - SasaVitebsk   Спасибо. Доступно, внятно и чётко. Короче похоже э...   Jul 1 2007, 15:47


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:29
Рейтинг@Mail.ru


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