Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 09.07.2018, 23:27   #26
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82
как они могут друг другу мешать? на PIC32MZ работает же?! - кто-нибудь кроме Вас знает, как у Вас прерывания там работают? pic32mz сильно быстрее и это запросто может скрыть архитектурные изъяны.

в общей модели обработка прерываний происходит следующим образом.

есть основной поток с каким-то приоритетом выполнения. он может быть прерван только прерыванием с приоритетом выполнения выше, чем у потока, который исполняется.

в случае когда происходит прерывание происходит куча вещей.

среди которых в общем случае можно выделить несколько.

сохранение состояния, в котором было ядро, чтобы можно было возвратиться.
(есть моменты, что полное сохранение может и быть отложено, если есть srs, но это дело третье).

переключение на контекст ядра (если нужно)

полезная нагрузка.

восстановление контекста потока.

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

что может быть?

может быть неверно сделанный пролог прерываний. что во время вложенных прерываний портится содержимое регистров.
может исчерпываться стек ядра (который используется в прерываниях).
может исчерпываться стек потока.
может быть неверно сделанный эпилог прерываний. что неверно загружается или портится.
куча всего.

часто ведет к порче памяти. содержимое памяти портится.
в итоге Вы можете запросто оказаться в проверке условия, которое будет реально никогда не выполняться или близко.

все это можно более-менее посмотреть с помощью disassembly.
спасибо за информацию!


я так и примерно догадывался, раньше работая с дсПИК33ЕП проблем не было, ставил мне нужные приоритеты и проблем не было.


я смог все таки поймать ошибку, но она не всегда ловиться почему ту.
Но система виснет всегда.
void _general_exception_handler(void)


_excep_code = EXCEP_DBE == (0x00000007)


_excep_addr = 0x9D002248


EXCEP_DBE = 7, // bus error (load/store)



Код:
1033:                /********************************************************************************
1034:                * 1 ms Timer Interrupt, fuer Aufbereitung der Daten und Transfer der Daten über 
1035:                * UART2 TX und DMA1
1036:                * PBCLK2 = TMR_CLK: 60000000 Mhz / 1000000µs * 1000µs = 60000 (0xEA60)
1037:                *********************************************************************************/
1038:                void __ISR(_TIMER_6_VECTOR, IPL3SRS) _T6Interrupt(void)
1039:                //void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL7AUTO), nomips16))  _T6Interrupt(void)
1040:                {
9D00221C  415DE800   RDPGPR SP, SP
9D002220  401A7000   MFC0 K0, EPC
9D002224  401B6000   MFC0 K1, Status
9D002228  27BDFFF0   ADDIU SP, SP, -16
9D00222C  AFBA000C   SW K0, 12(SP)
9D002230  401A6002   MFC0 K0, SRSCtl
9D002234  AFBB0008   SW K1, 8(SP)
9D002238  AFBA0004   SW K0, 4(SP)
9D00223C  7C1B7844   INS K1, ZERO, 1, 15
9D002240  377B0C00   ORI K1, K1, 3072
9D002244  409B6000   MTC0 K1, Status
9D002248  03A0F021   ADDU FP, SP, ZERO
1041:                  _2_1_OUT_OC_24V = 1;       // Pin toggeln
9D00224C  3C03BF86   LUI V1, -16506
9D002250  94620630   LHU V0, 1584(V1)
9D002254  24040001   ADDIU A0, ZERO, 1
9D002258  7C825284   INS V0, A0, 10, 1
9D00225C  A4620630   SH V0, 1584(V1)
1042:                   
1043:                  IFS2CLR = _IFS2_T6IF_MASK;
9D002260  3C02BF81   LUI V0, -16511
9D002264  24031000   ADDIU V1, ZERO, 4096
9D002268  AC430064   SW V1, 100(V0)
1044:                 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
1045:                  
1046:                  daten_paket.position++;
9D00226C  3C028000   LUI V0, -32768
9D002270  2442038C   ADDIU V0, V0, 908
9D002274  8C420004   LW V0, 4(V0)
9D002278  24430001   ADDIU V1, V0, 1
9D00227C  3C028000   LUI V0, -32768
9D002280  2442038C   ADDIU V0, V0, 908
9D002284  AC430004   SW V1, 4(V0)
1047:                
1048:                 // memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));   //Kopiere Struct Daten in buffer_array
1049:                  
1050:                  if (DCH1CONbits.CHEN == 0)
9D002288  3C02BF81   LUI V0, -16511
9D00228C  8C421120   LW V0, 4384(V0)
9D002290  30420080   ANDI V0, V0, 128
9D002294  1440000B   BNE V0, ZERO, 0x9D0022C4
9D002298  00000000   NOP
1051:                  {     
1052:                  DCH1CONbits.CHEN = 1;       // Enable channel 
9D00229C  3C03BF81   LUI V1, -16511
9D0022A0  8C621120   LW V0, 4384(V1)
9D0022A4  24040001   ADDIU A0, ZERO, 1
9D0022A8  7C8239C4   INS V0, A0, 7, 1
9D0022AC  AC621120   SW V0, 4384(V1)
1053:                  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
9D0022B0  3C03BF81   LUI V1, -16511
9D0022B4  8C621130   LW V0, 4400(V1)
9D0022B8  24040001   ADDIU A0, ZERO, 1
9D0022BC  7C8239C4   INS V0, A0, 7, 1
9D0022C0  AC621130   SW V0, 4400(V1)
1054:                  }
1055:                  
1056:                  _2_1_OUT_OC_24V = 0;       // Pin toggeln
9D0022C4  3C03BF86   LUI V1, -16506
9D0022C8  94620630   LHU V0, 1584(V1)
9D0022CC  7C025284   INS V0, ZERO, 10, 1
9D0022D0  A4620630   SH V0, 1584(V1)
1057:                }
9D0022D4  03C0E821   ADDU SP, FP, ZERO
9D0022D8  41606000   DI ZERO
9D0022DC  000000C0   EHB
9D0022E0  8FBB0004   LW K1, 4(SP)
9D0022E4  8FBA000C   LW K0, 12(SP)
9D0022E8  409B6002   MTC0 K1, SRSCtl
9D0022EC  8FBB0008   LW K1, 8(SP)
9D0022F0  409A7000   MTC0 K0, EPC
9D0022F4  27BD0010   ADDIU SP, SP, 16
9D0022F8  41DDE800   WRPGPR SP, SP
9D0022FC  409B6000   MTC0 K1, Status
9D002300  42000018   ERET
Gera82 вне форума   Ответить с цитированием
Старый 10.07.2018, 01:02   #27
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Но система виснет всегда.
void _general_exception_handler(void)


