Ich konnte den Fehler nun weiter eingrenzen. Es sieht nun wie folgend
aus:
1) Der Master sendet Startbedingung, Slaveadresse und R/W (wobei 1
(lesen) gesendet wird)
2) Der Slave sendet ein Acknowledge und wechselt dann in den Error
Zustand. Dadurch wird die Clock Leitung auf Low gezogen. => Der Master
erkennt dies und wechselt ebenfalls in den Error Zustand.
Zum Testen habe ich die Frequenz des Mikrocontrollers auf 24,5MHz
gestellt und siehe da, es funktioniert. Das heißt, dass Problem hat mit
dem Systemclock des Mikrocontrollers zu tun. Dadurch können nur 2
Codeteile ausschlaggebend sein:
1 | void InitController()
|
2 | {
|
3 | //SFR-Page Einstellungen
|
4 | /////////////////////////
|
5 | SFRPAGE = 0x0F;
|
6 | SFRPGCN = 0x00; //disables automatic paging
|
7 |
|
8 | // Porteinstellungen
|
9 | /////////////////////
|
10 | XBR2 = 0x40; // Ports auf weak pull-up einstellen und cross-bar
|
11 | // aktivieren
|
12 |
|
13 | //Systemclock (100 MHz)
|
14 | ////////////////////////
|
15 | OSCICN = 0x83; //interne Oszillatorfrequenz auf 24.5 MHz
|
16 | while(!(OSCICN & 0x80)); //Wartet bis die Oszillatorfrequenz stimmt
|
17 | PLL0CN = 0x00; //Systemclock wird für PLL Eingang benutzt
|
18 | SFRPAGE = 0;
|
19 | FLSCL = 0x30; //Flash Read Timing auf 100 MHz geändert
|
20 | SFRPAGE = 0x0F;
|
21 | PLL0CN = 0x01; //PLL-Power aktivieren
|
22 | PLL0DIV = 0x01; //Dividiert den Systemclock (24.5 MHz) durch 1
|
23 | PLL0FLT = 0x01; //Filtereinstellung: 24.5 MHz Eingang, 100 MHz Ausgang
|
24 | PLL0MUL = 0x04; //24.5 MHz * 4 = 98 MHz
|
25 | Sleep(1); //Wait at least 5 µs, to provide a fast frequency lock.
|
26 | PLL0CN = 0x03; //Aktiviert PLL
|
27 | while(!(PLL0CN & 0x10)); //Warte bis PLL bereit ist
|
28 | CLKSEL = 0x02; //Als Systemclock wird nun PLL verwendet
|
29 | }
|
1 | //Dieses Programm initialisiert den SMBus
|
2 | void SMBus_Init()
|
3 | {
|
4 | char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
|
5 |
|
6 | SFRPAGE = 0x0F;
|
7 | P0MDOUT = 0x00; // All P0 pins open-drain output
|
8 | XBR0 |= 0x01; // SM-Bus erlauben
|
9 | P0 = 0xFF;
|
10 | SFRPAGE = 0x00;
|
11 | EA=1;
|
12 | SMB0CN |= 0x04; //SM-Bus erlaubt, Acknowledge aktiviert
|
13 | SMB0CR = 256-(((1/SMBUS_CLOCK)*FREQUENZ)/4); //Clockrate
|
14 | SMB0ADR = MY_ADDR; //Meine Adresse
|
15 | SMB0CN |= 0x40; //SM-Bus erlaubt, Acknowledge aktiviert
|
16 |
|
17 | SFRPAGE = SFRPAGE_SAVE;
|
18 | }
|
Hat jemand eine Idee woran das liegen könnte? Das Beispiel von Silabs
macht es ganz genau so doch so funktioniert es leider nicht... Alle
Einstellungen stimmen auch mit denen des Datenblattes überein.
PS: SMBUS_CLOCK = 100000, FREQUENZ = 98000000
Danke für eure Hilfe!