<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Issue with LPUART single-wire mode on KL17 in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Issue-with-LPUART-single-wire-mode-on-KL17/m-p/577831#M34282</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am developing code on&amp;nbsp;a custom&amp;nbsp;KL17 board, and have struck an issue with running the low-power&amp;nbsp;uart in single-wire mode.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Most of the time my lpuart is in single-wire input&amp;nbsp;mode (ie&amp;nbsp;having both&amp;nbsp;receiver and transmitter enabled but the Tx Pin Direction set to Input). &amp;nbsp;At regular intervals however it transmits&amp;nbsp;a message by:&lt;/P&gt;&lt;P&gt;1. Setting&amp;nbsp;the Tx Pin Direction to Output&lt;/P&gt;&lt;P&gt;2. Sending a packet of a few bytes with a blocking write command&lt;/P&gt;&lt;P&gt;3. Setting the Tx Pin Direction back to Input&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The problem I have encountered with&amp;nbsp;the above approach is that&amp;nbsp;the last byte of a packet&amp;nbsp;is not sent when it should, but in fact gets sent as the first byte of the subsequent packet.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What appears to be happening is that in step 3, the Tx pin direction change occurs immediately, before the last byte has been transmitted, so that last byte gets left in the buffer until next time the tx pin direction is set to Output.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is some sample code of what I was doing, using KSDK v2.0 calls to change the pin direction and write bytes:&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;outputChars&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0x01u&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
outputChars&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0x02u&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
outputChars&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0x03u&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
outputChars&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0x04u&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Output mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Output&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// write bytes&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_WriteBlocking&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; outputChars&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Input mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Input&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Instead of seeing packets of bytes coming through as 0x01, 0x02, 0x03, 0x04, I see packets like&amp;nbsp;0x04, 0x01, 0x02, 0x03. &amp;nbsp;This has been confirmed independently on a logic analyser and&amp;nbsp;DSO.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The KL17z reference manual does have this to say about TXDIR which controls the tx pin direction:&lt;/P&gt;&lt;P&gt;&lt;EM&gt;"When clearing TXDIR, the transmitter will finish&amp;nbsp;receiving the current character (if any) before the receiver starts receiving data from the LPUART_TX pin".&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Firstly, this is a confusing statement which I think is incorrect. &amp;nbsp;I&amp;nbsp;believe that it should state:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;"When clearing TXDIR, the transmitter will finish &lt;STRONG&gt;transmitting&amp;nbsp;&lt;/STRONG&gt;the current character (if any) before the receiver starts receiving data from the LPUART_TX pin".&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;Secondly, my experience above suggests that the lpuart does&amp;nbsp;not follow this stated behaviour.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TXDIR&amp;nbsp;is a field in the LPUARTx_CTRL register, and&amp;nbsp;the reference manual makes this comment:&lt;/P&gt;&lt;P&gt;&lt;EM&gt;"This read/write register controls various optional features of the LPUART system. This&amp;nbsp;register should only be altered when the transmitter and receiver are both disabled."&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;Unfortunately, both the transmitter and receiver are enabled/disabled by this same register, so if you want to disable tx and rx it&amp;nbsp;appears there is no choice except to alter this register anyway.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Nevertheless, I have tried&amp;nbsp;to&amp;nbsp;ensure both tx and rx were disabled before changing the tx pin direction (as shown in code below), but this has no effect - the problem remains:&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="comment token"&gt;// disable Rx&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_EnableRx&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; false&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Output mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Output&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// enable Tx&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_EnableTx&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; true&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// write bytes&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_WriteBlocking&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; outputChars&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// disable Tx&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_EnableTx&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; false&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Input mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Input&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// enable Rx&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_EnableRx&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; true&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The only method I have found that works is to explicitly wait until the last character has been sent (by checking the transmit data register empty flag) before returning the tx pin direction to Input, as shown below:&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Output mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Output&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// write bytes&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_WriteBlocking&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; outputChars&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// explicitly wait until tx data register is empty (ie last character has been sent)&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// before attempting to change tx pin direction&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;while&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;!&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;STAT &lt;SPAN class="operator token"&gt;&amp;amp;&lt;/SPAN&gt; LPUART_STAT_TDRE_MASK&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Input mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Input&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So, is this expected behaviour and the documentation is wrong ?&lt;/P&gt;&lt;P&gt;Or is it a&amp;nbsp;hardware bug (and the documentation is still wrong) ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Wed, 31 Aug 2016 03:58:23 GMT</pubDate>
    <dc:creator>geoff_s</dc:creator>
    <dc:date>2016-08-31T03:58:23Z</dc:date>
    <item>
      <title>Issue with LPUART single-wire mode on KL17</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Issue-with-LPUART-single-wire-mode-on-KL17/m-p/577831#M34282</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I am developing code on&amp;nbsp;a custom&amp;nbsp;KL17 board, and have struck an issue with running the low-power&amp;nbsp;uart in single-wire mode.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Most of the time my lpuart is in single-wire input&amp;nbsp;mode (ie&amp;nbsp;having both&amp;nbsp;receiver and transmitter enabled but the Tx Pin Direction set to Input). &amp;nbsp;At regular intervals however it transmits&amp;nbsp;a message by:&lt;/P&gt;&lt;P&gt;1. Setting&amp;nbsp;the Tx Pin Direction to Output&lt;/P&gt;&lt;P&gt;2. Sending a packet of a few bytes with a blocking write command&lt;/P&gt;&lt;P&gt;3. Setting the Tx Pin Direction back to Input&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The problem I have encountered with&amp;nbsp;the above approach is that&amp;nbsp;the last byte of a packet&amp;nbsp;is not sent when it should, but in fact gets sent as the first byte of the subsequent packet.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;What appears to be happening is that in step 3, the Tx pin direction change occurs immediately, before the last byte has been transmitted, so that last byte gets left in the buffer until next time the tx pin direction is set to Output.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Here is some sample code of what I was doing, using KSDK v2.0 calls to change the pin direction and write bytes:&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;outputChars&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;0&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0x01u&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
