Hallo,
ich versuche seit einiger Zeit das eDIP240-7 über das SPI anzusprechen.
Leider ohne Erfolg...
Wenn ich dagegen die Daten über die serielle Schnittstelle übertrage
funktioniert es.
Angeschlossen ist es wie folgt: (ATMEGA32)
Pin 5 CLK -> PB7 (SCK)
Pin 7 MISO-> PB6 (MISO)
Pin 9 MOSI-> PB5 (MOSI)
Pin 10 SS -> PB4 (SCK)
CPOL,DORD,CPHA sind jeweils offen dh.(Log 1)
-> richtig??
void SPI_MasterInit(void)
{
// Set MOSI and SCK output, all others input
DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4);
// disable \ss
PORTB |= (1 << PB4);
// Enable SPI, Master, set clock rate fck/16
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void linieZeichnen(void)
{
SPI_MasterTransmit(0x11);
SPI_MasterTransmit(0x0A);
SPI_MasterTransmit(0x1B);
SPI_MasterTransmit(0x44);
SPI_MasterTransmit(0x4C);
SPI_MasterTransmit(0x1B);
SPI_MasterTransmit(0x47);
SPI_MasterTransmit(0x44);
SPI_MasterTransmit(0x00);
SPI_MasterTransmit(0x00);
SPI_MasterTransmit(0xEF);
SPI_MasterTransmit(0x7F);
SPI_MasterTransmit(0xDA);
}
int main( void )
{
uart_init( MYUBRR);
SPI_MasterInit();
while(1)
{
_delay_ms(10);
linieZeichnen();
}
return 0;
}
Währe nett wenn mir jemand helfen könnte....komme echt nicht weiter.
Vielleicht hat jemand auch mal ein funktionierendes Beispiel für mich.
Mfg
Sascha
Hallo Sascha,
habe auch lange gebraucht um den eDIP über SPI zu laufen zu bekommen.
Mir hat viel ein LA geholfen mit dem ich das Protokoll beobachtet habe.
Ich sende dir mal mein Beispiel ohne Kommentar, arbeite mit SPI und INT0
Interrupt.
Mal sehen ob du mit meinem Programmierstil was anfangen kannst.
Ich will damit eine Steuerung für die Eisnenbahn, Drehscheibe,
lokschuppen ... aufbauen
Gruss W.G.
Hallo Sascha,
noch ein Nachtrag, arbeitest du auch richtig mit dem SS Signal des SPI,
ich hatte es ein bischen vernachläsigt. Nachdem ich es so wie im
Datenblatt
des eDIP abgebildet realisiert hatte funktionierte es bei mir.
Gruss W.G.
Hallo und erstmal danke für den Versuch mir zu helfen ;-)
Ich werde mich morgen mal durch deinen Code beissen...
Was für einen Controller benutzt du?
Das mit dem SS kann ich leider nicht genau sagen.
Wäre schön gewesen wenn mir jemand sagen könnte wo der Fehler in meinem
Code liegt.
Frohe Ostern
Sascha
>Angeschlossen ist es wie folgt: (ATMEGA32)>Pin 5 CLK -> PB7 (SCK)>Pin 7 MISO-> PB6 (MISO)>Pin 9 MOSI-> PB5 (MOSI)>Pin 10 SS -> PB4 (SCK)
Welches Display benutzt du denn genau? Im Datenblatt (Reichelt) steht:
Pin 9 CLK
Pin 8 MISO
Pin 7 MOSI
Pin 6 SS
Unterscheiden sich die Pinbelegungen der Displays?
Hallo,
hatte das gleiche Problem mit dem e320DIP. Über die serielle ging es,
aber über SPI nicht.
Der Fehler war, man muss das ACK( 6) mit einem Dummybefehl, oder Du
kannst es auswerten, aus dem Displaycontroller auslesen. Über die
serielle schnittstelle geht das automatisch. Wenn man es nicht ausliest,
dann verschluckt der Controller praktisch jeden 2 Befehl...
Hoffe es hilft Dir
Gruss und frohe Ostern
Bernd
Sorry, klar...war die Belegung meiner Stiftleiste ;-)
Ist Natürlich laut Datenblatt angeschlossen:
>Pin 9 CLK -> PB7 (SCK)>Pin 8 MISO-> PB6 (MISO)>Pin 7 MOSI-> PB5 (MOSI)>Pin 6 SS -> PB4 (SCK)
Display ist das eDIP240-7..
@Bernd
hättest du mal einen Beispielcode? Kann mir jetzt nicht viel darunter
vorstellen.
Ist zum verzweifeln das Ding...
Gruß
Sascha
evtl. hilft dir meine asm-Lib, die ich für das Display geschrieben habe.
Das Display lief sofort mit ASM und I2C :) Falls Du noch die I2C-Lib
brauchst, dann melde Dich einfach noch mal.
Über den PC und RS232 progge ich nur die Menues.
Hallo
zur zeit nicht, weil das ein Projekt auf der Arbeit war.
Aber ganz einfach.
spitransfer( befehle und daten mit crc lt Datenblatt);
spitransfer(0); Wenn du das ACK(=6) nicht benötigst
dummy = spitransfer(0); wenn du es auswerten willst, es kom´men ja
verschiedene Erorrs zurück!
durch diesen zusaetzlichen befehl wird automatisch ja ueber MISO das ACK
ausgelesen, das Byte steht praktisch schon drin im Controller, man muss
es nur lesen! Zum Lesen muss doch ein CLK Signal erzeugt werden, und
genau das passiert dann.
Verstanden..?
Gruss Bernd
So zumindest bekommen ich nun mit folgendem Code schon mal eine Linie
gezeichnet....
void spi_init(void) {
// Aktivieren der Pins f?r das SPI Interface
DDR_SPI |= (1<<P_SCK)|(1<<P_MOSI); //DDRB =
(1<<PB5)|(1<<PB7)|(1<<PB4);
PORT_SPI &= ~((1<<P_SCK)|(1<<P_MOSI)|(1<<P_MISO)); //PORTB |= (1
<<PB4);
DDR_CS |= (1<<P_CS);
PORT_CS |= (1<<P_CS);
// Aktivieren des SPI Master Interfaces, fosc = fclk / 4
SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA);
}
uint8_t spi_putc( uint8_t data ) {
// Sendet ein Byte
SPDR = data;
// Wartet bis Byte gesendet wurde
while( !( SPSR & (1<<SPIF) ) )
;
delay_us(500);
return SPDR;
}
void linie_zeichnen(unsigned char x1,unsigned char y1,unsigned char
x2,unsigned char y2)
{
char dummy=0;
char bcc=0;
bcc=(DC1+0x0A+ESC+0x44+0x4c+0x1B+0x47+0x44+x1+y1+x2+y2)%256;
PORT_CS &= ~(1<<P_CS);
spi_putc(DC1);
spi_putc(0x0A);//len
spi_putc(ESC);
spi_putc(0x44);
spi_putc(0x4c);
spi_putc(0x1B);
spi_putc(0x47);
spi_putc(0x44);
spi_putc(x1);
spi_putc(y1);
spi_putc(x2);
spi_putc(y2);
spi_putc(bcc);
PORT_CS |= (1<<P_CS);
//uart_Send(bcc);
dummy = spi_putc(0x00);
uart_Send(dummy);
}
Allerding scheint er wirklich jeden zweiten Befehl zu verschlucken...
müsste mir die obige Funktion linie_zeichnen(); nicht so das ACK bzw.
NAK
ausgeben? Irgendwie ist mir die Sache mit dem SPI empfang noch unklar.
Oder muss ich hierfür diese Funktion benutzen:
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}
Sorry wegen der vielen Fragen
Mfg
Sascha
Hallo Sascha
war jetzt 2 Tage nicht online.
Zur info, ich benutze den mega8315.
Noch mal zu dem SS Signal, meine Erfahrung damit war, das der
Prozessor keines erzeugt, es war bei mir immer low.
Ich hatte auch immer Aussetzer. Das edip lief nicht stabil.
Ich habe mir dann das Datenblatt des edip angeshen und meine
Signale auf dem LA, um festgestellt das da beim SS Signal unterschiede
waren.
Danach habe ich nach jedem gesendeten Byte des SS wieder deaktiviert
(High),
und vor jedem Senden wieder akitviert
und sofort wurde das edip stabil.
Man sollte sicher sein das das Verhalten aus dem Datenblatt auch durch
das SPI exakt nachgebide wird.
Bist du auch sicher das deiner Checksumme richtig berechnet wird,
im Zweifek mit Calculator kontrollieren.
Nach dem Senden des bcc warte ich ein paar us und sende dann FF (dummy
Byte)
und sofort antwortet der edip mit dem ACK.
Ich habe z.Z nur ein Problem das nach einer bestimmten Anzahl
von Taste oder Schalter funktionen das edip aus dem Tritt kommt, und
spinnt.
gruss W.G.