Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

RQ: AT32UC3C2: проблем с USART (AVR32_USART_CSR_OVRE_MASK)
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=11159
Страница 1 от 1

Автор:  NikB [ Нед Мар 03, 2013 4:42 pm ]
Заглавие:  RQ: AT32UC3C2: проблем с USART (AVR32_USART_CSR_OVRE_MASK)

Честит празник, на който празнува! Независимостта е хубаво нещо, уверен съм, че нашето общество някога ще си я спечели.

По темата:
Ще съм благодарен за всяка помощ, съвет и препоръка.

RQ: AT32UC3C2: проблем с USART (AVR32_USART_CSR_OVRE_MASK)

Програмирам чипа, девайстът тръгва (лампичките си мигат), изпраща стринг по USART (приемам го на PC), мога и 100 стринга да изпратя, но когато от PC му изпратя стринг към девайса, още първия път, когато
usart_test_hit(usartPorts[uartPort])
върне TRUE
проверката в ASF, usart.c,
функция
Код:
int usart_read_char(volatile avr32_usart_t *usart, int *c)
открива, проблем и връща USART_RX_ERROR от тука:
Код:
  if (usart->csr & (AVR32_USART_CSR_OVRE_MASK |
                    AVR32_USART_CSR_FRAME_MASK |
                    AVR32_USART_CSR_PARE_MASK))
    return USART_RX_ERROR;

Как да ги нулирам тия (май AVR32_USART_CSR_OVRE_MASK е проблема)?

ето малко код, на който му се чете:

Код:
Bool UART_Read( const eUART_PORT uartPort, WORD* pnLen, U8* pbtData)
{
   WORD len = *pnLen;
   // NOTE: For performance optimization - no range check if the uartPort is in range   
   if(usartPorts[uartPort] == NULL)
   {
      errors[uartPort] = eUART_DRV_USART_PORT_NOT_OPENED;
      return FALSE;   
   }
   
   *pnLen = 0;
   
   while(len)
   {      
      if( !usart_test_hit(usartPorts[uartPort]) )
      {
         // no more characters
         return TRUE;      
      }
      else
      {
         int ch;
         if( usart_read_char(usartPorts[uartPort], &ch) == USART_SUCCESS )
         {
            *pbtData++ = (U8)ch;                  
            (*pnLen)++;   
            len--;
         }
         else
         {
             /* NikB N303 */
//Read only                usartPorts[uartPort]->csr &= ( ! (  AVR32_USART_CSR_OVRE_MASK | AVR32_USART_CSR_FRAME_MASK | AVR32_USART_CSR_PARE_MASK));
             errors[uartPort] = eUART_DRV_RECEIVE_ERROR;
             return FALSE;
         }
      }
   }
   errors[uartPort] = eUART_DRV_RECEIVE_ERROR;
   return FALSE;
}


това по-горе се вика от това по-долу


Код:
Bool COM_ReceiveLine(char* psz, Bool* overflow)
{
   static int n = 0;
//N303   static char buf[MAX_VCOM_REC_BUF];
    static U8 buf[MAX_VCOM_REC_BUF];

    bool xRet = FALSE;

    U8 xbuf[MAX_VCOM_REC_BUF];
   U8 bt = 0;
    U8 i;
    WORD nLen;
   
   *overflow = FALSE;
   
   if(!bInit)
   {
      return FALSE;
   }
   
//N303   if( UART_ReadByte( serCom, &bt) )
//N303  while (usart_read_char( serCom, &bt)=USART_SUCCESS)
    nLen = MAX_VCOM_REC_BUF;
    UART_Read( serCom, &nLen, &xbuf[0]);
    if (nLen>0)
   {
        i=0;
        while (i<nLen)
        {
            bt = buf[i];
         
          if(bt == 13)  // skip CR, CR/LF sequence expected as EOL
            {
            }           
            else
            {
             if(bt == 10)  // check LF
             {
                 for(int j=0; j<i; j++)
                 {
                     *(psz+j) = buf[j];
                 }
                 memmove( &psz[0], &buf[0], i); // ??? Len = i*sizeof(buf[0])
                 *(psz+i) = 0; // NULL terminated
                 n = 0;
                    if (! overflow){
                     xRet = TRUE; // true, if not overflow detect
                    }                   
             }
                else
                {
                  // check for legal characters, ignore non-printable characters and ASCII codes above 7F hex
                  if( bt > 0x7  && bt <= 0x7F)
                  {
                    buf[n++] = bt;
                     if(n >= MAX_VCOM_REC_BUF-1)
                     {
                        *overflow = TRUE;
                        n = 0;  // buffer overflow
                     }
                    }
                }
            }
          i++;
        }       
   }
   
   return xRet;
}

Автор:  miro_atc [ Нед Мар 03, 2013 6:40 pm ]
Заглавие:  Re: RQ: AT32UC3C2: проблем с USART (AVR32_USART_CSR_OVRE_MAS

overflow значи, че не изпразваш дата регистъра достъчно бързо и идват байтове дето изпускаш.
Чистенето на флага е описано в дейташита, но това ти е по-малкия проблем :-)

Автор:  NikB [ Нед Мар 03, 2013 7:04 pm ]
Заглавие:  Re: RQ: AT32UC3C2: проблем с USART (AVR32_USART_CSR_OVRE_MAS

Мерси отговора.

Реших преди да се захвана с приемане по прекъсване, да видя това дали не мога да го подкарам.
Не съм чел достатъчно дейташита - явно ще трябва да чета :).
Таскът върви на 100ms, явно трябва да видя колко му е приемния буфер (ако има такъв).
Или да пробвам по по-малко байтове :), да видя колко е буфера :D.

ПП
Сега си спомням, че на времето имаше схеми с изходен буфер от два бита :) - май беше Fx604 - модемче на 1200бода (а входният им беше от един байт, освен приемния регистър :)).

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/