<?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>Encoding NRZ bitstream</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/110040/encoding-nrz-bitstream</link><description>I&amp;#39;m in need of some thoughts: I&amp;#39;m using nRF52840 and SDK15.3 to do this but this is mostly a hardware thing. 
 I need to put out a long (like 7K bits) bitstring with each bit encoded in an NRZ format. Bit length is 1.25uS so this isn&amp;#39;t all that fast.</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Tue, 09 Apr 2024 13:54:19 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/110040/encoding-nrz-bitstream" /><item><title>RE: Encoding NRZ bitstream</title><link>https://devzone.nordicsemi.com/thread/477843?ContentTypeID=1</link><pubDate>Tue, 09 Apr 2024 13:54:19 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:2d179961-62d5-414e-892d-bd6a441116f4</guid><dc:creator>Edvin</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
&lt;p&gt;I thought I might add:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.zephyrproject.org/latest/samples/drivers/led_strip/README.html"&gt;https://docs.zephyrproject.org/latest/samples/drivers/led_strip/README.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Your figure looked familiar, so in case this is what you are trying to do, this may also be a starting point.&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Encoding NRZ bitstream</title><link>https://devzone.nordicsemi.com/thread/477658?ContentTypeID=1</link><pubDate>Mon, 08 Apr 2024 18:52:40 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:ecb8d0d4-cb49-4dd4-ba97-0388c3d34f81</guid><dc:creator>Randy Lee</dc:creator><description>&lt;p&gt;thanx... this looks like the ticket here... &lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: Encoding NRZ bitstream</title><link>https://devzone.nordicsemi.com/thread/477656?ContentTypeID=1</link><pubDate>Mon, 08 Apr 2024 17:58:52 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:33486382-d6da-459a-ace2-2224064fa233</guid><dc:creator>hmolesworth</dc:creator><description>&lt;p&gt;Manchester Encoding gives pretty much what you are looking for; I posted some code here&amp;nbsp;&lt;a href="https://devzone.nordicsemi.com/f/nordic-q-a/91908/pwm-sequence-from-hal-to-nrfx/386047"&gt;pwm-sequence&lt;/a&gt;&amp;nbsp;which gives a PWM implementation for a specific packet example&amp;nbsp; as well as other posts. Worth a search on &amp;quot;Manchester Encoding&amp;quot; in the dev zone for vaious other solutions.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;// PWM Half-Duplex UART - nrfx drivers
// ===================================
// Requirements
//  10 bit bytes (Start - 8xData - Stop)
//  single char or burst (packet) transmission
//  Differential output using 2 pins
//  No level change on pins outside transmitted data to avoid spurious character detection
#include &amp;quot;nrf_pwm.h&amp;quot;

#define LL_BAUDRATE    800000
#define F_CLK        16000000              // nRF52832/nRF52840 fixed at 16MHz
#define F_PRESCALER  (PWM_PRESCALER_PRESCALER_DIV_1)  // Divide by 1, 16MHz clock
#define COUNTER_TOP  ((F_CLK+(LL_BAUDRATE/2)) / LL_BAUDRATE)
STATIC_ASSERT(COUNTER_TOP &amp;lt; 32768, &amp;quot;COUNTER_TOP value too large for 15-bit register&amp;quot;);
STATIC_ASSERT(COUNTER_TOP &amp;gt;= 3, &amp;quot;COUNTER_TOP value too small for correct operation&amp;quot;);
//#define BIT_LOW               0         // Normal encoding
//#define BIT_HIGH    (COUNTER_TOP)       // Normal encoding
#define BIT_LOW   ((2*COUNTER_TOP)/3)     // Manchester encoding 2/3 bit
#define BIT_HIGH  (COUNTER_TOP/3)         // Manchester encoding 1/3 bit
#define PWM_NEG (PIN_FEATHER_D6)          // Low level outside transmission
#define PWM_POS (PIN_FEATHER_D9)          // High level outside transmission

typedef struct TX_BYTE_T {
    nrf_pwm_values_grouped_t StartBit;
    nrf_pwm_values_grouped_t DataBits[8];
    nrf_pwm_values_grouped_t StopBit;
} TxByte_t;

TxByte_t TxPacket[4];
const uint16_t TxPacketSize = (sizeof(TxPacket)/sizeof(uint16_t));

