1 | #include <asf.h>
|
2 | #define DATA_LENGTH 2
|
3 | #define SLAVE_ADDRESS 0x59
|
4 | static uint8_t write_buffer[DATA_LENGTH] = { 0x00, 0x01 };
|
5 | static uint8_t read_buffer [DATA_LENGTH];
|
6 | struct i2c_slave_module i2c_slave_instance;
|
7 | static struct i2c_slave_packet packet;
|
8 |
|
9 | void configure_i2c_slave(void);
|
10 | void i2c_read_request_callback(struct i2c_slave_module *const module);
|
11 | void i2c_write_request_callback(struct i2c_slave_module *const module);
|
12 | void configure_i2c_slave_callbacks(void);
|
13 | int main (void)
|
14 | {
|
15 | system_init();
|
16 | configure_i2c_slave();
|
17 | configure_i2c_slave_callbacks();
|
18 | while(1) {
|
19 | ;
|
20 | }
|
21 |
|
22 | }
|
23 |
|
24 | void configure_i2c_slave(void)
|
25 | {
|
26 | /* Initialize config structure and module instance */
|
27 | struct i2c_slave_config config_i2c_slave;
|
28 | i2c_slave_get_config_defaults(&config_i2c_slave);
|
29 | /* Change address and address_mode */
|
30 | config_i2c_slave.address = SLAVE_ADDRESS;
|
31 | config_i2c_slave.address_mode = I2C_SLAVE_ADDRESS_MODE_MASK;
|
32 | /* Initialize and enable device with config */
|
33 | i2c_slave_init(&i2c_slave_instance, SERCOM2, &config_i2c_slave);
|
34 | i2c_slave_enable(&i2c_slave_instance);
|
35 |
|
36 | struct system_pinmux_config config_pinmux;
|
37 | system_pinmux_get_config_defaults(&config_pinmux);
|
38 | config_pinmux.mux_position = PINMUX_PA14D_SERCOM2_PAD0;
|
39 | system_pinmux_pin_set_config(PIN_PA14, &config_pinmux);
|
40 |
|
41 | system_pinmux_get_config_defaults(&config_pinmux);
|
42 | config_pinmux.mux_position = PINMUX_PA15D_SERCOM2_PAD1;
|
43 | system_pinmux_pin_set_config(PIN_PA15, &config_pinmux);
|
44 | }
|
45 |
|
46 | void i2c_read_request_callback(struct i2c_slave_module *const module)
|
47 | {
|
48 | /* Init i2c packet */
|
49 | packet.data_length = DATA_LENGTH;
|
50 | packet.data = write_buffer;
|
51 | /* Write buffer to master */
|
52 | i2c_slave_write_packet_job(module, &packet);
|
53 | }
|
54 |
|
55 | void i2c_write_request_callback(struct i2c_slave_module *const module)
|
56 | {
|
57 | /* Init i2c packet */
|
58 | packet.data_length = DATA_LENGTH;
|
59 | packet.data = read_buffer;
|
60 | /* Read buffer from master */
|
61 | if (i2c_slave_read_packet_job(module, &packet) != STATUS_OK) {
|
62 | }
|
63 | }
|
64 |
|
65 | void configure_i2c_slave_callbacks(void)
|
66 | {
|
67 | /* Register and enable callback functions */
|
68 | i2c_slave_register_callback(&i2c_slave_instance, i2c_read_request_callback, I2C_SLAVE_CALLBACK_READ_REQUEST);
|
69 | i2c_slave_enable_callback(&i2c_slave_instance, I2C_SLAVE_CALLBACK_READ_REQUEST);
|
70 |
|
71 | i2c_slave_register_callback(&i2c_slave_instance, i2c_write_request_callback, I2C_SLAVE_CALLBACK_WRITE_REQUEST);
|
72 | i2c_slave_enable_callback(&i2c_slave_instance, I2C_SLAVE_CALLBACK_WRITE_REQUEST);
|
73 | }
|