ATSAMD10 - ASF - I2C im Slave Callback Mode läuft nicht

Gast #4876771
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.