_excep_code = EXCEP_DBE == (0x00000007)


_excep_addr = 0x9D002248


EXCEP_DBE = 7, // bus error (load/store)
эта ошибка не помоей теме с зависанием после 2000-3000 посылок, это я уже от не знания начал методом тыка прореветь разные настройки, и попал суда.
Но теперь я знаю как рабоатает void _general_exception_handler(void) у ПИК32МК/МЗ



Ошибку в ПИК32МК я все таки нашел, реально ошибка в железе.
Я тестировал УАРТ1 и УАРТ2 +ДМА0, ДМА1 и ДМА7, всегда зависало железо после 2000-3000 посылок.

Я решил провертит еще раз и настроил только УАРТ5 (их там 6 штук) + ДМА1, и система больше не виснет
на данный момент моя прошивка работает полностью со всеми прерывание и настройками.
Код:
    U5MODEbits.USIDL = 0;                /* Continue in Idle mode */
     U5MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U5MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U5MODEbits.STSEL = 0;                /* One Stop bit */
    
    U5MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U5BRG = BRGVAL_DATABUS;            //10Mbit
    
    IFS2bits.U5TXIF = 0;                /* Clear interrupt flag */
    IPC17bits.U5TXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC17bits.U5TXIS = 2;                // sub priority, 0 is Low priority
    IEC2bits.U5TXIE = 0;                /* Enable receive interrupts */

    IFS2bits.U5RXIF = 0;                /* Clear interrupt flag */
    IPC17bits.U5RXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC17bits.U5RXIS = 2;                // sub priority, 0 is Low priority
    IEC2bits.U5RXIE = 0;                /* Enable receive interrupts */

    U5STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U5STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
    U5STAbits.UTXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    U5STAbits.URXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
 
    U5MODEbits.CLKSEL = 0b00;           // 00 = PBCLKx(1), 01 = SYSCLK, 10 = FRC, 11 = REFCLK1
    
    U5MODEbits.ON = 1;                   /* Enable UART module 1 */     
    
    

// DMA1 UART2 TX - This is the DMA setup for the trasmiter    
    DCH1ECON=0;                    // no start or stop IRQs, no pattern match
    DCH1CONbits.CHPRI = 3;
    DCH1ECONbits.CHSIRQ = _UART5_TX_VECTOR;       // IRQ vector for "UART1 Transfer Done"
                                    // ===> U1TXREG empty and new Cell of 8 bytes
                                    // Could be transfered 
                                // See table 8-3 p 123 in PIC32MK documentation
    DCH1ECONbits.SIRQEN = 1;    // DMA's interruption enable   
    DCH1CONbits.CHAEN = 0;
