void setup() {
    SerialUSB.begin();
    SerialUSB.println("I2C Slave example");

    // attach the buffer
    msg.data = buffer;

    /* Init slave mode. Enables master too
     * We are going to configure the slave device to
     *  - enable fast I2C (400khz)
     *  - dual addresses (can have 2 addresses per module)
     * general call (accepts data writes to 0x00 on a broadcast basis)
     *
     * If the buffered example is enabled, then we also enable the
     * buffer for rx and tx.
     * Note you can independently enable/disable RX and TX buffers to
     * allow a buffered read and direct writes. Useful if you don't know how
     * much the master will read.
     */
#if USE_BUFFERED_EXAMPLE == 1
    i2c_slave_enable(I2C1, I2C_FAST_MODE | I2C_SLAVE_DUAL_ADDRESS | I2C_SLAVE_GENERAL_CALL | I2C_SLAVE_USE_RX_BUFFER | I2C_SLAVE_USE_TX_BUFFER);
#else
    i2c_slave_enable(I2C1, I2C_FAST_MODE | I2C_SLAVE_DUAL_ADDRESS | I2C_SLAVE_GENERAL_CALL);
#endif

    // attach  receive handler
    i2c_slave_attach_recv_handler(I2C1, &msg, funcrx);
    // attach transmit handler
    i2c_slave_attach_transmit_handler(I2C1, &msg, functx);

    // set addresss 1 to 16
    i2c_slave_set_own_address(I2C1, 0x10);
    // set addresss 2 to 32
    i2c_slave_set_own_address2(I2C1, 0x20);
}
Exemple #2
0
// Configure SERCOM channel 4 as I2C slave for VESC communication
void configure_i2c_slave(void)
{	
	/* Create and initialize config_i2c_slave structure */
	struct i2c_slave_config config_i2c_slave;
	i2c_slave_get_config_defaults(&config_i2c_slave);
	/* Change address and address_mode */
	config_i2c_slave.address        = SLAVE_ADDRESS;
	config_i2c_slave.address_mode   = I2C_SLAVE_ADDRESS_MODE_MASK;
	config_i2c_slave.buffer_timeout = SLAVE_TIMEOUT;
	config_i2c_slave.pinmux_pad0 = PINMUX_PB08D_SERCOM4_PAD0;
	config_i2c_slave.pinmux_pad1 = PINMUX_PB09D_SERCOM4_PAD1;
	/* Initialize and enable device with config_i2c_slave */
	i2c_slave_init(&i2c_slave_instance, SERCOM4, &config_i2c_slave);
	i2c_slave_enable(&i2c_slave_instance);
}
//! [initialize_i2c]
void configure_i2c_slave(void)
{
	/* Initialize config structure and module instance */
	//! [init_conf]
	struct i2c_slave_config config_i2c_slave;
	i2c_slave_get_config_defaults(&config_i2c_slave);
	//! [init_conf]
	/* Change address and address_mode */
	//! [conf_changes]
	config_i2c_slave.address      = SLAVE_ADDRESS;
	config_i2c_slave.address_mode = I2C_SLAVE_ADDRESS_MODE_MASK;
	//! [conf_changes]
	/* Initialize and enable device with config */
	//! [init_module]
	i2c_slave_init(&i2c_slave_instance, CONF_I2C_SLAVE_MODULE, &config_i2c_slave);
	//! [init_module]

	//! [enable_module]
	i2c_slave_enable(&i2c_slave_instance);
	//! [enable_module]
}
Exemple #4
0
//! [initialize_i2c]
void configure_i2c_slave(void)
{
	/* Create and initialize config_i2c_slave structure */
	//! [init_conf]
	struct i2c_slave_config config_i2c_slave;
	i2c_slave_get_config_defaults(&config_i2c_slave);
	//! [init_conf]

	/* Change address and address_mode */
	//! [conf_changes]
	config_i2c_slave.address        = SLAVE_ADDRESS;
	config_i2c_slave.address_mode   = I2C_SLAVE_ADDRESS_MODE_MASK;
	config_i2c_slave.buffer_timeout = 1000;
	//! [conf_changes]

	/* Initialize and enable device with config_i2c_slave */
	//! [init_module]
	i2c_slave_init(&i2c_slave_instance, SERCOM2, &config_i2c_slave);
	//! [init_module]

	//! [enable_module]
	i2c_slave_enable(&i2c_slave_instance);
	//! [enable_module]
}
Exemple #5
0
int main(int argc, char ** argv)
{
	int led = 0;
	int ret;
	int i;

	DCC_LOG_INIT();
	DCC_LOG_CONNECT();

	/* calibrate usecond delay loop */
	cm3_udelay_calibrate();

	DCC_LOG(LOG_TRACE, "1. io_init()");
	io_init();

	DCC_LOG(LOG_TRACE, "2. leds_init()");
	leds_init();

	DCC_LOG(LOG_TRACE, "3. thinkos_init()");
	thinkos_init(THINKOS_OPT_PRIORITY(0) | THINKOS_OPT_ID(32));

	DCC_LOG(LOG_TRACE, "4. stdio_init()");
	stdio_init();

	printf("\n\n");
	printf("-----------------------------------------\n");
	printf(" I2C slave test\n");
	printf("-----------------------------------------\n");
	printf("\n");

	for (i = 0; i < IO_MEM_SIZE; ++i)
		io_mem[i] = i * 2;

	i2c_slave_init(100000, 0x55, io_mem, IO_MEM_SIZE);

	i2c_slave_enable();

	for (i = 0; ; ++i) {
		if ((i & 0xff) == 0) {
			led = i % 5;
			led_on(led);
		}

		ret = i2c_slave_io();
		switch (ret) {
		case I2C_XFER_IN:
			printf("In ");
			break;
		case I2C_XFER_OUT:
			printf("Out ");
			break;
		case I2C_XFER_ERR:
			printf("Err ");
			break;
		}

		led_off(led);
	}

	return 0;
}