USI Problem mit ATtiny24

Gast #1407262
Lesenswert?

Hallo Leute, hilft mir.

Seit 8 Stunden kämpfe ich mich durch die Datenbläter und diesen Forum, 
um die USI 2-Wire Master daten übertragung zu realesieren.

Ich verstehe einfach nicht wie ich die Daten aus USIDR in die Welt 
schicke. Bis jetzt sehe ich nur ein 1MHz Takt am PA4 = SCL

Im angehängten Code ist die minimal-Version des Programms.
Angehängte Dateien:
Gast #1408135
Lesenswert?

Ok Problem fast gelöst,
Wie auch immer der Fall ist: der Fehler sitz vor dem PC.

Habe am Falschem Pin den Ausgang erwartet, bzw. da ich eine TWO-WiRE 
Mode realesieren möchte habe ich schon an richtiger Stelle gemessen (SDA 
= PA6) funktioniert bis jetz nur 3_WiRE.

Und mit diesem Code leuft ENDLICH 2-WIRE !
1
void USI_TWI_Master_Initialise( void )
2
{
3
  PORT_USI |= (1<<PIN_USI_SDA);           // Enable pullup on SDA, to set high as released state.
4
  PORT_USI |= (1<<PIN_USI_SCL);           // Enable pullup on SCL, to set high as released state.
5
  
6
  DDR_USI  |= (1<<PIN_USI_SCL);           // Enable SCL as output.
7
  DDR_USI  |= (1<<PIN_USI_SDA);           // Enable SDA as output.
8
  
9
  USIDR    =  0xFF;                       // Preload dataregister with "released level" data.
10
  USICR    =  (0<<USISIE)|(0<<USIOIE)|                            // Disable Interrupts.
11
              (1<<USIWM1)|(0<<USIWM0)|                            // Set USI in Two-wire mode.
12
              (1<<USICS1)|(0<<USICS0)|(1<<USICLK)|                // Software stobe as counter clock source
13
              (0<<USITC);
14

15
  USISR   =   (1<<USISIF)|(1<<USIOIF)|(1<<USIPF)|(1<<USIDC)|      // Clear flags,
16
              (0x0<<USICNT0);                                     // and reset counter.
17
}

und
1
unsigned char USI_TWI_Master_Transfer( unsigned char temp )
2
{
3
  USIDR = temp;
4

5
  USISR = (1<<USISIF)|(1<<USIOIF)|
6
        (1<<USIPF)|(1<<USIDC)|
7
      (0x0<<USICNT0);                         // Set USISR according to
8
      //  Clear flags, and set USI to shift 8 bits i.e. count 16 clock edges..
9

10
                                                    // Prepare clocking.
11
  temp  =  (0<<USISIE)|(0<<USIOIE)|                 // Interrupts disabled
12
           (1<<USIWM1)|(0<<USIWM0)|                 // Set USI in Two-wire mode.
13
           (1<<USICS1)|(0<<USICS0)|(1<<USICLK)|     // Software clock strobe as source.
14
           (1<<USITC);                              // Toggle Clock Port.
15
  do
16
  {
17
    _delay_loop_1( 2 );              
18
    USICR = temp;                          // Generate positve SCL edge.
19
    while( !(PIN_USI & (1<<PIN_USI_SCL)) );// Wait for SCL to go high.
20
    _delay_loop_1( 4 );              
21
    USICR = temp;                          // Generate negative SCL edge.
22
  }while( !(USISR & (1<<USIOIF)) );        // Check for transfer complete.
23
  
24
  _delay_loop_1( 2 );                
25
  temp  = USIDR;                           // Read out data.
26
  USIDR = 0xFF;                            // Release SDA.
27

28
  return temp;                             // Return the data from the USIDR
29
}
Gast #1409295
Lesenswert?

Hallo Jorg,

/*Hmm, ich blicke jetzt nicht ganz durch, hast du noch ein Problem
offen oder nicht?*/

Nun nicht ganz zu ;) sag ich mal so. Senden kann ich ändlich was (also 
TWI läuft). Hab als Slave einen LM3944 i2c LED-kontroller, der will 
nicht meine Nachrichten umsetzen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren