/**
 * \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]);
		}
	}
}
Esempio n. 2
0
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]
}