SAM4SD32 TWI I2C TWI_MMR MREAD read write bit

Gast #3978144
Hey,

ich habe mich jetzt noch eine ganze weile mit dem SAM4S beschäftigt und 
habe auch TWI1 zum laufen bekommen.

Leider hat sich nun ein neues Problem aufgetan. Beim Senden des 
twi_master_read Befehls wird das "Master read direction" (READ/WRITE 
BIT) zwar im TWI_MMR Register richtig gesetzt, allerdings wird das Bit 
leider nicht gesendet.

Des Weiteren finde ich interessant, dass ich die Variable .addr_length 
der packet_read struktur nicht auf 0 setzen kann.

Der twi_master_write Befehl funktioniert problemlos.

Hat jemand von euch den SAM4SD32 mit I2C am Laufen?

Gruß
Roland
1
#include <asf.h>
2

3

4
#define I2C_BUS1_ADDR_U5 0b1111001
5

6
int main (void)
7
{
8
  // Initialisierungen
9
  MATRIX->CCFG_SYSIO |= (1 << 4) | (1 << 5);
10
  board_init();
11
  sysclk_init();
12
  delay_init(sysclk_get_cpu_hz());
13
  
14
  pio_set_peripheral(PIOB,PIO_PERIPH_A,PIO_PB5);
15
  pio_set_peripheral(PIOB,PIO_PERIPH_A,PIO_PB4);
16
  pio_set_output(PIOA, PIO_PA31, LOW, DISABLE, ENABLE);
17
  pio_clear(PIOA,PIO_PA31);
18
  
19
  pmc_enable_periph_clk(ID_PIOA); 
20
  pmc_enable_periph_clk(ID_TWI1);
21
    
22
  twi_master_options_t opt = {
23
    .speed = 100000,
24
    .chip  = I2C_BUS1_ADDR_U5,
25
    //.smbus = 0,
26
    .master_clk = sysclk_get_peripheral_bus_hz(TWI1)
27
  };
28
  twi_master_setup(TWI1, &opt);
29
  //twi_disable_highspeed(TWI1);
30
  twi_master_enable(TWI1);
31

32
  uint8_t data_received[2];
33

34
  twi_package_t packet_read = {
35
    .addr         = {0b10101101},      // TWI slave memory address data
36
    .addr_length  = 1,    // TWI slave memory address data size
37
    .chip         = {0b1000000},      // TWI slave bus address
38
    .buffer       = data_received,        // transfer data destination buffer
39
    .length       = 2                    // transfer data size (bytes)
40
  };
41
  // Perform a multi-byte read access then check the result.
42
  
43
  const uint8_t test_pattern[] = {0b11100011};
44
  twi_package_t packet_write = {
45
    .addr = {0}, // TWI slave memory address data
46
    .addr_length = 0, // TWI slave memory address data size
47
    .chip = {0b1000000}, // TWI slave bus address
48
    .buffer = (void *)test_pattern, // transfer data source buffer
49
    .length = 1 // transfer data size (bytes)
50
  };
51
  
52
  while(1){
53
    pio_set(PIOA, PIO_PA31);
54
    delay_us(1);
55
    pio_clear(PIOA, PIO_PA31);
56
    twi_master_write(TWI1, &packet_write);
57
    delay_us(20);      
58
    twi_master_read(TWI1, &packet_read);
59
    delay_ms(10);
60
    //twi_master_read(TWI1, &packet_read);
61
    
62

63
  }
64

65
}
Gast
Hey Allerseits,

nach langem Suchen habe ich den Fehler gefunden. Man darf in dem ASF 
Wizard nur die TWI (COMMON API)(service) laden. Läd man ebenfalls den 
TWI (driver) scheint dies Probleme zu machen.

Gruß
El-Doctorante

P.S.: Integrierte PULLUPs ersetzen leider nicht die Leitungspullups, 
diese müssen unbedingt separat aufgelötet werden.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 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.