Hallo Achim,
schöne Erläuterung zum Start mir Atmel Studio
Da du ja gerne I2C verwendest, stelle ich mal ein Beispiel aus einem Projekt von mir in das Forum, bei dem ich das ASF verwende.
Vielleicht hilft es dir oder auch anderen Usern und Gästen weiter.
Im ASF Wizard musst du zunächst den Treiber
SERCOM I2C - Master Mode I2C (driver) [
polled]
einbinden.
Mein Beispiel verwendet also den
polled Modus und nicht den Modus
callback (Interrupt)
Initialisierung
I2C Master mit SERCOM1
- Baudrate 100KHz
- GCLK generator 0
- Do not run in standby
- Start bit hold time 300ns - 600ns
- Buffer timeout = 65535
- Unknown bus status timeout = 65535
- Do not run in standby
- PINMUX_DEFAULT for SERCOM pads
i2c_master_get_config_defaults() initialisiert obige Standartwerte.
Ich verändere folgende Werte ...
- Timeout
- Zuordnung der Pins für SDA (PA16) und SCL (PA17)
CodeBox C
#define CONF_I2C_MASTER_MODULE SERCOM1
#define DATA_LENGTH 32
static uint8_t i2c_write_buffer[DATA_LENGTH];
static uint8_t i2c_read_buffer[DATA_LENGTH];
#define SLAVE_ADDRESS 0x12
struct i2c_master_module i2c_master_instance;
struct i2c_master_packet packet;
void touch_configure_i2c_master(void)
{
/* Initialize config structure and software module. */
struct i2c_master_config config_i2c_master;
i2c_master_get_config_defaults(&config_i2c_master);
/* Change buffer timeout to something longer. */
config_i2c_master.buffer_timeout = 10000;
config_i2c_master.pinmux_pad0 = PINMUX_PA16C_SERCOM1_PAD0; // SDA = PA16
config_i2c_master.pinmux_pad1 = PINMUX_PA17C_SERCOM1_PAD1; // SCL = PA17
i2c_master_init(&i2c_master_instance, CONF_I2C_MASTER_MODULE, &config_i2c_master);
i2c_master_enable(&i2c_master_instance);
}
Write und Read
Im folgenden Beispiel sende ich zunächst eine Registeradresse 0x00 und lese danach 32 Byte.
CodeBox C
void touch_read_data(void)
{
uint16_t timeout;
timeout = 0;
packet.address = SLAVE_ADDRESS;
packet.data_length = 1;
packet.data = i2c_write_buffer;
i2c_write_buffer[0] = 0;
while (i2c_master_write_packet_wait(&i2c_master_instance, &packet) != STATUS_OK)
{
if (timeout++ == TIMEOUT)
{
// Error LED_PB30_ON
break;
}
}
packet.address = SLAVE_ADDRESS;
packet.data_length = 32;
packet.data = i2c_read_buffer;
timeout = 0;
while (i2c_master_read_packet_wait(&i2c_master_instance, &packet) != STATUS_OK)
{
if (timeout++ == TIMEOUT)
{
// Error LED_PB30_ON
break;
}
}
}
Off topic: Wegen dem Font Comic Sans MS, gebe ich Tommy schon etwas recht. Ich hatte sogar einmal gelesen, dass es der Entwickler der Schriftart inzwischen bereut, diese erstellt zu haben (ob das Stimmt ... hmmm?), da viele diese Schriftart "gar nicht mögen". Hier ein Link zu Wikipedia
https://de.wikipedia.org/wiki/Comic_Sans_MS, siehe auch den Punkt Kritik, wenn du mal eine Suchmaschine bemühst, wirst du sicherlich noch viele weitere Seiten mit "Kritik" finden
Achso, das Mikrocontrollermodul nennt sich NanoSAM
D21, du hast im Text manchmal das "D" vergessen.
Ansonsten ... solche Tutorials sind eine super Sache! Finde ich klasse! Daumen hoch
Dirk