Отговори на тема  [ 281 мнения ]  Отиди на страница Предишна  1 ... 10, 11, 12, 13, 14, 15, 16 ... 19  Следваща
I2C малко помощ 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: I2C малко помощ
Ама и без нея ... пак си е малко рисково, рачиташ че нещо ще се случи, ама то може да не се случи, аз би му турил един таймер, препдолагам някой таймер ти прави тайм бейс и е на прекъсване, зареждаш си някакъва променлива и в тялото на while само я проверяваш, и за да е бърза проверката може да я сетваш така че да следиш определен бит, примерно искаш 16 тайм бейза, и я зареждаш 1F и проверяваш само 5-ти бит, стане ли 0 преебваш whilе и караш нататък. така проверката ти е една команда, не е някакво съществено забавяне.


Сря Авг 16, 2017 9:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Е, това е за друга тема вече :D

"Многозадачна риълтайм система с ПИК12Ф508."


Сря Авг 16, 2017 9:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: I2C малко помощ
Само да вметна относно квадратните скоби: Името на масива е указател към неговият първи елемент :
Rxbuffer = &Rxbuffer[0]

_________________
https://github.com/slav4ocom/


Чет Авг 17, 2017 12:09 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Може ли един pic (16F1847) да работи едновременно, като SPI master и като I2C master?

Като SPI master, управлява LCD контролер а като I2C master трябва да чете данни от I2C slave МК за да се визуализират на дисплея.

Това, което наблюдавам е, че щом се инициализира I2C, SPI спира да работи.


Пон Авг 21, 2017 1:13 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: I2C малко помощ
Код:
Up to two Master Synchronous Serial Port
(MSSP) with SPI and I2CTM  with:
-  7-bit address masking
-  SMBus/PMBusTM compatibilit

Имаш 2 серийни устройства в чипа - ако са им свободни краката, така че изборът си е твой;
Ако искаш да ползваш само един -
викаш инициализация за СПИ преди трафика, после викаш инициализация за И2Ц - преди трафика - и така си ги редуваш ; Хубаво е И2Ц Д-поне да не е общ пин и за 2-та режима ;
Другият подводен камък е - че И2Ц устройства могат да се ошашавят и по КЛОК жицата ;
Така че - най добре ползвай двете устройства на чипа;


Пон Авг 21, 2017 1:28 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Аз ползвам двете устройства:

MSSP1 (SPI master) с пинове SDO1 (RB2) и SCK1 (RB4).

и

MSSP2 (I2C master) с пинове SDA2 (RB2) и SCL2 (RB5)

Пиновете ми ги е конфигурирал MCC и както е видно този за данните на двата модула съвпада.


Пон Авг 21, 2017 2:00 pm
Профил
Ранг: Професионалист
Ранг: Професионалист
Аватар

Регистриран на: Съб Май 21, 2016 9:47 pm
Мнения: 577
Местоположение: Бургас
Мнение Re: I2C малко помощ
Пробвал съм да ползвам SPI и I2C за две различни устройства- понякога работи, понякога- не. Говорих по случая и с един колега- и той също каза, че е ненадеждно.
Пробата беше такава- инициализация I2C, предаване и приемане на данни, забрана на модула, инициализация ма SPI, разрешаване на slave (-SS), предаване/приемане на данни, забрана на модула... Доколкото успях да установя- губеше ми се първия входящ байт при SPI при превключването I2C->SPI. Най-вероятно се получава (поне според мен), щото и двата протокола ползват един и същ регистър (SSPBUF).


Последна промяна ig_ivanov на Пон Авг 21, 2017 3:25 pm, променена общо 1 път



Пон Авг 21, 2017 3:20 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Пет Юни 25, 2010 3:18 pm
Мнения: 363
Местоположение: Varna
Мнение Re: I2C малко помощ
SDO1 можеш да го ремапнеш на RA6 чрез bit6 на APFCON0.
Описано е на стр. 120 от datasheet-a.


Пон Авг 21, 2017 3:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Stoimen написа:
SDO1 можеш да го ремапнеш на RA6 чрез bit6 на APFCON0.
Описано е на стр. 120 от datasheet-a.


Много ти благодаря! :)

Прехвърлих SDO1 на RA6 и така SPI вече работи без да спира след инициализацията на I2C. Сега остава да тествам I2C.


Пон Авг 21, 2017 4:00 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Всичко е точно и с I2C. :)

