Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: I2C Slave на PIC16F1823
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
Velund
Пытаюсь запустить I2C Slave на PIC16F1823 взяв за основу обкатанный на старых камнях 16 серии код. И вообще не могу понять что происходит.

То вдруг прочитав после получения SLA+R адрес из SSPBUF у меня оно при попытке положить в SSPBUF первый байт данных для передачи мастеру циклится по WCOL (с кем коллизия то может быть? BF не стоит, шина в клок стретче). То вдруг вместо первого байта данных, который я положил в SSPBUF мастер выгребает сдвинутый на 1 бит влево адрес слейва...

Ни разу не удалось увидеть чтобы после NACK со стороны мастера выставился бит ACKSTAT в SSP1CON2.. Если судить по нему у меня там вечный ACK...

Вообще, хоть кто то с этими Enhanced Core MidRange пиками возился плотно? В Errata вроде ничего про MSSP нет плохого... Но вот что то оно работать не желает как надо. Раздел даташита про MSSP "новой ревизии" зачитан до дыр... Просветлением и не пахнет.
dac
PIC24FJ64GB002 (master) + PIC16F1936(slave) + i2c датчик температуры, все работает, проблем нет
Velund
QUOTE (dac @ Dec 5 2011, 10:05) *
PIC24FJ64GB002 (master) + PIC16F1936(slave) + i2c датчик температуры, все работает, проблем нет


У меня мастером LPC1758, кроме пика на шине EEPROM (с ним никаких проблем) и сдвоенный потенциометр DS1803 (тоже никаких проблем). Шина 100 кГц, короткая (проводники порядка 7 см).

Что удручает - оно может работать нормально пару секунд, а потом начинаются глюки. Т.е. совсем явной ошибки в коде пика нет. Весь основной функционал в пике заблокирован, работатет только обмен по I2C и маленькая заплатка чтобы контрольные данные грузить в ответ для отладки. Начинаю подозревать дефектный чип, есть еще один образец, но он из того же источника (надо у снабженцев уточнить где брали).

dac
для 16 го вот так
CODE
// инициализация
    SSPADD = SRVP_SLAVEADR;
    SSPCON1 = 0b00100110; // enable serial port
    SSPCON2 = 0b00000001;
    SSPIF = 0;
    SSPIE = 1;

static void interrupt isr(void)            // Here be interrupt function - the name is
{
    //**********************************************************
    // прерывания I2C
    //**********************************************************
    if (SSPIE && SSPIF)
    {
        if (R_nW)
        {        
            WREG = SSPBUF;
            SSPOV = 0;
            if (!D_nA)
            {
                i2cByteCounter = 0;
            }
            SSPBUF = ((char *)&slState)[i2cByteCounter++];
        }
        else
        {
            if (D_nA)
            {
                 // команда
            }
            WREG = SSPBUF;
        }
        CKP = 1;
        SSPIF = 0;
    }
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.