Forum: Mikrocontroller und Digitale Elektronik SAM4SD32 TWI I2C TWI_MMR MREAD read write bit


von El_Doktorante (Gast)


Lesenswert?

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
}

von El_Doktorante (Gast)


Lesenswert?

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.

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.