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.
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 | }
|
Aber auch nur mit:
1 | #define PORT_USI PORTA
|
2 | #define PIN_USI_SDA PINA6
|
3 | #define PIN_USI_SCL PINA4
|
4 | #define DDR_USI DDRA
|
5 | #define PIN_USI PINA
|
Hmm, ich blicke jetzt nicht ganz durch, hast du noch ein Problem offen oder nicht? Ich habe die USI auf einem ATtiny84 jedenfalls schon für einen SPI-Master benutzt. Das Ergebnis findest du u. a. im µracoli- Projekt wieder.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.