Предстои да тествам доколко стабилно работят двата протокола с повечко премятани данни и с повече slave устройства.

Благодаря Ви за насоките!


Пон Авг 21, 2017 5:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
В I2C.c на slave има функцията:
Код:
void I2C_StatusCallback(I2C_SLAVE_DRIVER_STATUS i2c_bus_state)
{
   

char EEPROM_Buffer[4]=
    {
       0x01,0x02,0x03,0x04
    }

    static uint8_t eepromAddress    = 0;
    static uint8_t slaveWriteType   = SLAVE_NORMAL_DATA;


    switch (i2c_bus_state)
    {
        case I2C_SLAVE_WRITE_REQUEST:
            // the master will be sending the eeprom address next
            slaveWriteType  = SLAVE_DATA_ADDRESS;
            break;

        case I2C_SLAVE_GENERAL_CALL_REQUEST:
            // the master will be sending general call data next
            slaveWriteType  = SLAVE_GENERAL_CALL;
            break;

        case I2C_SLAVE_WRITE_COMPLETED:

            switch(slaveWriteType)
            {
                case SLAVE_DATA_ADDRESS:
                    eepromAddress   = I2C_slaveWriteData;
                    break;

                case SLAVE_GENERAL_CALL:
                    // process general call data here
                    break;

                case SLAVE_NORMAL_DATA:
                default:
                    // the master has written data to store in the eeprom
                    EEPROM_Buffer[eepromAddress++]    = I2C_slaveWriteData;
                    if(sizeof(EEPROM_Buffer) <= eepromAddress)
                    {
                        eepromAddress = 0;    // wrap to start of eeprom page
                    }
                    break;

            } // end switch(slaveWriteType)

            slaveWriteType  = SLAVE_NORMAL_DATA;
            break;

        case I2C_SLAVE_READ_REQUEST:
            SSP1BUF = EEPROM_Buffer[eepromAddress++];
            if(sizeof(EEPROM_Buffer) <= eepromAddress)
            {
                eepromAddress = 0;    // wrap to start of eeprom page
            }
            break;

        case I2C_SLAVE_READ_COMPLETED:
        default:;

    } // end switch(i2c_bus_state)




когато въведа в буфера някакви константи, примерно:

EEPROM_Buffer[1]=66;
EEPROM_Buffer[2]=80;

те се четат успешно от master - а.

Но аз искам да въвеждам променливи, които се формират в цикъла while(1). Примерно:

EEPROM_Buffer[3]=d11;

Къде и как трябва да декларирам променливата d11 за да може стойността и от основния цикъл да се запише в EEPROM_Buffer[3]?


Сря Авг 23, 2017 2:12 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: I2C малко помощ
е къде - глобална :)
Код:
#define alabala

char d11;

void main(void){

InitAlabala();
while(1){
  d11 = namsikwo;
}
}

_________________
https://github.com/slav4ocom/


Сря Авг 23, 2017 3:21 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Това "InitAlabala();" не ми го приема. :(

Сигурно нещо аз не правя, както трябва, но разбрах важното - че трябва да деклалирам променливата, като глобална.

Някъде прочетох, че това може да стане, като във файла, където се намира ISR функцията, променливата се декларира, като "volatile" и после в main се декларира, като "extern".

Направих го така и работи :)

Благодаря за помощта! :)


Сря Авг 23, 2017 3:55 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: I2C малко помощ
InitAlabala() е функция в която си правиш първоначалните настройки. Това е само примерно....
А ако искаш d11 да се вижда от I2C.c, трябва да я декларираш там extern char dll . Само че така бараш из готова библиотека...
А аз предполжих, че statement-a EEPROM_Buffer[3] = d11 се намира във main.c , тогава няма нужда I2C.c да знае за променливята d11, просто като параметър подаваш d11...

_________________
https://github.com/slav4ocom/


Сря Авг 23, 2017 7:49 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Май 12, 2014 11:49 pm
Мнения: 4394
Местоположение: София
Мнение Re: I2C малко помощ
Извинявам се за тъпия въпрос, но искам да съм сигурен.......

При започване на I2C комуникация :

Изображение

Ако в момента на деветия тактов импулс (ACK бита) SDA жицата е в състояние лог 1, това означава, че няма slave разпознал адреса си и ако е в състояние 0, означава, че има такъв?


Пет Мар 02, 2018 6:58 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 281 мнения ]  Отиди на страница Предишна  1 ... 10, 11, 12, 13, 14, 15, 16 ... 19  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни