Quantcast
Channel: Raspberry Pi Forums
Viewing all articles
Browse latest Browse all 4909

General • Re: Strange PIO behavior

$
0
0
Thanks for the help!! This got me going in the right direction. Here is the end result. I just pass in 0x00nnFF to handle changing the directions of the pins. Thanks for the suggestion!

Code:

.program parallel_io.side_set 1 opt    jmp pin, recv      // High means STROBE is HIGH and host is sending datajmp !OSRE,send    jmp exit    send:    wait 0 gpio 11          // Wait for DIRECTION to go LOW          out pindirs, 8 side 1   // Set pins for output    out pins, 8             // Output data    set pins 1              // Set ACK HIGHwait 1 GPIO 12          // Wait for STROBE to go HIGH    set pins 0              // Set ACK LOW    wait 0 GPIO 12          // Wait for STROBE to go LOW    out pindirs, 8 side 0   // Set pins back for input    jmp exit     recv:    wait 1 gpio 11      // Wait for DIRECTION to go HIGH     in pins 8           // Read data pins    push    set pins 1          // Set ACK HIGH    wait 0 gpio 12      // Wait for STROBE to go LOW    set pins 0          // Set ACK LOW    exit:    nop% c-sdk {#include "hardware/clocks.h"#include "hardware/gpio.h"static inline void parallel_output_program_init(PIO pio, uint sm, uint offset) {        pio_sm_config c = parallel_io_program_get_default_config(offset);    // IO mapping    sm_config_set_out_pins(&c, 0, 8);    sm_config_set_in_pins(&c, 0);    sm_config_set_set_pins(&c, 13, 1);    sm_config_set_sideset_pins(&c, 10);    sm_config_set_jmp_pin(&c, 12);    pio_sm_set_pindirs_with_mask(pio, sm, 1u << 10 | 1u << 13, 1u << 10 | 1u << 13);    pio_sm_set_pindirs_with_mask(pio, sm, ~(1u << 11 | 1u << 12 | 0xFF), 1u << 11 | 1u << 12 | 0xFF);    pio_sm_set_pins_with_mask(pio, sm, ~(1u << 13 | 1u << 10), 1u << 13 | 1u << 10);     for(int i = 0; i < 8; ++i)        pio_gpio_init(pio, i);    for(int i = 10; i < 14; ++i)        pio_gpio_init(pio, i);    sm_config_set_out_shift(&c, true, true, 24);    sm_config_set_in_shift(&c, false, false, 8);    pio_sm_init(pio, sm, offset, &c);    pio_sm_set_enabled(pio, sm, true);}static inline void parallel_io_putc(PIO pio, uint sm, int c) {    pio_sm_put_blocking(pio, sm, (uint32_t)c);}static inline int parallel_io_getc(PIO pio, uint sm) {    return pio_sm_get_blocking(pio, sm);}static inline bool parallel_io_has_data(PIO pio, uint sm){    return !pio_sm_is_rx_fifo_empty(pio, sm);}%}

Statistics: Posted by zoggins — Fri Jul 05, 2024 12:14 am



Viewing all articles
Browse latest Browse all 4909

Trending Articles