реклама на сайте
подробности

 
 
> Проблема UART на Kinetis K70
Jenya7
сообщение Oct 13 2016, 13:35
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



странная проблема с UART.
сначала инициализация.
CODE

void UART_Init (UART_MemMapPtr uartch, int sysclk, int baud)
{
register uint16_t sbr, brfa;
uint8_t temp;

if (uartch == UART2_BASE_PTR)
{
PORTE_PCR16 = PORT_PCR_MUX(0x3);
PORTE_PCR17 = PORT_PCR_MUX(0x3);
SIM_SCGC4 |= SIM_SCGC4_UART2_MASK;
}

/* Make sure that the transmitter and receiver are disabled while we change settings. */
UART_C2_REG(uartch) &= ~(UART_C2_TE_MASK| UART_C2_RE_MASK );

/* Configure the UART for 8-bit mode, no parity */
UART_C1_REG(uartch) = 0; /* We need all default settings, so entire register is cleared */

/* Calculate baud settings */
sbr = (uint16_t)((sysclk*1000)/(baud * 16));

/* Save off the current value of the UARTx_BDH except for the SBR field */
temp = UART_BDH_REG(uartch) & ~(UART_BDH_SBR(0x1F));

UART_BDH_REG(uartch) = temp | UART_BDH_SBR(((sbr & 0x1F00) >> 8));
UART_BDL_REG(uartch) = (uint8_t)(sbr & UART_BDL_SBR_MASK);

/* Determine if a fractional divider is needed to get closer to the baud rate */
brfa = (((sysclk*32000)/(baud * 16)) - (sbr * 32));

/* Save off the current value of the UARTx_C4 register except for the BRFA field */
temp = UART_C4_REG(uartch) & ~(UART_C4_BRFA(0x1F));

UART_C4_REG(uartch) = temp | UART_C4_BRFA(brfa);

/* Enable receiver and transmitter */
UART_C2_REG(uartch) |= (UART_C2_TE_MASK | UART_C2_RE_MASK | UART_C2_RIE_MASK);

//errors – FOR DEBUG ONLY
UART_C3_REG(uartch) |= UART_C3_PEIE_MASK | UART_C3_FEIE_MASK | UART_C3_NEIE_MASK | UART_C3_ORIE_MASK;

NVIC_EnableIRQ(UART2_RX_TX_IRQn);
//FOR DEBUG ONLY
NVIC_EnableIRQ(UART2_ERR_IRQn );
}

void UART2_RX_TX_IRQHandler(void)
{
if ((UART_S1_REG(channel) & UART_S1_RDRF_MASK))
{
uint8_t chr = UART2->D;
UART_SendByte(UART2, chr);
}
}

void UART2_ERR_IRQHandler(void)
{
uint32_t st = UART2_BASE_PTR->S1;
}

так я посылаю строку на терминал
Код
void UART_SendByte (UART_MemMapPtr channel, char ch)
{
   /* Wait until space is available in the FIFO */
   while(!(UART_S1_REG(channel) & UART_S1_TDRE_MASK));

   /* Send the character */
   UART_D_REG(channel) = (uint8_t)ch;
}

void UART_SendString(UART_MemMapPtr uartChannel, const char *p)
{
   while(*p)
   {
      UART_SendByte(uartChannel, *p++);
   }
}

в main.c
Код
UART_Init (UART2, 60000, 115200);

UART_SendString(UART2, "HELLO EVERYBODY\0");

While (1)
{
}

на терминале вижу мусор. но если ввожу задержку
Код
void UART_SendString(UART_MemMapPtr uartChannel, uint8_t *p)
{
    while(*p)
    {
        UART_SendByte(uartChannel, *p++);
        //~100us
        for (int i = 0; i < 10000; i++)
        {
            asm("NOP");
        }
    }
}

на терминале вижу коректную строку.
также если печатаю попадаю в UART2_ERR_IRQHandler с ошибкой Framing Error .
очень похоже на Framing Error вопрос откуда она береться.

Сообщение отредактировал Jenya7 - Oct 13 2016, 13:36
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 15:32
Рейтинг@Mail.ru


Страница сгенерированна за 0.01379 секунд с 7
ELECTRONIX ©2004-2016