This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

ERRORSRC 0x1 on UART handler

Hello,

On my custom board, I'm receiving chunks of UART data, without flow control, at 115200bps. Sometimes (its quite frequent now... sometimes after 10 chunks, sometimes after 100 chunks), im getting ERRORSRC 1 on APP_ERROR_HANDLER(p_event->data.error_communication); line.

My board doesn't include a 32kHz oscillator, and Im using NRF_CLOCK_LFCLKSRC_RC_250_PPM_250MS_CALIBRATION as my clock source (I don't care about current consumption). I'm also using SDK 8 with SoftDevice 8.0.0.

What would cause this? Any idea how to solve it?

edit Edited title so it makes more clear. Thanks @RK

Parents
  • No you're not getting that error. That field in the event structure doesn't return an NRF_ERROR_* code (look in the documentation or just read the code), it returns the raw error from ERRORSRC in the UART.

    If you then look at the nRF52 series documentation for ERRORSRC you'll see '1', which is the error code you're getting, is an overrun error, which, since you're trying to do no-flow-control at 115,200 is not very surprising.

    You can probably run at that baud rate without flow control if the chip's not doing anything else, I'm going to guess you're trying it whilst using the softdevice and that's not going to work.

  • Faulty DK, no that's about the last thing I would think is likely. 115200baud is one byte every 70us. The UART has space for 6 bytes, so that's 420us worth of data. That means if data is streaming in at that rate you have to service it at least every 420us and remove all 6 bytes or it will overrun.

    Those timings are much shorter than the stated timings for which the softdevice can block thread mode code. Advertising it can block up to 1700us, in connection 1180 to nearly 6000us. One single time interval of more than 420us and without flow control you overrun.

    I can't say why it worked before. Perhaps your advertisements were shorter, perhaps you were sending less data, perhaps you were just ucky in your testing. The point is, with the documented times the softdevice blocks thread mode code, you cannot reliably run anywhere near 115200 baud without flow control

Reply
  • Faulty DK, no that's about the last thing I would think is likely. 115200baud is one byte every 70us. The UART has space for 6 bytes, so that's 420us worth of data. That means if data is streaming in at that rate you have to service it at least every 420us and remove all 6 bytes or it will overrun.

    Those timings are much shorter than the stated timings for which the softdevice can block thread mode code. Advertising it can block up to 1700us, in connection 1180 to nearly 6000us. One single time interval of more than 420us and without flow control you overrun.

    I can't say why it worked before. Perhaps your advertisements were shorter, perhaps you were sending less data, perhaps you were just ucky in your testing. The point is, with the documented times the softdevice blocks thread mode code, you cannot reliably run anywhere near 115200 baud without flow control

Children
No Data
Related