void encodeByte(TxByte_t* pBuffer, const uint8_t ch)
{
    // Encode byte in little-endian format with start and stop bits
    pBuffer-&amp;gt;StartBit.group_0 = pBuffer-&amp;gt;StartBit.group_1 = (BIT_LOW);  pBuffer-&amp;gt;StartBit.group_0 |= 0x8000; // 0 Start bit
    pBuffer-&amp;gt;StopBit.group_0  = pBuffer-&amp;gt;StopBit.group_1  = (BIT_HIGH); pBuffer-&amp;gt;StopBit.group_0  |= 0x8000; // 0 Stop bit
    for(uint32_t i=0; i&amp;lt;8; i++)
    {
        pBuffer-&amp;gt;DataBits[i].group_0 = pBuffer-&amp;gt;DataBits[i].group_1 = (((ch&amp;gt;&amp;gt;i) &amp;amp; 0x01) ? BIT_HIGH : BIT_LOW);
        pBuffer-&amp;gt;DataBits[i].group_0 |= 0x8000; // inverted pin
    }
}

buildMessage(void)
{
    TxByte_t *pTx = TxPacket;
    uint8_t STX         = 0x82;
    uint8_t signal_id   = 0x64 | 0x80;
    uint8_t data_byte_0 = 0x03 | 0x80;
    uint8_t checksum    = (signal_id) + (data_byte_0);
    checksum &amp;amp;= 0x7F;
    encodeByte(pTx++, STX);
    encodeByte(pTx++, signal_id);
    encodeByte(pTx++, data_byte_0);
    encodeByte(pTx++, checksum);
}

void TestPWM_Uart(void)
{
    static nrfx_pwm_t m_pwm0 = NRFX_PWM_INSTANCE(0);
    uint32_t err_code;
    // Declare a configuration structure and use a macro to instantiate it with default parameters.
    nrfx_pwm_config_t pwm_config = NRFX_PWM_DEFAULT_CONFIG;
    //    .irq_priority = NRFX_PWM_DEFAULT_CONFIG_IRQ_PRIORITY,                  \
    //    .base_clock   = (nrf_pwm_clk_t)NRFX_PWM_DEFAULT_CONFIG_BASE_CLOCK,     \
    //    .count_mode   = (nrf_pwm_mode_t)NRFX_PWM_DEFAULT_CONFIG_COUNT_MODE,    \
    //    .top_value    = NRFX_PWM_DEFAULT_CONFIG_TOP_VALUE,                     \
    //    .load_mode    = (nrf_pwm_dec_load_t)NRFX_PWM_DEFAULT_CONFIG_LOAD_MODE, \
    //    .step_mode    = (nrf_pwm_dec_step_t)NRFX_PWM_DEFAULT_CONFIG_STEP_MODE
   static nrf_pwm_sequence_t pwm_sequence;

    // Override some of the default parameters:
    pwm_config.output_pins[0] = PWM_NEG | NRFX_PWM_PIN_INVERTED;
    pwm_config.output_pins[1] = NRFX_PWM_PIN_NOT_USED;
    pwm_config.output_pins[2] = PWM_POS;
    pwm_config.output_pins[3] = NRFX_PWM_PIN_NOT_USED;

    pwm_config.load_mode      = NRF_PWM_LOAD_GROUPED;   // 1 == 1st half word (16-bit) used in channels 0 and 1; 2nd word in channels 2 and 3
    pwm_config.base_clock     = F_PRESCALER;            // 0 == divide by 1 for 16MHz clock
    pwm_config.step_mode      = NRFX_PWM_DEFAULT_CONFIG_STEP_MODE; // 0 == Count Up
    pwm_config.top_value      = COUNTER_TOP;

    // Pass config structure into driver init() function
    err_code = nrfx_pwm_init(&amp;amp;m_pwm0, &amp;amp;pwm_config, NULL);
    APP_ERROR_CHECK(err_code);
    // Boost differential pwm driver pins to high drive - this is optional
    nrf_gpio_cfg(PWM_NEG, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_H0H1, NRF_GPIO_PIN_NOSENSE);
    nrf_gpio_cfg(PWM_POS, NRF_GPIO_PIN_DIR_OUTPUT, NRF_GPIO_PIN_INPUT_DISCONNECT, NRF_GPIO_PIN_NOPULL, NRF_GPIO_PIN_H0H1, NRF_GPIO_PIN_NOSENSE);
    // Encode the 4-byte test message
    buildMessage();
    pwm_sequence.values.p_grouped = (uint32_t)TxPacket;
    pwm_sequence.length           = TxPacketSize;
    pwm_sequence.repeats          = 0;
    nrfx_pwm_simple_playback(&amp;amp;m_pwm0, &amp;amp;pwm_sequence, 1, NRFX_PWM_FLAG_STOP); // Send once
    while (1)
    {
        __WFE();
    }
}&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>