Hello,I'm trying to get UART working in our project. I'm working on RA6M5 MCU.I looked at the example "ra-fsp-examples-master\ra-fsp-examples-master\example_projects\ek_ra6m5\sci_uart\sci_uart_ek_ra6m5_ep\iar" in IAR 9.10. I noticed that the TX is P101, RX is P100. For us, the TX is P409; the RX is P408. How can I change the PIN configuration to make it work for our design?Actually I also created my project. I added the UART stack(r_sci_uart). When I tried to configure the RX and TX, I can't configure it for P408 and P409. How can I setup the PIN for RX and TX?Is there any document about how to get UART working?Thanks!
in the pins tab of the configurator, set the pins for SCI channel 3 :-
Then in the properties of the SCI UART driver, set the channel you want to use, and the pin setting for that channel of SCI will be shown :-
Hi Jeremy,
I selected SCI channel 3 for P408/409. The UART works. I saw some string printed out. But the characters are gibberish. They are not the proper characters. What could be wrong?
By the way, is there a mapping table that shows the PIN vs the channels? Such as P100/P100 is channel 0, P408/P409 is channel 3, etc.
Here is the configuration from my Smart Configurator about the UART:
Thanks!
Hi,
Possibly...
I was interrupting on every received character, and....
I was using "R_SCI_UART_Read(&g_uart0_ctrl, &rx485Char, 1);" to read chars and every second on 19K2 baud was incorrect.
I used "rx485Char = (uint8_t)(p_args -> data);"
and all my problems went away
I hope this helps
How are you wirting the data to the UART? The call to R_SCI_UART_Write() is not a blocking API, it will set up the write to the UART, but the completion will be signalled by the UART callback, so you should not make another call to R_SCI_UART_Write() unitl the current write transfer has finished.
We don't call R_SCI_UART_Write(). In the sample project of "ra-fsp-examples-master\ra-fsp-examples-master\example_projects\ek_ra6m5\sci_uart\sci_uart_ek_ra6m5_ep\e2studio", there is a PIN P104 for timer. In our product, there is no such PIN for timer. Instead, we overwrite the __write() as we use IAR. This approach works in another product which uses RA2A1 MCU. Please see the implementation in attached file.
Thanks.
#include "r_sci_uart.h" #include "r_uart_api.h" #include "common_data.h" #include "bsp_api.h" #include "r_ioport_api.h" #include "hal_data.h" #include "testshell.h" // Definitions requried for overwriding __write #include <yfuns.h> // Definitions requried for overwriding __write #include "string.h" #include "interrupt_ctl.h" #include "lowlevel_init.h" extern uint32_t RAMVECTOR_START[]; // RAM vector table extern uint32_t RAMVECTOR_END[]; extern ioport_instance_ctrl_t gpio_ctrl; /***************UART settings*************************************************/ sci_uart_instance_ctrl_t g_uart_ctrl; // no UART rx support atm. #define SCI_UART_CFG_RX_ENABLE 0 #define GPIO_PIN_UART_TX BSP_IO_PORT_04_PIN_09 #define GPIO_PIN_UART_RX BSP_IO_PORT_04_PIN_08 baud_setting_t g_uart_baud_setting = { /* Baud rate calculated with 0.014% error. */ .abcse = 0, .abcs = 0, .bgdm = 1, .cks = 0, .brr = 38, .mddr = (uint8_t)184, .brme = true }; /** UART extended configuration for UARTonSCI HAL driver */ const sci_uart_extended_cfg_t g_uart_cfg_extend = { .clock = SCI_UART_CLOCK_INT, .rx_edge_start = SCI_UART_START_BIT_FALLING_EDGE, .noise_cancel = SCI_UART_NOISE_CANCELLATION_DISABLE, .rx_fifo_trigger = SCI_UART_RX_FIFO_TRIGGER_MAX, .p_baud_setting = &g_uart_baud_setting, .flow_control = SCI_UART_FLOW_CONTROL_RTS, #if 0xFF != 0xFF .flow_control_pin = BSP_IO_PORT_FF_PIN_0xFF, #else .flow_control_pin = (bsp_io_port_pin_t) UINT16_MAX, #endif }; /** UART interface configuration */ const uart_cfg_t g_uart_cfg = { .channel = 3, .data_bits = UART_DATA_BITS_8, .parity = UART_PARITY_OFF, .stop_bits = UART_STOP_BITS_1, .p_callback = NULL, .p_context = NULL, .p_extend = &g_uart_cfg_extend, #define RA_NOT_DEFINED (1) #if (RA_NOT_DEFINED == RA_NOT_DEFINED) .p_transfer_tx = NULL, #else .p_transfer_tx = &RA_NOT_DEFINED, #endif #if (RA_NOT_DEFINED == RA_NOT_DEFINED) .p_transfer_rx = NULL, #else .p_transfer_rx = &RA_NOT_DEFINED, #endif #undef RA_NOT_DEFINED .rxi_ipl = (12), .txi_ipl = (12), .tei_ipl = (12), .eri_ipl = (12), #if defined(VECTOR_NUMBER_SCI3_RXI) .rxi_irq = VECTOR_NUMBER_SCI3_RXI, #else .rxi_irq = FSP_INVALID_VECTOR, #endif #if defined(VECTOR_NUMBER_SCI3_TXI) .txi_irq = VECTOR_NUMBER_SCI3_TXI, #else .txi_irq = FSP_INVALID_VECTOR, #endif #if defined(VECTOR_NUMBER_SCI3_TEI) .tei_irq = VECTOR_NUMBER_SCI3_TEI, #else .tei_irq = FSP_INVALID_VECTOR, #endif #if defined(VECTOR_NUMBER_SCI3_ERI) .eri_irq = VECTOR_NUMBER_SCI3_ERI, #else .eri_irq = FSP_INVALID_VECTOR, #endif }; /* Instance structure to use this module. */ const uart_instance_t g_uart = { .p_ctrl = &g_uart_ctrl, .p_cfg = &g_uart_cfg, .p_api = &g_uart_on_sci }; void dbg_uart_init(void) { // initialize the tx pin R_IOPORT_PinCfg(&gpio_ctrl, GPIO_PIN_UART_TX, ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)); // initialize the rx pin R_IOPORT_PinCfg(&gpio_ctrl, GPIO_PIN_UART_RX, ((uint32_t) IOPORT_CFG_PERIPHERAL_PIN | (uint32_t) IOPORT_PERIPHERAL_SCI1_3_5_7_9)); // Initialize UART channel with baud rate 115200 & without interrupt(polling based) R_SCI_UART_Open(&g_uart_ctrl, &g_uart_cfg); } /* * send uart data using polling, supports only 8-bit data */ void DumpChar(char data) { while (g_uart_ctrl.p_reg->SSR_SMCI_b.TDRE == 0); g_uart_ctrl.p_reg->TDR = data; g_uart_ctrl.p_reg->SSR_SMCI_b.TDRE = 0; } // Write function for IAR IO layer size_t __write(int handle, const unsigned char * buffer, size_t size) { size_t nChars = 0; if (buffer == 0) { /* * This means that we should flush internal buffers. Since we * don't we just return. (Remember, "handle" == -1 means that all * handles should be flushed.) */ return 0; } /* This template only writes to "standard out" and "standard err", * for all other file handles it returns failure. */ if (handle != _LLIO_STDOUT && handle != _LLIO_STDERR) { return _LLIO_ERROR; } for (/* Empty */; size != 0; --size) { DumpChar((uint8_t)*buffer++); ++nChars; } return nChars; }
Thanks Ian.
Could you post more code? I'd like to see how you implement it.
Sorry for the delayed reply, life is just hectic at the moment.
In the FSP the interrupt was set like..
The int looks like:
......
#include "projectZone.h"
void comms485Int(uart_callback_args_t *p_args){ if (p_args -> event == UART_EVENT_RX_CHAR) { //R_SCI_UART_Read(&g_uart0_ctrl, &rx485Char, 1);
rx485Char = (uint8_t)(p_args -> data);
handle485Serial(); comms485Received = 1; // turn the comms LED on }
/* if (p_args -> event == UART_EVENT_TX_COMPLETE) { RX485EN; } */
}
FSP 3.6 now has RS485 Tx enable built in, which is why the TX section is commented out.
The system is strictly poll, and response.
The handle485Serial routine is very short and handles the message byte by byte, and constructs a transmit array on the fly, and executes the following when ready, and then goes back into listening mode.
//TX485EN; status = R_SCI_UART_Write(&g_uart0_ctrl, &tx485Buff[0], num485TxChars);
Hi Pilot-
Here are some additional points to consider fixing:
bsp_clock_init() is not called.
System clocks are not setup properly.
BOARD_ClockInit() calls hal_entry().
Hi Warren,
I checked. bsp_clock_init() is called by SystemInit() which is called by Reset_Handler(). We don't call BOARD_ClockInit().
Speaking of "System clocks are not setup properly", we don't setup system clock. Can you tell me where to find the "system clocks setup"?
H Pilot-
I me3an configuring the clocks in the clock tab as you show above. Just check to see if they are set properly for your application. You might compare it to the example project to see if yours is similar.
Thanks. I compared the clock configuration between mine and the sample project's. They are the same.