PIC18F25J10 und 24LC64 / MCC18

Gast #905603
Lesenswert?

Hallo,

ich möchte mit einem PIC18F25J10 einen 24LC64 ansprechen
und habe folgende zwei Routinen geschrieben -
aber es funktioniert nicht
(ich verwende den MCC18).

Der Lesevorgang sollte über Random Read funktionieren.
Die Funktionen eeprom_WriteByte und eeprom_ReadByte
rufe ich in meiner Hauptroutine hintereinander auf.

Kann mir jemand einen Tipp geben, was ich falsch mache -
bzw. wo finde ich entsprechende Source-Code-Beispiele?

Vielen Dank
thomas

1
#include <p18f25j10.h>
2
#include <i2c.h>
3

4
#include <controller.h>
5

6
void eeprom_WriteByte (void)
7
{
8
  OpenI2C(MASTER, SLEW_ON);// Initialize I2C module
9
  SSPADD = 12;
10

11
  IdleI2C();
12
  StartI2C();
13

14
  IdleI2C();
15
  WriteI2C(0xA0); // control byte
16
  AckI2C();
17

18
  IdleI2C();
19
  WriteI2C(0x00); // reg address
20
  AckI2C();
21

22
  IdleI2C();
23
  WriteI2C(0x00); // reg address
24
  AckI2C();
25

26
  IdleI2C();
27
  WriteI2C('A');
28
  AckI2C();
29

30
  IdleI2C();
31
  WriteI2C('B');
32
  AckI2C();
33

34
  StopI2C(); 
35

36
  CloseI2C();
37

38

39
}
40

41

42
unsigned char eeprom_ReadByte (void)
43
{
44
  unsigned char ret_value;
45

46
  OpenI2C(MASTER, SLEW_ON);// Initialize I2C module
47
  SSPADD = 12;
48

49
  IdleI2C();
50
  StartI2C();
51

52
  IdleI2C();
53
  WriteI2C(0xA0); // control byte
54
  AckI2C();
55

56
  IdleI2C();
57
  WriteI2C(0x00); // reg address
58
  AckI2C();
59

60
  IdleI2C();
61
  WriteI2C(0x00); // reg address
62
  AckI2C();
63

64
  IdleI2C();
65
  StartI2C();
66
  AckI2C();
67

68
  IdleI2C();
69
  WriteI2C(0xA1); // control byte
70
  AckI2C();
71

72
  IdleI2C();
73
  ret_value = ReadI2C();
74

75
  StopI2C(); 
76

77
  CloseI2C();
78

79
  return ret_value;
80

81
}
Gast #905624
Lesenswert?

Hallo,

also mit welchem Takt läuft dein PIC? (SSPADD = 12; deutet auf relativ 
niedrigen Takt, oder eine sehr hohe I2C Geschwindigkeit?)

In deiner Read Routine denke ich müsste das 2. StartI2C(); ein 
RestartI2C(); -- ebenso musst du bei Verwendung des Hardware I2C Moduls 
als Master noch einige Warteschleifen einbauen, bis die jeweilige 
Operation auch durchgeführt wurde - die Funktionen welche du aufrufst 
geben die Werte direkt in die Ausgaberegister des PIC - und diese läuft 
dann Parallel zum eigentlichen Programm.

Schau mal hier: -> 
http://www.fernando-heitor.de/component/option,com_smf/Itemid,121/topic,3659.msg18710/topicseen,1/

Ich kämpfe derzeit auch mit einem 64kbit I2C Eeprom an einem 18F4550 - 
vielleicht hilft Dir ein Blick auf meine Routinen - ich habe das meiste 
an Code aus den Original Microchip C18 Bibliotheken recyclet.

André
Gast #905966
Lesenswert?

Hallo André,

mein PIC taktet mit 20MHz
und der 24LC64 mit 400kHz

ich habe es auch mit

OpenI2C(MASTER, SLEW_OFF);    // 100 kHz
SSPADD = 49;

probiert - es funktioniert trotzdem nicht.


Wenn ich Deinen Code verwende,
bekomme ich am Ende einen bus_collision_error!?
1
  StopI2C();              // send STOP condition
2
  while ( SSPCON2bits.PEN );// wait until stop condition is over
3

4
  if ( PIR2bits.BCLIF )   // test for bus collision
5
       goto bus_collision_error;


lg
thomas

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