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:
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: