Was mich etwas stutzig macht, ist die Frequenz für TWI:
1 | #define AT91B_MAIN_OSC (18432000) // Exetrnal Main Oscillator MAINCK
|
2 | #define AT91B_PROCESSOR_CLOCK ((AT91B_MAIN_OSC/14)*74) // Output PLL Clock (100 MHz)
|
3 | #define AT91B_MASTER_CLOCK (AT91B_PROCESSOR_CLOCK) // Output PLL Clock (100 MHz)
|
4 | #define AT91C_TWI_CLOCK 8000 /* in Hz*/
|
1 | void AT91F_SetTwiClock(void){
|
2 | int sclock;
|
3 | /* Here, CKDIV = 1 and CHDIV=CLDIV ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/
|
4 |
|
5 | sclock = (10*AT91B_MASTER_CLOCK /AT91C_TWI_CLOCK);
|
6 | if (sclock % 10 >= 5)
|
7 | sclock = (sclock /10) - 5;
|
8 | else
|
9 | sclock = (sclock /10)- 6;
|
10 | sclock = (sclock + (4 - sclock %4)) >> 2; // div 4
|
11 | AT91C_BASE_TWI->TWI_CWGR = ( 1<<16 ) | (sclock << 8) | sclock;
|
12 | }
|
Mit 8k Hz sehe ich die richtig-losgesendete Adresse an SDA; wenn ich
jetzt allerdings 100k Hz verwende, sehe ich lediglich noch das Startbyte
- die Adresse kann nicht mehr dargestellt werden (obwohl der Slave
ebenfalls bis 400k Hz gehen kann. Definiere ich den Wert der TWI_Clock
falsch?
Die Clock des Prozessors müsste ca. den obigen Werten übereinstimmen,
da ansonsten auch keine Ausgabe über RS232 möglich wäre.
Gruß
Bernd