Forum: Mikrocontroller und Digitale Elektronik ATSAMD10 - ASF - I2C im Slave Callback Mode läuft nicht


von SAM-Anfänger (Gast)


Lesenswert?

Hallo zusammen,

für ein weiteres Projekt versuche ich derzeit auf einem ATSAMD10 das 
I2C-Interface im Slave Callback Mode zum Laufen zu bekommen. Kurz gesagt 
es passiert nichts. Beim Debuggen sprint er nicht in den Callback rein 
und die vom Master gesendeten Telegramme werden auch nicht acknowledged, 
wenn ich mir das ganze mal mit dem Oszi anschaue.
Zur Hardware: Ich verwende noch das Xplained Mini mit o.g. Prozessor. 
Als Software nutze ich das Atmel Studio 7 mit dem ASF 3.31.0
(Ja ich weiß das ASF scheint nicht gern gesehen zu sein - ich erhoffte 
mir dadurch eine Einarbeitung in diese ATSAM-Serie zu ersparen, da es 
nur ein kleiner Teil des Projektes ist und nicht viel Zeit kosten 
sollte...)

Hier bereits das Datenblatt des SAMD10:
http://www.atmel.com/Images/Atmel-42242-SAM-D10_Datasheet.pdf

Und hier das ASF Manual für die SAMD10-Serie:
http://www.atmel.com/Images/Atmel-42359-ASF-Manual-SAM-D10_AP-Note_AT09280.pdf

Nun zum Programm-Code. Dieser ist fast identisch mit dem des 
Beispiel-Codes, welcher im Kapitel 9.8.5 des ASF Manuals zu entnehmen 
ist. Lediglich die Anpassungen des PINMUX sind nachträglich hinzugefügt 
worden, wo ich persönlich auch den Fehler vermute, aber hierzu gibt das 
ASF Manual nicht viel her oder ich habe es überlesen.
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
}

Über konstruktive Anregungen, bedanke ich mich schon jetzt. Vielleicht 
ist es auch nur ein dummer Schussel-Fehler von mir, aber ich weiß 
hierbei nicht mehr weiter.

Vielen Dank,

Grüße J.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.