//    DCH1CONbits.CHCHN = 1;
//    DCH1CONbits.CHPIGNEN = 0;     // Enable Pattern Ignore Byte bit, 0 = Disable this feature
    
    DCH1SSA = VirtToPhys((void*)&tx_buff);
    DCH1DSA = VirtToPhys((void*)&U5TXREG);
    DCH1SSIZ = 16;              // source size at most x bytes                   
    DCH1DSIZ = 1;               // dst size is 1 byte  
    DCH1CSIZ = 1;               // PIC32MK has 8 bytes Transmitter FIFO                                              
    DCH1INTbits.CHBCIE = 1;     // alle Interupt ausschalten
    
    
    // Interrupt setup
    IPC18bits.DMA1IP = 5;
    IPC18bits.DMA1IS = 2;
    IFS2bits.DMA1IF = 0;  
   // IEC2bits.DMA1IE = 1;        // Interrupt disable
  //  DCH1CONbits.CHEN = 1;       // Enable channel 
    
    DMACONbits.ON = 1;
Gera82 вне форума   Ответить с цитированием
Старый 10.07.2018, 08:49   #28
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,847
Вес репутации: 3528/76
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Gera82
не думаю, что это единственная проблема.

DBE ошибка-то лютая.

у Вас точно отключен prefetch cache? Вы не можете в общем случае использовать pic32mk на 120MHz. Вы можете в общем случае отключить cache и использовать pic32mk на 40 MHz.
besogon вне форума   Ответить с цитированием
Старый 10.07.2018, 12:25   #29
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82
DBE ошибка-то лютая.
я еще раз повторюсь, у меня этой ошибку изначально не было, я просто туда не попадал. я начал экспериментировать с настройками и могу симулировать эту ошибку:


DBE ошибка приходит:
Код:
void __ISR(_TIMER_6_VECTOR, IPL3SRS) _T6Interrupt(void)
//void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL5AUTO), nomips16))  _T6Interrupt(void)
{
  _2_1_OUT_OC_24V = 1;       // Pin toggeln
   
  IFS2CLR = _IFS2_T6IF_MASK;
 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
  
  daten_paket.position++;

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));   //Kopiere Struct Daten in buffer_array
  
  if (DCH1CONbits.CHEN == 0)
  {     
  DCH1CONbits.CHEN = 1;       // Enable channel 
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
  
  _2_1_OUT_OC_24V = 0;       // Pin toggeln
 }
DBE ошибки нету:
Код:
//void __ISR(_TIMER_6_VECTOR, IPL3SRS) _T6Interrupt(void)
void __attribute__((vector(_TIMER_6_VECTOR), interrupt(IPL5AUTO), nomips16))  _T6Interrupt(void)
{
  _2_1_OUT_OC_24V = 1;       // Pin toggeln
   
  IFS2CLR = _IFS2_T6IF_MASK;
 // IFS2bits.T6IF = 0; //Clear Timer7 interrupt flag
  
  daten_paket.position++;

  memcpy(&tx_buff, &daten_paket, sizeof(daten_paket));   //Kopiere Struct Daten in buffer_array
  
  if (DCH1CONbits.CHEN == 0)
  {     
  DCH1CONbits.CHEN = 1;       // Enable channel 
  DCH1ECONbits.CFORCE = 1;    // set CFORCE to 1 to start Transmitter
  }
  
  _2_1_OUT_OC_24V = 0;       // Pin toggeln
 }
Цитата:
у Вас точно отключен prefetch cache?
настроил все по документации, она маленько отличается от PIC32MZ
Код:

// CHECON - Set up prefetch
    SYS_DEVCON_PerformanceConfig(120000000UL);


// Set up caching
    cp0 = _mfc0(16, 0);
    cp0 &= ~0x07;
    cp0 |= 0b011; // K0 = Cacheable, non-coherent, write-back, write allocate
    _mtc0(16, 0, cp0);  



/********************************************************************************
 *                                                                              *
 *  Funktion           SYS_DEVCON_PerformanceConfig                             *
 *                                                                              *
 *------------------------------------------------------------------------------*
 *
 *  description:
 *
 *
 ********************************************************************************/
void __attribute__((nomips16)) SYS_DEVCON_PerformanceConfig( unsigned long sysclk )
{
    

    /* Set the PFM wait states based on the system clock and ECC setting */
    if (sysclk <= 60000000UL)
        CHECONbits.PFMWS = 1;   // Wait States = 1
    else if (sysclk <= 80000000UL)
        CHECONbits.PFMWS = 2;   // Wait States = 2
    else
        CHECONbits.PFMWS = 3;   // Wait States = 3

    /* Enable Prefetch Cache Module */
    CHECONbits.PREFEN = 1;         // 01 Enable predictive prefetch for CPU instructions only
}

