// Copyright 2011-2024 XMOS LIMITED. // This Software is subject to the terms of the XMOS Public Licence: Version 1. #include #include #include "adat_tx.h" #include "adat_rx.h" extern "C" { #include "sw_pll.h" } #include "stdio.h" #include "assert.h" #define MAX_GEN_VAL (1<<24) #define COUNT_SHIFT 5 #define DONE_CONDITION_MASK ~((1< unsigned tmp; for(int i = 0; i < 8; i++) { c :> channels[i]; expected_data += 1 << (count >> COUNT_SHIFT); if(channels[i] != expected_data << 8) { printf("Error: Received data 0x%x differs from expected data 0x%x. Correctly received so far %d\n", channels[i], expected_data << 8, count); assert(0); } count++; } } printf("Received %d samples as expected\n", count); } unsigned samples[8]; void generate_samples(chanend c_data) { unsigned data = 0; int count = 0; outuint(c_data, MCLK_FREQUENCY_48 / 48000); // master clock multiplier outuint(c_data, 1); // S/MUX value while(1) { for (int i = 0; i < 8; ++i) { data += 1 << (count >> COUNT_SHIFT); ++count; samples[i] = data << 8; } unsafe { volatile unsigned * unsafe sample_ptr = (unsigned * unsafe) &samples[0]; outuint(c_data, (unsigned) sample_ptr); } if (data >= MAX_GEN_VAL) { break; } inuint(c_data); }; printf("Finished sending %d words\n", count); inuint(c_data); outct(c_data, XS1_CT_END); } void receive_adat(streaming chanend c) { while(1) { adatReceiver48000(p_adat_rx, c); } } void transmit_adat(chanend c) { set_clock_src(clk_audio, p_mclk_in); configure_out_port_no_ready(p_adat_tx, clk_audio, 0); set_clock_fall_delay(clk_audio, 7); start_clock(clk_audio); adat_tx_port(c, p_adat_tx); } int main(void) { chan c_data_tx; streaming chan c_data_rx; par { on tile[0]: { board_setup(); receive_adat(c_data_rx); } on tile[0]: collect_samples(c_data_rx); on tile[1]: generate_samples(c_data_tx); on tile[1]: transmit_adat(c_data_tx); } return 0; }