<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>nRF9160 disconnecting uart</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/89709/nrf9160-disconnecting-uart</link><description>Hi 
 we are developing a successor for one of our products based on the nRF9160. One important feature is the debug UART. There are 2 ways to connect to this UART. Either via an USB-UART bridge or an FTDI cable. To save energy the UART gets initialised</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Wed, 13 Jul 2022 06:13:48 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/89709/nrf9160-disconnecting-uart" /><item><title>RE: nRF9160 disconnecting uart</title><link>https://devzone.nordicsemi.com/thread/376703?ContentTypeID=1</link><pubDate>Wed, 13 Jul 2022 06:13:48 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:218dcfd8-72a5-49ec-a975-8badb58ccec5</guid><dc:creator>JoEi</dc:creator><description>&lt;p&gt;Hi Jonathan,&lt;/p&gt;
&lt;p&gt;apparently&amp;nbsp;I was a bit too fast with finding a solution.&lt;/p&gt;
&lt;p&gt;The solution I found works fine at 115200 Baud but fails at higher ones like 1M Baud.&lt;br /&gt;At 1M Baud the old version works perfectly fine.&lt;/p&gt;
&lt;p&gt;I don&amp;#39;t know why it behaves this different at different Baud rates.&lt;br /&gt;Right now it seems that the best solution is a combination of both versions:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;static void UartDrv_CheckUartErr(TUartDrv_Cfg* psCfg, struct uart_event* evt)
{
  int iErr, iErr2 = 0;

  iErr = evt-&amp;gt;data.rx_stop.reason;
  iErr2 = uart_err_check(psCfg-&amp;gt;psDev);
  if(iErr || iErr2)
  {
    atomic_or(&amp;amp;psCfg-&amp;gt;sFlags, UARTDRV_FLAG_RX_ERROR);
    psCfg-&amp;gt;pfEvent(UARTDRV_EV_RX);

    if(iErr &amp;amp; UART_BREAK || iErr2 &amp;amp; UART_BREAK)
      psCfg-&amp;gt;pfEvent(UARTDRV_EV_RXBREAK);
  }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;br /&gt;Johannes&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF9160 disconnecting uart</title><link>https://devzone.nordicsemi.com/thread/376208?ContentTypeID=1</link><pubDate>Fri, 08 Jul 2022 12:24:57 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:7b7e5c88-11fa-426b-b602-97b020450174</guid><dc:creator>JONATHAN LL</dc:creator><description>&lt;p&gt;Thanks for updating with a solution :D&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;Jonathan&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF9160 disconnecting uart</title><link>https://devzone.nordicsemi.com/thread/376055?ContentTypeID=1</link><pubDate>Thu, 07 Jul 2022 15:03:59 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:8d390a79-4230-4c49-a6d5-77e8eca7ec20</guid><dc:creator>JoEi</dc:creator><description>&lt;p&gt;I&amp;#39;ve found a solution for the strange behaviour.&lt;br /&gt;It seems that getting the error reason with uart_err_check(...) is the problem.&lt;br /&gt;&lt;br /&gt;So far&amp;nbsp;my uart callback function looked like this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;static void UartDrv_CheckUartErr(TUartDrv_Cfg* psCfg)
{
  int iErr;

  iErr = uart_err_check(psCfg-&amp;gt;psDev);
  if(iErr)
  {
    atomic_or(&amp;amp;psCfg-&amp;gt;sFlags, UARTDRV_FLAG_RX_ERROR);
    psCfg-&amp;gt;pfEvent(UARTDRV_EV_RX);

    if(iErr &amp;amp; UART_BREAK)
      psCfg-&amp;gt;pfEvent(UARTDRV_EV_RXBREAK);
  }
}

static void UartDrv_RxDisabled(TUartDrv_Cfg* psCfg)
{
  UartDrv_CheckUartErr(psCfg);

  if(atomic_get(&amp;amp;psCfg-&amp;gt;sFlags) &amp;amp; UARTDRV_FLAG_HALF_DUPLEX)
    k_sem_give(&amp;amp;psCfg-&amp;gt;sSemRxDisable);
}

/* UART Async callback, triggered within interrupt context */
static void UartDrv_UartCallback(const struct device* dev,
			  struct uart_event* evt,
			  void* user_data)
{
  TUartDrv_Cfg* psCfg;

  psCfg = UartDrv_GetCfg(user_data);
  if(!psCfg)
    return;

  switch (evt-&amp;gt;type) 
  {
    case UART_TX_DONE:
    {
      UartDrv_TxDone(psCfg);
      break;
    }
    case UART_TX_ABORTED:
    {
      break;
    }
    case UART_RX_RDY:
    {
      UartDrv_RxReady(psCfg, evt);
      break;
    }
    case UART_RX_BUF_REQUEST:
    {
      UartDrv_RxBufRequest(psCfg);
      break;
    }
    case UART_RX_BUF_RELEASED:
    {
      UartDrv_RxBufReleased(psCfg, evt);
      break;
    }
    case UART_RX_DISABLED:
    {
      UartDrv_RxDisabled(psCfg);
      break;
    }
    case UART_RX_STOPPED:
    {
      UartDrv_CheckUartErr(psCfg);
      break;
    }
  }
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#39;ve made some minimal changes so that it now looks like this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;static void UartDrv_CheckUartErr(TUartDrv_Cfg* psCfg, struct uart_event* evt)
{
  int iErr;

  iErr = evt-&amp;gt;data.rx_stop.reason;
  if(iErr)
  {
    atomic_or(&amp;amp;psCfg-&amp;gt;sFlags, UARTDRV_FLAG_RX_ERROR);
    psCfg-&amp;gt;pfEvent(UARTDRV_EV_RX);

    if(iErr &amp;amp; UART_BREAK)
      psCfg-&amp;gt;pfEvent(UARTDRV_EV_RXBREAK);
  }
}

static void UartDrv_RxDisabled(TUartDrv_Cfg* psCfg, struct uart_event* evt)
{
  UartDrv_CheckUartErr(psCfg, evt);

  if(atomic_get(&amp;amp;psCfg-&amp;gt;sFlags) &amp;amp; UARTDRV_FLAG_HALF_DUPLEX)
    k_sem_give(&amp;amp;psCfg-&amp;gt;sSemRxDisable);
}

/* UART Async callback, triggered within interrupt context */
static void UartDrv_UartCallback(const struct device* dev,
			  struct uart_event* evt,
			  void* user_data)
{
  TUartDrv_Cfg* psCfg;

  psCfg = UartDrv_GetCfg(user_data);
  if(!psCfg)
    return;

  switch (evt-&amp;gt;type) 
  {
    case UART_TX_DONE:
    {
      UartDrv_TxDone(psCfg);
      break;
    }
    case UART_TX_ABORTED:
    {
      break;
    }
    case UART_RX_RDY:
    {
      UartDrv_RxReady(psCfg, evt);
      break;
    }
    case UART_RX_BUF_REQUEST:
    {
      UartDrv_RxBufRequest(psCfg);
      break;
    }
    case UART_RX_BUF_RELEASED:
    {
      UartDrv_RxBufReleased(psCfg, evt);
      break;
    }
    case UART_RX_DISABLED:
    {
      UartDrv_RxDisabled(psCfg, evt);
      break;
    }
    case UART_RX_STOPPED:
    {
      UartDrv_CheckUartErr(psCfg, evt);
      break;
    }
  }
}
&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;The major difference is that I now use evt-&amp;gt;data.rx_stop.reason instead of uart_err_check.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF9160 disconnecting uart</title><link>https://devzone.nordicsemi.com/thread/376012?ContentTypeID=1</link><pubDate>Thu, 07 Jul 2022 12:35:12 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:90b0f883-643f-4ae9-813e-9dbfc04c337c</guid><dc:creator>JoEi</dc:creator><description>&lt;p&gt;Something I&amp;#39;ve observed was that UART_BREAK was recognised&amp;nbsp;when&amp;nbsp;I&amp;#39;ve established a connection with J-Mem.&lt;br /&gt;When disconnecting J-Mem it stopped being recognised.&amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>