я только что еще раз проверил, включил УАРТ2 + ДМА1, работают только 2000 пакетов и система виснет и не попадает в _general_exception_handler(void)


включаю УАРТ5 + ДМА1 работает как надо, без каких либо проблем
Gera82 вне форума   Ответить с цитированием
Старый 10.07.2018, 13:43   #30
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,847
Вес репутации: 3528/76
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Gera82
ладно. как знаете.
в errata написано про prefetch cache и что он вызывает ошибки шины.
besogon вне форума   Ответить с цитированием
Старый 10.07.2018, 17:41   #31
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
Gera82
ладно. как знаете.
в errata написано про prefetch cache и что он вызывает ошибки шины.

Ну пока работает я дальше парится не буду, я стал на PIC32MZ(Master) и PIC32MK(Slave) эти ошибки отслеживать, вот пример PIC32MK(Slave), который постоянно шлет ошибки Мастеру, тестировал 3 разные ошибки вроде работает:
Код:
volatile unsigned int _epc_code;
volatile unsigned int _excep_addr;
volatile unsigned char error;
volatile unsigned char iCRC_v=0; 
// this function overrides the normal _weak_ generic handler
void __attribute__((nomips16)) _general_exception_handler(void)
{
    asm volatile("mfc0 %0,$13" : "=r" (_epc_code));
    asm volatile("mfc0 %0,$14" : "=r" (_excep_addr));
   _epc_code = (_epc_code & 0x0000007C) >> 2;    
    
#ifdef __DEBUG
__asm__("sdbbp");
#endif

    while (1) {
       
        
    switch(_epc_code){
        case 0: error = ERROR_SLAVE_GENERAL_EXCEPTION_INT; slave_send_error(); break; // interrupt
        case 1: error = ERROR_SLAVE_GENERAL_EXCEPTION_MOD; slave_send_error(); break; // TLB modified exception
        case 2: error = ERROR_SLAVE_GENERAL_EXCEPTION_TLBL; slave_send_error(); break; // TLB exception (load or instruction fetch)
        case 3: error = ERROR_SLAVE_GENERAL_EXCEPTION_TLBS; slave_send_error(); break; // TLB exception (store)
        case 4: error = ERROR_SLAVE_GENERAL_EXCEPTION_ADEL; slave_send_error(); break; //address error exception (load or ifetch)
        case 5: error = ERROR_SLAVE_GENERAL_EXCEPTION_ADES; slave_send_error(); break; //address error exception (store)
        case 6: error = ERROR_SLAVE_GENERAL_EXCEPTION_IBE; slave_send_error(); break; //bus error (ifetch
        case 7: error = ERROR_SLAVE_GENERAL_EXCEPTION_DBE; slave_send_error(); break; //bus error (load/store)
        case 8: error = ERROR_SLAVE_GENERAL_EXCEPTION_SYS; slave_send_error(); break; //syscall
        case 9: error = ERROR_SLAVE_GENERAL_EXCEPTION_BP; slave_send_error(); break; //breakpoint
        case 10: error = ERROR_SLAVE_GENERAL_EXCEPTION_RI; slave_send_error(); break; //reserved instruction
        case 11: error = ERROR_SLAVE_GENERAL_EXCEPTION_CPU; slave_send_error(); break; //coprocessor unusable
        case 12: error = ERROR_SLAVE_GENERAL_EXCEPTION_OV; slave_send_error(); break; //arithmetic overflow
        case 13: error = ERROR_SLAVE_GENERAL_EXCEPTION_TR; slave_send_error(); break; //trap (possible divide by zero)
        case 16: error = ERROR_SLAVE_GENERAL_EXCEPTION_IS1; slave_send_error(); break; //implementation specfic 1
        case 19: error = ERROR_SLAVE_GENERAL_EXCEPTION_TLBRI; slave_send_error(); break; //TLB read-inhibit
        case 20: error = ERROR_SLAVE_GENERAL_EXCEPTION_TLBEI; slave_send_error(); break; //TLB execute-inhibit    
        case 23: error = ERROR_SLAVE_GENERAL_EXCEPTION_WATCH; slave_send_error(); break; //Reference to WatchHi/WatchLo address
        case 24: error = ERROR_SLAVE_GENERAL_EXCEPTION_MCHECK; slave_send_error(); break; //Machine Check     
        case 26: error = ERROR_SLAVE_GENERAL_EXCEPTION_DSPDIS; slave_send_error(); break;  //DSP ASE state disabled exception
       // case EXCEP_CEU: ;break;
       // case EXCEP_C2E: break;        
      }
    
      
        // Examine _excep_code to identify the type of exception
        // Examine _excep_addr to find the address that caused the exception

    }
 }

