viernes, 24 de febrero de 2017

PRACTICA # 3 UART

OBJETIVO:
       Se hará uso del módulo del puerto serial UART2 (SCI2) con el que cuenta el MCU R5F563NB de la tarjeta de evaluación YRDKRX63N. Se le enviara un dato de 8 bits por medio de una hypeterminal serial, el MCU la recibe en su interrupción y ese mismo dato de 8 bits lo reenvía de regreso a la hypeterminal.
  •  Configurar la unidad UART2 (SCI2)
  •  Habilitar ambas interrupciones (Send – Receive)
  •  Hacer Eco del dato recibido

DESARROLLO:

  • Del manual Renesas RX63N RDK User's Manual ubicamos los pines del UART2: 

  • Para poder utilizar el conversor USB-SERIAL necesitamos soldar 2 cables (RX y TX) a la tarjeta YRDKRX63N (ya que no se dispone de un socket para estas señales). Los cuales irán a TXD2, RXD2 y GND de la figura página 1 del documento YRDKRX63N schematic.pdf


  •  La conexión con el USB-Serial será:
Conectamos DB9_TxD --> RxD, TxD--> DB9_RxD y GND --> GND


PASOS:
  •  Creación de un proyecto:
1.- Abrir el software e2studio
2.- New/ C Project / Renesas RXC ToolChain


3.- Seleccionar el target R5F563NB, debug hardware Segger jLink, después next


4.- Seleccionar C/C++ Source file y por ultimo Finish.


5.- Configuraremos el UART 2 por medio del módulo SCI2 a 9600 bps, 1 bit stop y no paridad en el archivo uart.c:

/* System Clock Settings */
#define                XTAL_FREQUENCY  (12000000L)
#define                PCLK_MUL        (4)
#define                PCLK_FREQUENCY  (XTAL_FREQUENCY * PCLK_MUL)

#define SCI2_BAUDRATE 9600

extern void sci2_init(void)
{
            //SYSTEM.PRCR.WORD = 0xA50B; /* Protect off */

            /* clear ACSE Bit (All-Module Clock Stop Mode Enable) */
            SYSTEM.MSTPCRA.BIT.ACSE = 0;

            MSTP(SCI2) = 0; /* Enable module */

            //SYSTEM.PRCR.WORD = 0xA500; /* Protect on  */

            /* Clear bits TIE, RIE, RE, and TEIE in SCR to 0. Set CKE to internal. */
            SCI2.SCR.BYTE = 0; /* Reset module */

            /* Set up the UART I/O port and pins. */
            MPC.P50PFS.BYTE = 0x4A; /* P50 is TxD2 */
            MPC.P52PFS.BYTE = 0x4A; /* P52 is RxD2 */

            PORT5.PDR.BIT.B0 = 1; /* TxD2 is output. */
            PORT5.PDR.BIT.B2 = 0; /* RxD2 is input. */

            PORT5.PMR.BIT.B0 = 1; /* TxD2 is peripheral. */
            PORT5.PMR.BIT.B2 = 1; /* RxD2 is peripheral. */

            SCI2.SCR.BIT.CKE = 0;   /* Use internal baudrate generator, SCK pin function os IO port */
            SCI2.SMR.BYTE = 0;      /* PCLK/1, 8N1, async mode, multiprocessor mode disabled */
            SCI2.SCMR.BIT.SMIF = 0; /* Not smart card mode */
            SCI2.SCMR.BIT.SINV = 0; /* No TDR inversion */
            SCI2.SCMR.BIT.SDIR = 0; /* LSB first */
            SCI2.SEMR.BIT.ACS0 = 0; /* Use external clock */
            SCI2.SEMR.BIT.ABCS = 0; /* 16 base clock cycles for 1 bit period */

            /* Set baudrate */
            /* For 16 base clock cycles change formula to PCLK / (32 * BAUD ) - 1 */
            /* For 8 base clock cycles change formula to PCLK / (16 * BAUD ) - 1 */
            // set for 9600BPS with pclk/1   -> n = 0
            // (48000000/64*(2^[(2*n)-1)]*9600)-1
            SCI2.BRR = PCLK_FREQUENCY / (32 * SCI2_BAUDRATE) - 1;

            /* Reset interrupt flags */
            IR(SCI2, TXI2)= 0;
            IR(SCI2, RXI2)= 0;

            /* Set priorities */
            IPR(SCI2, TXI2)= 3;  // highest = 15
            IPR(SCI2, RXI2)= 3;  // highest = 15

            /* Enable interrupts */
            IEN(SCI2, RXI2)= 1;   // Enable Interrupt RX
            IEN(SCI2, TXI2)= 1;   // Enable Interrupt TX

            SCI2.SCR.BYTE |= 0xF0; //enable tx/rx  NOTA: No se puede hacer funcionar el uart si se escriben los bits individuales de abajo ;(

            //SCI2.SCR.BIT.RIE = 1; /* Enable RX interrupt flag */
            //SCI2.SCR.BIT.TIE = 1; /* Enable TX interrupt flag */
            //SCI2.SCR.BIT.RE = 1; /* Enable receiver  */
            //SCI2.SCR.BIT.TE = 1; /* Enable transmitter */
}

6.- Agregaremos el siguiente código a las 2 interrupciones que está en el archivo interrupt_handlers.c

// SCI2_RXI2
void Excep_SCI2_RXI2(void)
{
            unsigned char data_uart;
            data_uart = SCI2.RDR;
            SCI2.TDR = data_uart;
            IEN(SCI2, TXI2) = 1;   // Enable Interrupt TX2
}

// SCI2_TXI2
void Excep_SCI2_TXI2(void)
{
            IEN(SCI2, TXI2)= 0;   // Disable TX2 interrupt */
}

Como se puede observar lo que recibe data_uart en su interrupción de vector Excep_SCI2_RXI2 es cargado al registro SCI2.TDR y se habilita su interrupción TXI2 para que lo envié de regreso al puerto UART y así hacer eco de todo lo que se reciba.

  • Agregar código, compilar y debug:
1.- Bajar el código de:
--> Practica #3

2.- Compilar con el icono del martillo y debug con el icono del insecto:


3.- Abrir Comm operator u alguna otra hypeterminal serial, configurarla a 9600 bps:


CONEXIÓN:


No hay comentarios.:

Publicar un comentario