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); }
// 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] }
//! [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] }
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; }