У меня еще вторая проблема, с которой я не разобрался:
Цитата:
2. Проблема, я не могу принят эти данные которые шлет мне PIC32MK "Slave". PIC32MZ "Master" и я пытаюсь также с помощью DMA принять тот же самый пакет, который шлет мне PIC32MK.
Gera82 вне форума   Ответить с цитированием
Старый 10.07.2018, 21:32   #32
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Короче мне с ДМА как то не везет,


Вторая проблема тоже странная и не решаемая, теперь это связано с PIC32MZ, я не могу принять данные (16 Байт) с помощью УАРТ2 + ДМА0.


УАРТ2 сто процентов рабочий, без ДМА работает отлично. Я вижу все байты, которые шлет мне ПИК32МК.

После настойки ДМА, я получаю один раз прерывания по ДМА, но данных в буфере нет, одни ноли:
volatile unsigned char rx_buff[128];


Какая Периферия у PIC32MZ сломана или не рабочая?


Вот мои настройки, PIC32MZ работает на чистоте 250МГц:
Код:
// UART2 Für Master-Slave Databus ------------------------------------
     U2MODEbits.USIDL = 0;                /* Continue in Idle mode */
     U2MODEbits.LPBACK = 0;                /* Disable LoopBack */
    U2MODEbits.PDSEL = 0b00;            /* 8-bit data, no parity */
    U2MODEbits.STSEL = 0;                /* One Stop bit */
    
    U2MODEbits.BRGH = 1;                /* 1 = High-Speed mode – 4x baud clock enabled*/

    U2BRG = BRGVAL_DATABUS;               //10Mbit
    
    IFS4bits.U2TXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2TXIP = 3;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC36bits.U2TXIS = 2;                // 2 sub priority, 0 is Low priority
    IEC4bits.U2TXIE = 0;                /* Enable receive interrupts */

    IFS4bits.U2RXIF = 0;                /* Clear interrupt flag */
    IPC36bits.U2RXIP = 7;                // 2 (bei 7 geht DISI nicht) is High priority, 0 is Low priority
    IPC36bits.U2RXIS = 2;                // 2 sub priority, 0 is Low priority
    IEC4bits.U2RXIE = 0;                /* Enable receive interrupts */

   // U2STAbits.UTXEN = 1;                /* 1 = UARTx transmitter is enabled. UxTX pin is controlled by UARTx (if ON = 1*/
    U2STAbits.URXEN = 1;                /* 1 = UARTx receiver is enabled. UxRX pin is controlled by UARTx (if ON = 1) */
   // U2STAbits.UTXISEL = 0b10;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    U2STAbits.URXISEL = 0b00;           /* 10 =Interrupt is generated and asserted while the transmit buffer is empty*/
    
    
    U2MODEbits.ON = 1;                   /* Enable UART module 1 */ 



...




// DMA0 UART2 RX - This is the DMA setup for the receiver    
    IEC4bits.DMA0IE = 0;            // Interrupt disable
    IFS4bits.DMA0IF = 0;            // Interrupt flag CLR

    DCH0ECON = 0;   
    DCH0ECONbits.CHSIRQ = _UART2_RX_VECTOR;        // IRQ vector for "UART2 Receiver Done"
    DCH0ECONbits.SIRQEN = 1;    // DMA's interruption enable 
    
    DCH0CONbits.CHPRI = 2;   // Channel priority
//    DCH0CONbits.CHCHN = 1;   // chaining enabled
//    DCH0CONbits.CHAED = 1;   //allow event when disabled
//    DCH0CONbits.CHAEN = 1;   // 1 = Channel is continuously enabled, and not automatically disabled after a block transfer is complete
    
    DCH0SSA = VirtToPhys((void*)&U2RXREG);     // Source address
    DCH0DSA = VirtToPhys((void*)&rx_buff);     // Destination 
    DCH0SSIZ = 1;                        
    DCH0DSIZ = 16;
    DCH0CSIZ = 1;                                                                     
    DCH0INTbits.CHBCIE = 1;     // Interrupt on block transfer complete
    DCH0INTbits.CHERIE = 1;     // Interrupt on errors
    
    // Interrupt setup
    IPC33bits.DMA0IP = 7;       // Priority
    IPC33bits.DMA0IS = 0;       // Sub priority
    IFS4bits.DMA0IF = 0;        // Interrupt flag CLR
    IEC4bits.DMA0IE = 1;        // Interrupt enable
    
    DCH0INTCLR=0x000000ff;           // clear DMA's channel interrupt flags, CHSDIF, CHSHIF, CHDDIF, CHDHIF, CHBCIF, CHCCIF, CHTAIF, CHERIF
    
    DCH0CONbits.CHEN = 1;       // Enable channel
    
    DMACONbits.ON = 1;
    
    DCRCCON = 0; 







