Hallo,
vielleicht kann mir jemand weiter helfen.
Ich möchte über den SPI den MCP23S09 ansteuern.
Wäre die Initialisierung soweit richtig? Und wie steuer ich zB. eine Led
über den MCP an.
init_SPI
BANKSEL SSPCON
movlw B'00110000'
movwf SSPCON
BANKSEL SSPSTAT
movlw B'10000000'
movwf SSPSTAT
BANKSEL INTCON
bsf INTCON,7
bsf INTCON,6
Gruß Hansi
Du möchtest wahrscheinlich wissen, ob deine SPI-Initialisierung für
"deinen" Mikrocontroller ok ist.
Kannst du uns diesen Controller auch nennen?
Andernfalls ist es nicht ratsam, Hinweise zu geben bzw. auf diese zu
hören.
Im Datenblatt steht eigentlich alles notwendige für den MCP23S09 drin.
- GPIO-Port als Ausgang definieren (per default sind alle als Input) -
Register "IODIR"
- GPIO-Port mit gewünschter Bitbelegung beschreiben - Register "OLAT"
Da keiner weiß, ob wie du die LED an den Expander angeschlossen hast,
kann nicht gesagt werden, ob du sie mit einer 1 oder einer 0 anbekommst.
and GO!
Also ich würde dir zum SPI-Mode 1,1 raten
(Data transmitted on falling edge of SCK + SCK high in IDLE)
Im MCP23S09-Datenblatt wird auch Mode 0,0 oder 1,1 empfohlen.
Quasi:
SSPSTAT: 0b11000000
SSPCON: 0b00110000
[EDIT]
Wenn du mit den Interrupts die LED Togglen möchtest, musst du noch etwas
mehr einstellen, als GIE und PIE ;)
Ich wähle durch BANKSEL SSPBUF das Register aus, dann speicher ich den
Wert, den ich senden möchte ins SSPBUF Register. Dieser soll dann LEDs
auf einer Platine ansteuern.
Hm, ok du hast den MCP23S09 noch nicht verstanden.
Schau dir mal im Datenblatt Fig.1-9 an (Seite 13).
Des Weiteren: was bezweckst du mit folgenden Zeilen?
Hm, genau das habe ich mir gedacht, allerdings wird das mit dem
PORT-Register nicht funktionieren.
1. Du hast den Port noch nicht als Output definiert (TRISA-Register)
2. PORTx-Register sind nur zum LESEN des Ports da, wohingegen
LATx-Register zum SCHREIBEN verwendet werden! PIC18-Grundlagen! Was du
da machst, geht nur bei der PIC10-, PIC12- und PIC16-Familie.
Ich habe den TRISA oben direkt schon als OUTPUT definiert. Hier nur
nicht reingesetllt. Ich benutze den PIC16F886, dann müsste das doch
eigentlich klappen.
Sry, ich war grad mit den Gedanken in einem anderen Thread^^
Da ging es um einen PIC18F2550^^
Für den PIC16 ist das Beschreiben von PORTA ok.
Dann schau dir bitte die Kommunikation mit dem MCP23S09 an. Du musst ihn
via SPI korrekt adressieren!
D.h. fallende Falnke CS + Opcode(inkl.R/W) + Register (+ zu schreibendes
Byte, wenn im Write-Mode) + steigende Flanke CS
steht doch alles im Datenblatt^^
Wenn du einfach nur ein Byte via SPI raus schickst, weiss doch der
IO-Expander nicht, was er damit machen soll. Das Teil hat keine
integrierte Intelligenz.
[EDIT]
Des Weiteren:
Wozu aktivierst du SSPIE vor dem Senden?
Wozu brauchst du den Interrupt "während" der Operation als Master?
Hansi Müller schrieb:> Ich habe das soweit fertig.Ist das richtig mit den 16 Bit am SSPBUF?
Was sagt denn dein Verstand, wenn du 16Bit in ein 8Bit-Buffer schieben
möchtest?
Du musst das schon nacheinander machen.
1. Byte1 ins SSPBUF
2. warten bis rausgesendet (Stichwort: SSPIF)
3. Byte2 ins SSPBUF
4. warten bis rausgesendet (Stichwort: SSPIF)
und so weiter...
Kannst du mal bitte erklären, was das für ein 16Bit-Wort ist?
Bzw. warum du genau diese Bitbelegung verwendet hast.