Auf Seite 4 ganz oben wird es erwähnt
Also das Problem ist dieses (nochmal zusammengefasst):
Ich habe einen I²C Bus aus einem Raspberry Pi als Master, einem 24C128 EEPROM, einem PCF8574 und einem PSoC als I²C Slave (benutze das EzI²C Modul http://www.cypress.com/?docID=34801).
Per i2cdetect werden ALLE Geräte am Bus erkannt, aber das Schreiben und Lesen klappt nur beim PCF8574 richtig. Beim EEPROM lese ich was anderes aus als ich rein geschrieben habe und beim PSoC schlägt das Lesen und das Schreiben fehl.
Den PSoC als I²C Slave habe ich aber bereits mit einem Mega32 als Master ausprobiert und da klappte sowohl das Lesen als auch das Schreiben des Mega32 von dem PSoC problemlos.
Hier ist mal der Testcode vom Mega32:
Code:
'Mikrocontroller
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 19200
'Stacks
$hwstack = 200
$swstack = 200
$framesize = 400
'TWI konfigurieren
Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000 'TWI Frequenz
'Adresse des PCF
Const Psocw = &H80
Const Psocr = &H81 'Adresse vom PSoC. Der PSoC hat softwareseitig die
'0x40 als 7-Bit Adresse bekommen. Mit R/W Bit ergibt
'Variablen 'dies 0x80
Dim Bitmuster As Byte
Dim Buffer As Byte
Bitmuster = 0
Buffer = 0
'I²C initialisieren
I2cinit
Do
'PSoC beschreiben
I2cstart 'TWI Startkondition
I2cwbyte Psocw
I2cwbyte 0 'Startadresse des I²C Buffers vom PSoC
I2cwbyte Bitmuster 'Daten übertragen
I2cstop
'PSoC auslesen
I2cstart
I2cwbyte Psocr
I2crbyte Buffer , Nack
Print "Wert: " ; Buffer 'Ausgabe der Daten
Incr Bitmuster 'Bitmuster um eins erhöhen
Wait 1
Loop
End
Und vom PSoC:
Code:
//----------------------------------------------------------------------------
// C main line
//----------------------------------------------------------------------------
#include <m8c.h> // Part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
// Variablen
char Wert = 100;
// Funktionen
void I2C_Init(void);
void main(void)
{
M8C_EnableGInt;
LCD_Start(); // LCD Modul aktivieren
LCD_Position(0,0);
LCD_PrCString("PSoC I2C Slave");
EzI2Cs_SetRamBuffer(1, 1, (char *)&Wert); // I²C Buffer setzen, 1 Byte Größe, 1 Byte Schreib/Lesbar
I2C_Init();
while(1)
{
LCD_Position(1,0);
LCD_PrCString("Wert:");
LCD_Position(2,0);
LCD_PrHexInt(Wert);
}
}
void I2C_Init(void)
{
EzI2Cs_Start(); // I²C Modul starten
EzI2Cs_EnableInt(); // I²C Interrupts aktivieren
}
Hoffe das Problem ist dadurch etwas klarer geworden
Edit:
Den PSoC betreibe ich mit 5V. Da das Raspberry Pi nur 3,3V Pegel verwendet, nutze ich die Pull-Ups vom Raspberry Pi und habe damit einen 3,3V I²C Pegel.
Laut dem Datenblatt von dem Chip
http://www.datasheetcatalog.org/data...j2lq6ps83y.pdf
reichen 2,1V für einen High Pegel aus. Es kann also auch nicht sein das er die Pegel nicht erkennt.
Lesezeichen