Forum: Mikrocontroller und Digitale Elektronik PIC18F25J10 und 24LC64 / MCC18


von thomas harasek (Gast)


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
}

von André (Gast)


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é

von thomas harasek (Gast)


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

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
Noch kein Account? Hier anmelden.