Нужна помощь о том, как код i2c1 протекает под xc8 в pic18 - PullRequest
0 голосов
/ 03 мая 2019

Я давно работаю с MikroC и сейчас начинаю кодировать с xc8-mplab X.

Я работаю в проекте, который состоит из сопряжения ds1307 и pic18f46k22 (i2c).С MikroC у меня уходит около 20 минут, но понимание драйверов MCC сводит меня с ума.
Я перечитал таблицу данных pic18f46k22 и руководство xc8 v2.05.

Я набрал много кодов, ноу меня никто не работал (версии xc8, библиотеки не поддерживаются, работает только в pic16, конфликтует с mcc ...)

У меня работает этот код (под Proteus & I2CDebugger):


    flagStartI2c1 = i2c1_driver_open(); // Init i2c1
    i2c1_driver_start();   //S Start
    __delay_ms(20);   
    i2c1_driver_TXData (0xD0); //address DS1307
    __delay_ms(20);
    i2c1_driver_TXData (0x07); //Register SQW/Out
    __delay_ms(20);
    i2c1_driver_TXData (0x90); // Out Enable 1Hz
    __delay_ms(20);
    i2c1_driver_stop();

analyzer: **S D0 A 07 A 90 A P**
simulation: **works OK**

Проблема запускается при отправке условия перезапуска / RXEnable

inline void i2c1_driver_startRX(void)
{
    SSP1CON2bits.RCEN = 1;
}
inline void i2c1_driver_restart(void)
{
    SSP1CON2bits.RSEN = 1;
}

Это приводит к "обнаружению ложного" или "???????????"в I2CDebugger:

//Option 1
    i2c1_driver_start();
    i2c1_driver_TXData (0xD0);
    i2c1_driver_TXData (0x00);
    i2c1_driver_restart();----> MALFUNCTION (Spurious detected)
    i2c1_driver_startRX();-----> MALFUNCTION (????? in analyzer)
    sec = i2c1_driver_getRXData();---> broke tx, doesnt arrive data
    min = i2c1_driver_getRXData();
    hora = i2c1_driver_getRXData();
    .....
analyzer: **S D0 A 00 A FF ?????????????**

//Option 2
    i2c1_driver_start();
    i2c1_driver_TXData (0xD0);
    i2c1_driver_TXData (0x00);
    sec = i2c1_driver_getRXData(); --->nothing in SSP1BUF
    min = i2c1_driver_getRXData(); --->nothing in SSP1BUF
    hora = i2c1_driver_getRXData(); --->nothing in SSP1BUF
    ....
analyzer: **S D0 A 00 A ...and nothing happens**



Рабочий процесс в Mikroc:

driverOpen-> Start-> Tx (D0) -> Tx (00) -> Restart-> Tx (D1)-> Rx (сек) -> Rx (мин) -> Rx (час) -> ..... NACK-> Stop.

Я признаю, что я новичок в этом, но может кто-то помочьмне писать, по крайней мере, рабочий процесс функций драйвера, сгенерированных mcc?или ссылка на любую библиотеку, которая имеет простые функции (init, start, tx, rx и stop), которые работают в xc8 и pic18?

Заранее большое спасибо

...