...




/********************************************************************************
* DMA0 Interrupt für UART2 RX, Daten von Slave
*********************************************************************************/
void __attribute__((vector(_DMA0_VECTOR), interrupt(IPL7AUTO), nomips16))  _DMA0Interrupt(void) //_DMA0_VECTOR = 72
{

    Nop();
    
    DCH0INTCLR=0x000000ff;           // clear DMA's channel interrupt flags, CHSDIF, CHSHIF, CHDDIF, CHDHIF, CHBCIF, CHCCIF, CHTAIF, CHERIF
    IFS4bits.DMA0IF = AUS;           // clear interruption flag         
    
   // memcpy(&daten_paket, &rx_buff, sizeof(daten_paket)); //Kopiere buffer_array in Struct Daten zurück 
    
    Nop();
    
}
Gera82 вне форума   Ответить с цитированием
Старый 11.07.2018, 20:16   #33
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Ну Не могу поймать пакет данных, буфер rx_buff всегда пуст, вывожу его на дисплей.

В режими отладки срабатывает 1 раз прерывание _DMA0, а вот в нормальном режиме работает без проблем. Прерывании срабатывает всегда, каждые 10мсек, как и положено, ПИК32МК шлет мне каждые 10мсек.

Код:
/********************************************************************************
* DMA0 Interrupt für UART2 RX, Daten von Slave
*********************************************************************************/
void __attribute__((vector(_DMA0_VECTOR), interrupt(IPL7AUTO), nomips16))  _DMA0Interrupt(void) //_DMA0_VECTOR = 72
{

   if(DCH0INTbits.CHBCIF == 1)
    {
        _31_OUT_OC_24V ^= 1;       //Pin togglen
       // memcpy(&daten_paket, &rx_buff, sizeof(daten_paket)); //Kopiere buffer_array in Struct Daten zurück 
    }
    
    DCH0INTCLR=0x000000ff;           // clear DMA's channel interrupt flags, CHSDIF, CHSHIF, CHDDIF, CHDHIF, CHBCIF, CHCCIF, CHTAIF, CHERIF
    IFS4bits.DMA0IF = AUS;           // clear interruption flag         
       
}
пытался менять:
U2STAbits.URXISEL = 0b00; /* */
все настройки перепробовал, но нет данных в буфере rx_buff

Если прерывание _DMA0Interrupt(void) работает, значит данные приходят, ну куда они пропадают


В еррата на pic32mz2048efh144 и ДМА ни чего не нашел.


Нашел только на УАРТ, но он у меня в нормально режиме (без ДМА) работает без проблем:


Module: UARTDuring a RX FIFO overflow condition, the shift
register stops receiving data. This causes the
UART to lose synchronization with the serial data
stream. The only way to recover from this is to turn
the UART OFF and ON until it synchronizes. This
could require several OFF/ON sequences.
Work arounds
Work around 1:
Avoid the RX overrun condition by ensuring that
the UARTx module has a high enough interrupt
priority such that other peripheral interrupt
processing latencies do not exceed the time to
overrun the UART RX buffer based on the
application baud rate. Alternately or in addition to,
set the URXISEL bits in the UxSTA register to
generate an earlier RX interrupt based on RX
FIFO fill status to buy more time for interrupt
latency processing requirements.
Work around 2:
If avoiding RX FIFO overruns is not possible,
implement an ACK/NAK software handshake
protocol to repeat lost packet transfers after
restoring the UART synchronization.


Мистика п*здец какая та с ПИК32МК и ПИК32МЗ + ДМА!
Gera82 вне форума   Ответить с цитированием
Старый 11.07.2018, 21:31   #34
dosikus
Senior Member
 
Аватар для dosikus
 
Регистрация: 05.06.2007
Возраст: 46
Сообщений: 3,742
Вес репутации: 6161/140
dosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond reputedosikus has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от Gera82 Посмотреть сообщение
Мистика п*здец какая та с ПИК32МК и ПИК32МЗ + ДМА!
Да уж ,читаешь ваши страшилки и становится как-то спокойно и легко на душе -слава богу что не выбрал пЫк32...


Может все таки дело в прокладке?
dosikus вне форума   Ответить с цитированием
Старый 11.07.2018, 23:02   #35
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от dosikus Посмотреть сообщение
Да уж ,читаешь ваши страшилки и становится как-то спокойно и легко на душе -слава богу что не выбрал пЫк32...


