| Автор |
Съобщение |
|
Stoimen
Ранг: Популярен
Регистриран на: Пет Юни 25, 2010 3:18 pm Мнения: 363 Местоположение: Varna
|
 Re: I2C малко помощ
|
| Вто Авг 15, 2017 7:03 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Благодаря, колега но аз тези дни изчетох де що намерих по въпроса за приложението на I2C кода, генериран от MCC и нищо ясно (за мен) не намерих. Принципно нещата са ясни. Описани са добре и в чаршафа и на други места, като втория линк.
Въпросът е, защо не може да се подкара току така MCC кодът, който уж е за улеснение?
В крайна сметка ще се се побалтавя още някой и друг ден с него и накрая ще го зарежа и ще премина, към нещо доста по-разбираемо. Примери, колкото щеш.
|
| Вто Авг 15, 2017 8:03 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Направи проекта така,че всички файлове да са в една папка, архивирай я и я прикачи тука - някой разбиращ може да я разгледа. Имаш осцилоскоп , от който постваш картинки , а дебъгер имаш ли? Пикит3 например? Постни само проекта за мастера. Махни слейва и тествай само с осцилоскопа - целта е да изкараш валидна картинка на старт-адресен байт за слейв - стоп. Наслагай цъкалки и ледове да виждаш събития. Дебъгването е пипкава работа и иска планиране.
Какво значи- ще се предаваш? И2ц си е хубаво нещо и отвреме навреме се налага да се използва. По добре се опитай да разбереш кода, утре ще се откажеш някъде другаде и и само ще съжаляваш за загубеното време.
|
| Вто Авг 15, 2017 8:44 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Исках да кажа, че има вероятност да се откажа от "лесния готов" код на MCC. Не и от I2C, което рано или късно все някак ще подкарам.  В общи линии на дърти години сам се уча на програмиране на пик-ове. И покрай това - първи стъпки в C. С програмиране съм имал бизнес само с Basic и малко асемблер, но това беше преди 100 г. в студентските ми времена, когато още нямаше и Интернет  Досега съм работил само с 8 битови и в общи линии не съм подкарвал още само I2C, UART и USB. С другото се справям 
|
| Вто Авг 15, 2017 8:54 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Какво стана с постването на папката?
|
| Вто Авг 15, 2017 9:03 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Това е нещото (прикаченото).
|
| Вто Авг 15, 2017 9:28 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
не виждам никакъв код в main()
Тази промяна опитва ли я?
void I2C_MasterTRBInsert( uint8_t count, I2C_TRANSACTION_REQUEST_BLOCK *ptrb_list, I2C_MESSAGE_STATUS *pflag) {
// check if there is space in the queue if (i2c_object.trStatus.s.full != true) { *pflag = I2C_MESSAGE_PENDING;
i2c_object.pTrTail->ptrb_list = ptrb_list; i2c_object.pTrTail->count = count; i2c_object.pTrTail->pTrFlag = pflag; i2c_object.pTrTail++;
// check if the end of the array is reached if (i2c_object.pTrTail == (i2c_tr_queue + I2C_CONFIG_TR_QUEUE_LENGTH)) { // adjust to restart at the beginning of the array i2c_object.pTrTail = i2c_tr_queue; }
// since we added one item to be processed, we know // it is not empty, so set the empty status to false i2c_object.trStatus.s.empty = false;
// check if full if (i2c_object.pTrHead == i2c_object.pTrTail) { // it is full, set the full status to true i2c_object.trStatus.s.full = true; }
} else { *pflag = I2C_MESSAGE_FAIL; }
// for interrupt based
if (*pflag == I2C_MESSAGE_PENDING) { if (i2c_state == S_MASTER_IDLE) { /////////////////// PIR1bits.SSP1IF = true; while (PIR1bits.SSP1IF== true) ;
while(i2c_state != S_MASTER_IDLE); { // force the task to run since we know that the queue has // something that needs to be sent PIR1bits.SSP1IF = true;/////ей тоз ред ми изглежда излишен } } //////////////////////////// } // block until request is complete
}
Последна промяна stefan63 на Вто Авг 15, 2017 10:27 pm, променена общо 1 път
|
| Вто Авг 15, 2017 10:09 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
void main(void) { // initialize the device SYSTEM_Initialize();
INTERRUPT_GlobalInterruptEnable();
INTERRUPT_PeripheralInterruptEnable();
unsigned int D; //стойността на D трябва да се прочете от slave
while (1) { // Тук трябва да се осъществи I2C комуникацията със slave за да се изчете D.
// по-натам не е интересно. Примерно: if (D==25) LATA4=1; else LATA4=0; // Add your application code } }
Умишлено не пиша код в main за да фокусираме вниманието си върху I2C.
PS:
Не съм го пробвал това, което предлагаш. Утре ще го пробвам.
|
| Вто Авг 15, 2017 10:26 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: I2C малко помощ
Силно се съмнявам, че микрочеп са дали код, който не работи. Не разбрах - не си писал изобщо код в main или само в дадения от теб код си го пропуснал? Щото ако е първото - не знам какво очакваш... Вероятно цялата тема е заради някаква тъпа грешка в извикването на API-тo (щом не прави разлика между buffer[x] и &buffer[x]).
Последна промяна tolstolob на Вто Авг 15, 2017 11:05 pm, променена общо 2 пъти
|
| Вто Авг 15, 2017 10:52 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Умишлено не съм дал кода в main защото той няма никакво отношение към I2C и писането му излишно ще усложни постановката.
Докараме ли я дотам, че master да може да чете N на брой променливи от няколко slave, с това казусът от темата може да се счита за решен.
|
| Вто Авг 15, 2017 11:01 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: I2C малко помощ
Дай да видим как извикваш master read или там каквото беше. С всичкия код около него.
|
| Вто Авг 15, 2017 11:03 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Това, което предложи Стефан:
uint8_t RXbuffer_forslave_1[10]; I2C_MESSAGE_STATUS statusReadSlave1;
while (1)
{ RXbuffer_forslave_1=0xee; I2C_MasterRead(RXbuffer_forslave_1,10,1,&statusReadSlave1); while ((statusReadSlave1!=I2C_MESSAGE_COMPLETE) && (statusReadSlave1!=I2C_MESSAGE_FAIL)) { //////wait here
};
D=RXbuffer_forslave_1[0]; if(D==25) LATA4=1; else LATA4=0; };
|
| Вто Авг 15, 2017 11:09 pm |
|
 |
|
tolstolob
Ранг: Ориентиран
Регистриран на: Вто Фев 06, 2007 2:45 am Мнения: 263
|
 Re: I2C малко помощ
|
| Вто Авг 15, 2017 11:14 pm |
|
 |
|
stefan63
Ранг: Форумен бог
Регистриран на: Вто Фев 07, 2012 11:22 pm Мнения: 3084
|
 Re: I2C малко помощ
Напиши един main() , цикъл, в цикъла - цък на порт/лед - дилей 1мс - децък на порт/лед - извикване на четене - от слейв 2, адрес 5, 1 байт. - дилей 10 мс Във функциите Read,Build , Insert - разцъкай още няколко леда, колкот повече- толкова по-добре. Покажи горните 4 функции - да видим къде си нацъкал ледчета. После покажи осцилограми на ледчедата. Дебъгер нямаш ли?
|
| Вто Авг 15, 2017 11:18 pm |
|
 |
|
lcr
Ранг: Форумен бог
Регистриран на: Пон Май 12, 2014 11:49 pm Мнения: 4394 Местоположение: София
|
 Re: I2C малко помощ
Извинявам се. Моя техническа грешка. RXbuffer_forslave_1[10]=0xEE;
|
| Вто Авг 15, 2017 11:22 pm |
|
|