outputChars&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;1&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0x02u&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
outputChars&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;2&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0x03u&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
outputChars&lt;SPAN class="punctuation token"&gt;[&lt;/SPAN&gt;&lt;SPAN class="number token"&gt;3&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;]&lt;/SPAN&gt; &lt;SPAN class="operator token"&gt;=&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;0x04u&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Output mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Output&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// write bytes&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_WriteBlocking&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; outputChars&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Input mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Input&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Instead of seeing packets of bytes coming through as 0x01, 0x02, 0x03, 0x04, I see packets like&amp;nbsp;0x04, 0x01, 0x02, 0x03. &amp;nbsp;This has been confirmed independently on a logic analyser and&amp;nbsp;DSO.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The KL17z reference manual does have this to say about TXDIR which controls the tx pin direction:&lt;/P&gt;&lt;P&gt;&lt;EM&gt;"When clearing TXDIR, the transmitter will finish&amp;nbsp;receiving the current character (if any) before the receiver starts receiving data from the LPUART_TX pin".&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Firstly, this is a confusing statement which I think is incorrect. &amp;nbsp;I&amp;nbsp;believe that it should state:&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;EM&gt;"When clearing TXDIR, the transmitter will finish &lt;STRONG&gt;transmitting&amp;nbsp;&lt;/STRONG&gt;the current character (if any) before the receiver starts receiving data from the LPUART_TX pin".&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;Secondly, my experience above suggests that the lpuart does&amp;nbsp;not follow this stated behaviour.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;TXDIR&amp;nbsp;is a field in the LPUARTx_CTRL register, and&amp;nbsp;the reference manual makes this comment:&lt;/P&gt;&lt;P&gt;&lt;EM&gt;"This read/write register controls various optional features of the LPUART system. This&amp;nbsp;register should only be altered when the transmitter and receiver are both disabled."&lt;/EM&gt;&lt;/P&gt;&lt;P&gt;Unfortunately, both the transmitter and receiver are enabled/disabled by this same register, so if you want to disable tx and rx it&amp;nbsp;appears there is no choice except to alter this register anyway.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Nevertheless, I have tried&amp;nbsp;to&amp;nbsp;ensure both tx and rx were disabled before changing the tx pin direction (as shown in code below), but this has no effect - the problem remains:&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="comment token"&gt;// disable Rx&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_EnableRx&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; false&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Output mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Output&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// enable Tx&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_EnableTx&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; true&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// write bytes&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_WriteBlocking&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; outputChars&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// disable Tx&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_EnableTx&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; false&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Input mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Input&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// enable Rx&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_EnableRx&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; true&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The only method I have found that works is to explicitly wait until the last character has been sent (by checking the transmit data register empty flag) before returning the tx pin direction to Input, as shown below:&lt;/P&gt;&lt;PRE class="language-c line-numbers"&gt;&lt;CODE&gt;&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Output mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Output&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// write bytes&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_WriteBlocking&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; outputChars&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; &lt;SPAN class="number token"&gt;4&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// explicitly wait until tx data register is empty (ie last character has been sent)&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// before attempting to change tx pin direction&lt;/SPAN&gt;
&lt;SPAN class="keyword token"&gt;while&lt;/SPAN&gt; &lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;&lt;SPAN class="operator token"&gt;!&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="operator token"&gt;-&amp;gt;&lt;/SPAN&gt;STAT &lt;SPAN class="operator token"&gt;&amp;amp;&lt;/SPAN&gt; LPUART_STAT_TDRE_MASK&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN class="punctuation token"&gt;{&lt;/SPAN&gt;
&amp;nbsp; &lt;SPAN class="punctuation token"&gt;}&lt;/SPAN&gt;
&lt;SPAN class="comment token"&gt;// set single-wire tx pin to Input mode&lt;/SPAN&gt;
&lt;SPAN class="token function"&gt;LPUART_SetTxPinDirection&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;(&lt;/SPAN&gt;BOOTLOADER_LPUART&lt;SPAN class="punctuation token"&gt;,&lt;/SPAN&gt; kLPUART_TxPinDir_Input&lt;SPAN class="punctuation token"&gt;)&lt;/SPAN&gt;&lt;SPAN class="punctuation token"&gt;;&lt;/SPAN&gt;
&lt;SPAN class="line-numbers-rows"&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;SPAN&gt;‍&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;So, is this expected behaviour and the documentation is wrong ?&lt;/P&gt;&lt;P&gt;Or is it a&amp;nbsp;hardware bug (and the documentation is still wrong) ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 31 Aug 2016 03:58:23 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Issue-with-LPUART-single-wire-mode-on-KL17/m-p/577831#M34282</guid>
      <dc:creator>geoff_s</dc:creator>
      <dc:date>2016-08-31T03:58:23Z</dc:date>
    </item>
    <item>
      <title>Re: Issue with LPUART single-wire mode on KL17</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Issue-with-LPUART-single-wire-mode-on-KL17/m-p/577832#M34283</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Geoff,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;it is not a hardware bug. The latest method is correct way how to&amp;nbsp;send and receive data using single wire and polling mode. If you want to send complete buffer (4 Byte in your app) you need to wait for flag TDRE and after that change to Rx mode.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards,&lt;/P&gt;&lt;P&gt;Pavel&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;CODE style="border: 0px; font-weight: inherit;"&gt;&amp;nbsp;&lt;/CODE&gt;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 31 Aug 2016 08:23:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Issue-with-LPUART-single-wire-mode-on-KL17/m-p/577832#M34283</guid>
      <dc:creator>pavel_krenek</dc:creator>
      <dc:date>2016-08-31T08:23:26Z</dc:date>
    </item>
    <item>
      <title>Re: Issue with LPUART single-wire mode on KL17</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Issue-with-LPUART-single-wire-mode-on-KL17/m-p/577833#M34284</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Thanks Pavel. &amp;nbsp;That is what I suspected. &amp;nbsp;Are you saying this issue&amp;nbsp;does&amp;nbsp;not occur if the writes were done with interrupts instead of polling ?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Could I suggest&amp;nbsp;the documentation be updated to remove the statement about the tx finishing the current character&amp;nbsp;when TXDIR is cleared (or perhaps even better - make an explicit statement that changing TXDIR will immediately halt any current transmission) ?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Wed, 31 Aug 2016 09:55:27 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Issue-with-LPUART-single-wire-mode-on-KL17/m-p/577833#M34284</guid>
      <dc:creator>geoff_s</dc:creator>
      <dc:date>2016-08-31T09:55:27Z</dc:date>
    </item>
  </channel>
</rss>