Может все таки дело в прокладке?

Да я сам в шоке


Ну послюненную проблему в тоже решил, мой косяк.
Расклад такой, вот эта хрень мне портила все:
Код:
#define VirtToPhys(p) (int)p<0?((int)p&0x1fffffffL):(unsigned int)((unsigned char*)p+0x40000000L) 



    DCH0SSA = VirtToPhys((void*)&U2RXREG);     // Source address
    DCH0DSA = VirtToPhys((void*)&rx_buff);     // Destination
в проекте где ПИК32МК она работает, c ПИК32МЗ нет, переделал на:
Код:
#include <sys/kmem.h>


    DCH0SSA = KVA_TO_PA((void*)&U2RXREG);     // Source address
       DCH0DSA = KVA_TO_PA((void*)&rx_buff);     // Destination
и на дисплеи вижу теперь мои данные


в оригинальных примерах от Микрочипа тоже VirtToPhys стоит:

Код:
EC1CLR=0x00010000;           // disable DMA channel 0 interruptsIFS1CLR=0x00010000;           // clear any existing DMA channel 0 interrupt flag
DMACONSET=0x00008000;         // enable the DMA controller
DCH0CON=0x3;                  // channel 0 off, priority 3, no chaining
DCH1CON=0x62;                 // channel 1 off, priority 2
// chain to higher priority
// (channel 0), enable events detection while disabled
DCH0ECON=(27 <<8)| 0x30;      // start IRQ is UART1 RX, pattern enabled
DCH1ECON=(42 <<8)| 0x30;      // start IRQ is UART1 TX, pattern enabled
DCH0DAT=DCH1DAT=’\r’;         // pattern value, carriage return
// program channel 0 transfer
DCH0SSA=VirtToPhys(&U1RXREG); // transfer source physical address
DCH0DSA=VirtToPhys(myBuff);   // transfer destination physical address
DCH0SSIZ=1;                   // source size is 1 byte
DCH0DSIZ=200;                 // dst size at most 200 bytes
DCH0CSIZ=1;                   // one byte per UART transfer request
// program channel 1 transfer
DCH1SSA=VirtToPhys(myBuff);   // transfer source physical address
DCH1DSA=VirtToPhys(&U2TXREG); // transfer destination physical address
DCH1SSIZ=200;                 // source size at most 200 bytes
DCH1DSIZ=0;                   // dst size is 1 byte
DCH1CSIZ=1;                   // one byte per UART transfer request
DCH0INTCLR=0x00ff00ff;        // DMA0: clear events, disable interrupts
DCH1INTCLR=0x00ff00ff;        // DMA1: clear events, disable interrupts
DCH1INTSET=0x00090000;        // DMA1: enable Block Complete and error interrupts
IPC9CLR=0x00001f1f;           // clear the DMA channels 0 and 1 priority and
// sub-priority
IPC9SET=0x00000b16;           // set IPL 5, sub-priority 2 for DMA channel 0
// set IPL 2, sub-priority 3 for DMA channel 1
IEC1SET=0x00020000;           // enable DMA channel 1 interrupt
DCH0CONSET=0x80;              // turn channel on
Gera82 вне форума   Ответить с цитированием
Старый 12.07.2018, 05:44   #36
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: МО
Возраст: 59
Сообщений: 2,339
Вес репутации: 3076/94
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Странный какой то "баг". А сразу проверить в дебаге откуда и куда было сложно? Вроде бы это первое, что нужно сделать....
Марк вне форума   Ответить с цитированием
Старый 12.07.2018, 09:19   #37
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,847
Вес репутации: 3528/76
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Марк
суть даже не в этом.
вот написано что-то camalcase - понятное дело, что все думают что это функция какая-то.

это макрос.

зачем вообще брать в расчет вещи, в которых макросы пишутся не заглавными? не надо так делать.
нужно понимать, что это говнище и еще где-то искать способы решить проблему.
besogon вне форума   Ответить с цитированием
Старый 12.07.2018, 10:31   #38
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от Марк Посмотреть сообщение
Странный какой то "баг". А сразу проверить в дебаге откуда и куда было сложно? Вроде бы это первое, что нужно сделать....

Код:
суть даже не в этом.
вот написано что-то camalcase  - понятное дело, что все думают что это функция какая-то.

это макрос.

зачем вообще брать в расчет вещи, в которых макросы пишутся не заглавными? не надо так делать.
 нужно понимать, что это говнище и еще где-то искать способы решить проблему.
я даже и не думал об этом, этот Макрос работает на ПИК32МК.


Откуда берет микрочип,
VirtToPhys


