/** * \internal * \brief Test: Send & receive data using transceive functions. * * This test sends (writes) an array of data to the slave and * receives (reads) the buffer back using transceive functions * and compares. * * \param test Current test case. */ static void run_transceive_buffer_test(const struct test_case *test) { enum status_code status = STATUS_ERR_IO; /* Skip test if initialization failed */ test_assert_true(test, spi_init_success, "Skipping test due to failed initialization"); /* Start the test */ spi_transceive_buffer_job(&slave, slave_tx_buf, slave_rx_buf, BUFFER_LENGTH); spi_select_slave(&master, &slave_inst, true); status = spi_transceive_buffer_wait(&master, tx_buf, rx_buf, BUFFER_LENGTH); spi_select_slave(&master, &slave_inst, false); test_assert_true(test, status == STATUS_OK, "Transceive buffer failed"); /* Compare received data with transmitted data */ if (status == STATUS_OK) { for (uint16_t i = 0; i < BUFFER_LENGTH; i++) { test_assert_true(test, tx_buf[i] == slave_rx_buf[i], "During TX: Bytes differ at buffer index %d : %d != %d", i, tx_buf[i], slave_rx_buf[i]); test_assert_true(test, slave_tx_buf[i] == rx_buf[i], "During RX: Bytes differ at buffer index %d : %d != %d", i, slave_tx_buf[i], rx_buf[i]); } } }
int main (void) { system_init(); while ( !system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_DPLL) ) { } // Disable the pin select for the CAN Controller fnc_can_controller_disable(); // Perform the SERCOM configuration for this board bastian_complete_sercom_setup(); // TCC Configuration tcc_configure_function(); // Counter Configuration tcc_callback_configuration(); // Timer Callback Configuration // Select Slave spi_select_slave(&spi_master, &spi_shield, false); // Wait the necessary time for the chip to restart inProgress = true; intProgressTimer = 100; // wait for 11ms while ( inProgress ) { } // Read the status from the on-board CAN controller spi_select_slave(&spi_master, &spi_CAN_controller, true); spi_write_buffer_wait(&spi_master, wr_can_buffer_startup, SYSTEM_SLAVE_TX_SINGLE_BYTE); spi_select_slave(&spi_master, &spi_CAN_controller, false); // Wait the necessary time for the chip to restart inProgress = true; intProgressTimer = 50; // wait for 11ms while ( inProgress ) { } spi_select_slave(&spi_master, &spi_CAN_controller, true); spi_transceive_buffer_job(&spi_master, &wr_can_buffer_startup[1], rd_buffer, SYSTEM_SLAVE_STATUS_TRANSACTION_LENGTH); //spi_select_slave(&spi_master, &spi_CAN_controller, false); // inProgress = true; // intProgressTimer = 10; // wait for 2ms // while ( inProgress ) { } // // spi_select_slave(&spi_master, &spi_CAN_controller, true); // spi_transceive_buffer_job(&spi_master, wr_can_buffer, rd_buffer, SYSTEM_SLAVE_STATUS_TRANSACTION_LENGTH); // Main Loop while (1) { } }
int main(void) { //! [main_start] /* Initialize system */ //! [system_init] system_init(); //! [system_init] //! [run_config] configure_spi_master(); //! [run_config] //! [run_callback_config] configure_spi_master_callbacks(); //! [run_callback_config] //! [main_start] //! [main_use_case] //! [inf_loop] while (true) { /* Infinite loop */ if (!port_pin_get_input_level(BUTTON_0_PIN)) { //! [select_slave] spi_select_slave(&spi_master_instance, &slave, true); //! [select_slave] //! [write and read] spi_transceive_buffer_job(&spi_master_instance, wr_buffer,rd_buffer,BUF_LENGTH); //! [write and read] //! [wait] while (!transrev_complete_spi_master) { /////* Wait for write and read complete */ } //! [wait] //! [deselect_slave] spi_select_slave(&spi_master_instance, &slave, false); //! [deselect_slave] } } //! [inf_loop] //! [main_use_case] }