Отговори на тема  [ 3 мнения ] 
RQ: AT32UC3C2: проблем с USART (AVR32_USART_CSR_OVRE_MASK) 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение 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;
}


Нед Мар 03, 2013 4:42 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: RQ: AT32UC3C2: проблем с USART (AVR32_USART_CSR_OVRE_MAS
overflow значи, че не изпразваш дата регистъра достъчно бързо и идват байтове дето изпускаш.
Чистенето на флага е описано в дейташита, но това ти е по-малкия проблем :-)


Нед Мар 03, 2013 6:40 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Съб Сеп 25, 2004 10:32 pm
Мнения: 710
Мнение Re: RQ: AT32UC3C2: проблем с USART (AVR32_USART_CSR_OVRE_MAS
Мерси отговора.

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

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


Нед Мар 03, 2013 7:04 pm
Профил ICQ WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 3 мнения ] 

Кой е на линия

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


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

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