я вот что нашел:
Код:
extern __inline__ unsigned int __attribute__((always_inline)) _VirtToPhys(const void* p) 
{ 
 return (int)p<0?((int)p&0x1fffffffL):(unsigned int)((unsigned char*)p+0x40000000L); 
}
Gera82 вне форума   Ответить с цитированием
Старый 12.07.2018, 14:25   #39
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: МО
Возраст: 59
Сообщений: 2,339
Вес репутации: 3076/94
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от besogon Посмотреть сообщение
зачем вообще брать в расчет вещи, в которых макросы пишутся не заглавными?
Какая разница что брать в расчет, а что не брать?
Это психология рафинированного программиста. Искать баг на верхнем уровне. То есть не там, где потерял, а там, где светло.
А ДМА - это АППАРАТНЫЙ инструмент. Если транзакции не идут, либо идут, но не оттуда и/или не туда, нужно ПРЕЖДЕ ВСЕГО проверить "адрес на конверте". А потом уже искать кто его таким написал.
Марк вне форума   Ответить с цитированием
Старый 12.07.2018, 15:39   #40
Gera82
Senior Member
 
Аватар для Gera82
 
Регистрация: 13.08.2009
Адрес: Frankfurt / Новосибирск
Возраст: 36
Сообщений: 533
Вес репутации: 349/42
Gera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the roughGera82 is a jewel in the rough
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Цитата:
Сообщение от Марк Посмотреть сообщение
Какая разница что брать в расчет, а что не брать?
Это психология рафинированного программиста. Искать баг на верхнем уровне. То есть не там, где потерял, а там, где светло.
А ДМА - это АППАРАТНЫЙ инструмент. Если транзакции не идут, либо идут, но не оттуда и/или не туда, нужно ПРЕЖДЕ ВСЕГО проверить "адрес на конверте". А потом уже искать кто его таким написал.

а вы как думайте, как я к этому пришел? логично после того, как понял что пакеты приходят и ДМА работает четко, по заданной "траектории", но я не видел данных в буфере,


У меня кстати проблемы с отладкой (ICD3), не всегда работает, часто виснет. таких проблем с 16ти битными "Пуками" не было.
Gera82 вне форума   Ответить с цитированием
Старый 12.07.2018, 16:47   #41
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,847
Вес репутации: 3528/76
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Марк
если у мне нужно dma, то я использую драйвер для dmа.
если его нет - пишу и отлаживаю.

потом он уже работает с чем надо.

и конечно прохладная идея мешать в кучу UART, DMA и.т.д.

если модуль написан плохо то смысл его использовать? тратить силы чтобы с его отладкой?
besogon вне форума   Ответить с цитированием
Старый 12.07.2018, 18:29   #42
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: МО
Возраст: 59
Сообщений: 2,339
Вес репутации: 3076/94
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Невозможно написать модуль с учетом тех МК с которыми дела не имел.
Поэтому гладко бывает только на бумаге.
Или если структура программы обладает высокой избыточностью в расчете на производительность чипа.
Для проектов, где цена МК и его обвеса не слишком важна, наверное это путь, но мне он чужд. Если уж садиться на дорогую платформу, то следует выжать ее досуха, чтобы "не мучил позор за бесцельно прожитые годы" (с)...
Марк вне форума   Ответить с цитированием
Старый 12.07.2018, 19:34   #43
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 31
Сообщений: 1,847
Вес репутации: 3528/76
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: PIC32MK и PIC32MZ -> UART и DMA = проблемы

Марк
во всех pic32m модуль dma примерно одинаковый.
высокой избыточностью - а как Вы собрались это определять? мы же не числодробилки пишем.

есть какое-то ТЗ и его как-то в разумные сроки в разумную цену нужно реализовать.

если стоит mz то скорее всего требовалось TLB и без TLB сложно реализуется тот или иной замысел.

и если Вам понадобится TLB Вы точно также будете искать решение с TLB.
besogon вне форума   Ответить с цитированием
Ответ

Метки
dma, pic32mk, pic32mk pic32mz dma uart, pic32mz, uart


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PIC32MZ, EBI и DMA vladtv Продукция MICROCHIP 11 16.01.2017 03:50
появились датащиты на PIC32MZ EC Алексей Продукция MICROCHIP 154 16.03.2015 10:43
PIC32 DMA UART сбои при передаче valery1966 Продукция MICROCHIP 8 01.07.2014 17:11
DMA with UART gazpr1bor Продукция MICROCHIP 6 27.07.2010 13:27
Проблемы с прерываниями от UART PIC24HJ128GP510. ROGALIK Продукция MICROCHIP 12 06.08.2008 23:01


Часовой пояс GMT +3, время: 08:58.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot