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:


3 comentarios:

  1. Cual es la contraseña del .rar adjunto?

    ResponderBorrar
  2. Este comentario ha sido eliminado por el autor.

    ResponderBorrar
  3. Me gustaría descomprimir el .rar que se pone en el post. Cual es la contraseña?

    ResponderBorrar