diff --git a/GPS/GPS.c b/GPS/GPS.c index 9d347fb7cc33a1cd0aa375890a5fe36951d507e3..fded757b399393b1454b9fe5a5c2ed61ed9d8701 100644 --- a/GPS/GPS.c +++ b/GPS/GPS.c @@ -5,6 +5,7 @@ char nmea_buffer_A[128]; char * nmea_buffer_pointer = nmea_buffer_A; +char checksum; char nmea_buffer_B[128]; @@ -45,15 +46,11 @@ volatile void __not_in_flash_func (pio_irq0_gps_handler)(void) { interrupt = 1; printf("GPS HANDLER: interrupt : %x\n", pio_interrupt_get(gps_pio, 0)); - printf("final checksummmmm: %x\n", reverseByte(test_val)); if (pio_interrupt_get(gps_pio, 0)) { - pio_sm_put(pio0,1, 0); - /* Stop DMA */ while(!pio_sm_is_rx_fifo_empty(gps_pio, 0)); dma_channel_abort(nmea_dma_channel); /* Change buffer */ - char checksum = 0; char checksum_temp = 0; if(bufferA_selected){ bufferA_selected = 0; @@ -65,15 +62,6 @@ volatile void __not_in_flash_func (pio_irq0_gps_handler)(void) memset(nmea_buffer_A, 0, 128); nmea_buffer_pointer = nmea_buffer_A; } - /* Restart DMA */ - dma_channel_configure( - xor_dma_channel, // Channel to be configured - &xor_dma_c, // The configuration we just created - (io_rw_8*)&pio0_hw->txf[1], // The initial write address - nmea_buffer_pointer, // The initial read address - 128, // Number of transfers; in this case each is 1 byte. - false // Start immediately. - ); dma_channel_configure(nmea_dma_channel, &c, nmea_buffer_pointer+1, (io_rw_8*)&pio0_hw->rxf[0]+3, 128, true); /* Let the PIO read again */ pio_interrupt_clear(gps_pio, 0); @@ -109,8 +97,6 @@ volatile void __not_in_flash_func (pio_irq0_gps_handler)(void) } //printf("%s\n", nmea_buffer_B); } - printf("checksum = %x\n",checksum); - irq_clear(PIO0_IRQ_0); } } @@ -327,41 +313,41 @@ void init_nmea_dma(uint sm){ ); printf("------- GPS DMA Started\n"); - printf("Configuring XOR DMA...\n"); - xor_dma_channel = dma_claim_unused_channel(true); - printf("------- Using DMA Channel %i\n", xor_dma_channel); - xor_dma_c = dma_channel_get_default_config(xor_dma_channel); - channel_config_set_transfer_data_size(&xor_dma_c, DMA_SIZE_8); - channel_config_set_read_increment(&xor_dma_c, false); - channel_config_set_write_increment(&xor_dma_c, false); - channel_config_set_dreq(&xor_dma_c, pio_get_dreq(gps_pio, sm, false)); - - dma_channel_configure( - xor_dma_channel, // Channel to be configured - &xor_dma_c, // The configuration we just created - (io_rw_8*)&pio0_hw->txf[1]+3, // The initial write address - &test_val, // The initial read address - 128, // Number of transfers; in this case each is 1 byte. - false // Start immediately. - ); - printf("------- XOR DMA Started\n"); - - printf("Configuring XOR DMA...\n"); - other_xor_dma_channel = dma_claim_unused_channel(true); - printf("------- Using DMA Channel %i\n", other_xor_dma_channel); - other_xor_dma_c = dma_channel_get_default_config(other_xor_dma_channel); - channel_config_set_transfer_data_size(&other_xor_dma_c, DMA_SIZE_8); - channel_config_set_read_increment(&other_xor_dma_c, false); - channel_config_set_write_increment(&other_xor_dma_c, false); - channel_config_set_dreq(&other_xor_dma_c, pio_get_dreq(gps_pio, sm, false)); - - dma_channel_configure( - other_xor_dma_channel, // Channel to be configured - &other_xor_dma_c, // The configuration we just created - &test_val, - (io_rw_8*)&pio0_hw->rxf[1], - 128, // Number of transfers; in this case each is 1 byte. - false // Start immediately. - ); - printf("------- XOR DMA Started\n"); + // printf("Configuring XOR DMA...\n"); + // xor_dma_channel = dma_claim_unused_channel(true); + // printf("------- Using DMA Channel %i\n", xor_dma_channel); + // xor_dma_c = dma_channel_get_default_config(xor_dma_channel); + // channel_config_set_transfer_data_size(&xor_dma_c, DMA_SIZE_8); + // channel_config_set_read_increment(&xor_dma_c, false); + // channel_config_set_write_increment(&xor_dma_c, false); + // channel_config_set_dreq(&xor_dma_c, pio_get_dreq(gps_pio, sm, false)); + + // dma_channel_configure( + // xor_dma_channel, // Channel to be configured + // &xor_dma_c, // The configuration we just created + // (io_rw_8*)&pio0_hw->txf[1]+3, // The initial write address + // &test_val, // The initial read address + // 128, // Number of transfers; in this case each is 1 byte. + // false // Start immediately. + // ); + // printf("------- XOR DMA Started\n"); + + // printf("Configuring XOR DMA...\n"); + // other_xor_dma_channel = dma_claim_unused_channel(true); + // printf("------- Using DMA Channel %i\n", other_xor_dma_channel); + // other_xor_dma_c = dma_channel_get_default_config(other_xor_dma_channel); + // channel_config_set_transfer_data_size(&other_xor_dma_c, DMA_SIZE_8); + // channel_config_set_read_increment(&other_xor_dma_c, false); + // channel_config_set_write_increment(&other_xor_dma_c, false); + // channel_config_set_dreq(&other_xor_dma_c, pio_get_dreq(gps_pio, sm, false)); + + // dma_channel_configure( + // other_xor_dma_channel, // Channel to be configured + // &other_xor_dma_c, // The configuration we just created + // &test_val, + // (io_rw_8*)&pio0_hw->rxf[1], + // 128, // Number of transfers; in this case each is 1 byte. + // false // Start immediately. + // ); + // printf("------- XOR DMA Started\n"); } \ No newline at end of file diff --git a/GPS/GPS.h b/GPS/GPS.h index 6b2a29493c56dda86f608eb68d5984948b620c0a..a6e70905b2483cf4ed5a7712d7300527fd28ea9e 100644 --- a/GPS/GPS.h +++ b/GPS/GPS.h @@ -23,6 +23,8 @@ extern volatile char test_val; extern volatile int interrupt; +extern char checksum; + unsigned char reverseByte(unsigned char byte); diff --git a/GPS/pio.pio b/GPS/pio.pio index 02a052c6861d2a114ba29edfc1187cbc3c462efa..f3602932dd6ba9b4d4c5376baa69782b1804904e 100644 --- a/GPS/pio.pio +++ b/GPS/pio.pio @@ -1,16 +1,15 @@ .program pio - ;out X, 32 ; Copy this char in X scratch register + out X, 32 ; Copy this char in X scratch register .wrap_target skip: wait 0 PIN 0 [31]; Wait Start bit set Y, 7 [13] ; Sample in the middle of data bits read_bit: - irq clear 4 in PINS 1 [29] ; Read a single data bit, then wait for one period jmp Y-- read_bit ; Repeat 7 time - ;mov Y, ISR + mov Y, ISR push - ; jmp X!=Y skip ; Repeat reception if not end of Packet - ; irq WAIT 0 ; Generate IRQ if end of Packet + jmp X!=Y skip ; Repeat reception if not end of Packet + irq WAIT 0 ; Generate IRQ if end of Packet .wrap diff --git a/PA_PIO.c b/PA_PIO.c index 3713d81ec23ae7618c77d4154abe74ed0000c626..c34192ffb72cefba387d12b18fc3099b693a301b 100644 --- a/PA_PIO.c +++ b/PA_PIO.c @@ -12,32 +12,21 @@ int main() { stdio_init_all(); sleep_ms(2000); + test_pio_xor(9600); int gps_sm = gps_init(pio0, 9600); - // comparator_init(pio0, 1000, 2); - test_pio_xor(); - char rx_gps = 0; + //comparator_init(pio0, 1000, 2); int read = 0; - char checksum = 0; - char old = 0; + char final_xor = '\n' ^ '\r' ^ '*' ^ '$' ; while (true) { - read = pio_sm_get_blocking(pio0,1); - printf("res = %08x\n", read); - if(read == 0){ - pio_sm_put(pio0,1, 0); + read = pio_sm_get_blocking(pio1,0); + if(interrupt){ + char hex[3]; + printf("Read checksum = %x\n",checksum); + snprintf(hex, sizeof(hex), "%02X", (char)checksum); + printf("PIO Checksum = %02x\n", final_xor ^ reverseByte(read>>24) ^ hex[0] ^ hex[1] ); + pio_sm_put_blocking(pio1, 0, 0x24<<24); + interrupt = 0; } - - // sleep_us(100); - // if(interrupt){ - // char checksum = read ; - // printf("calculated checksum = %x\n", reverseByte(checksum)); - // interrupt = 0; - // } - // else { - // pio_sm_put(pio0,1, read<<24); - // } - - - } } diff --git a/PIO_XOR/pio_xor.c b/PIO_XOR/pio_xor.c index 01b09101178c36d50be1b1049ee4030a7ebfd476..20df32c41f16e19d2f16245c8dcf9a0605913efa 100644 --- a/PIO_XOR/pio_xor.c +++ b/PIO_XOR/pio_xor.c @@ -1,20 +1,25 @@ #include "pio_xor.h" -void test_pio_xor(void){ - uint sm = pio_claim_unused_sm(pio0, true); +void test_pio_xor(uint32_t baudrate){ + uint sm = pio_claim_unused_sm(pio1, true); printf("sm = %i\n",sm); - int offset = pio_add_program(pio0, &pio_xor_program); + int offset = pio_add_program(pio1, &pio_xor_program); printf("------- Offset = %i\n", offset); pio_sm_config c = pio_xor_program_get_default_config(offset); - pio_gpio_init(pio0, 13); - pio_sm_set_consecutive_pindirs(pio0, sm, 13, 1, false); + pio_gpio_init(pio1, 13); + pio_sm_set_consecutive_pindirs(pio1, sm, 13, 1, false); sm_config_set_in_pins(&c, 13); + int clock_freq = clock_get_hz(clk_sys); - sm_config_set_clkdiv_int_frac8(&c, 1, 0); + int sm_frequency = baudrate*32; + int sm_divider_int = clock_freq/sm_frequency; + float sm_divider_float = ((float)clock_freq/sm_frequency) - sm_divider_int; + printf("------- State machine divider = %i - %f\n", sm_divider_int, sm_divider_float); + sm_config_set_clkdiv_int_frac8(&c, sm_divider_int, sm_divider_float); sm_config_set_out_shift(&c, false, false, 8); sm_config_set_in_shift(&c, false, false, 8); - pio_sm_init(pio0, sm, offset, &c); + pio_sm_init(pio1, sm, offset, &c); /* Enable the state machine */ - pio_sm_put(pio0, sm, 0); - pio_sm_set_enabled(pio0, sm, 1); + pio_sm_put(pio1, sm, 0); + pio_sm_set_enabled(pio1, sm, 1); } \ No newline at end of file diff --git a/PIO_XOR/pio_xor.h b/PIO_XOR/pio_xor.h index cdd639e6c1eb82d94bb23c775b5f1c362290935b..bdf91dec2d65480a6d594285cbb0165b52b3a321 100644 --- a/PIO_XOR/pio_xor.h +++ b/PIO_XOR/pio_xor.h @@ -10,6 +10,6 @@ #include "hardware/dma.h" #include "pio_xor.pio.h" -void test_pio_xor(void); +void test_pio_xor(uint32_t baudrate); #endif \ No newline at end of file diff --git a/PIO_XOR/pio_xor.pio b/PIO_XOR/pio_xor.pio index 1f182e2d7c15ee8119123b47413716efaea7797e..a80bef5ea2bea608e7e215e187a1862766cb90fe 100644 --- a/PIO_XOR/pio_xor.pio +++ b/PIO_XOR/pio_xor.pio @@ -1,33 +1,37 @@ .program pio_xor - ;pull BLOCK - ;mov OSR, NULL .wrap_target pull NoBlock + wait 0 PIN 0 [31]; Wait Start bit + nop [15] repeat: - mov X, ISR ; 1: Copy ISR in X + mov X, ISR; 1: Copy ISR in X mov ISR, NULL ; Set ISR to all zeros - - irq wait 4 ; Wait pin sampling from uart - in PINS, 1 + in PINS, 1 [11] out Y, 1 ; 2: ISR[0] = last byte bit, ISR[1] = new byte bit in Y, 1 mov Y, ISR ; 3: Copy ISR in Y ; 4: Computation of XOR - jmp !Y is_zero ; if Y = 00; out = 0 + jmp !Y is_zero_long; if Y = 00; out = 0 jmp Y-- once ; decrement once once: - jmp !Y is_one + jmp !Y is_one_long jmp Y-- twice ; decrement twice twice: - jmp !Y is_one ; If Y-2 >= 0 ; out = 1 - jmp is_zero ; else out = 0 + jmp !Y is_one_fast; If Y-2 >= 0 ; out = 1 + jmp is_zero_fast ; else out = 0 - is_zero: - set Y, 0 + is_zero_long: + set Y, 0 [9] jmp send - is_one: - set Y, 1 + is_zero_fast: + set Y, 0 [3] + jmp send + is_one_long: + set Y, 1 [7] + jmp send + is_one_fast: + set Y, 1 [5] jmp send send: @@ -38,39 +42,5 @@ mov OSR, ISR mov x, OSR push + wait 1 PIN 0; Wait Stop bit .wrap - -; .program pio_xor -; .wrap_target -; pull IFEMPTY ; Changes OSR only when a full byte has been treated -; mov X, ISR ; 1: Copy ISR in X -; mov ISR, NULL ; Set ISR to all zeros -; wait 1 IRQ 5 -; out PINS, 1 ; 2: ISR[1] = new wbyte bit -; out ISR, 1 ; --- ISR[0] = last byte bit, -; mov Y, ISR ; 3: Copy ISR in Y -; ; 4: Computation of XOR - -; jmp !Y is_zero ; if Y = 00; out = 0 -; jmp Y-- once ; decrement once -; once: -; jmp !Y is_one -; jmp Y-- twice ; decrement twice -; twice: -; jmp !Y is_one ; If Y-2 <= 0 ; out = 1 -; jmp is_zero ; else out = 0 - -; is_zero: -; set Y, 0 -; jmp send -; is_one: -; set Y, 1 -; jmp send - -; send: -; mov ISR, X ; 6: Copy X (Last iteration's ISR) into ISR -; in Y, 1 ; 7: Push the new byte into ISR -; mov X, ISR ; -; push IFFULL; should setup autopush instead -; mov ISR, X -; .wrap \ No newline at end of file