Forum: Mikrocontroller und Digitale Elektronik SPI MCP23S09


von Hansi M. (hansi875)


Lesenswert?

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

von Björn P. (bjrn_g)


Lesenswert?

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!

von Hansi M. (hansi875)


Lesenswert?

Ich benutze den PIC16F886 und meine LED soll mit dem MCP auf Masse 
gezogen werden.

von Björn P. (bjrn_g)


Lesenswert?

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 ;)

: Bearbeitet durch User
von Hansi M. (hansi875)


Lesenswert?

Es will immer noch nicht so richtig,
ich hab jetzt genau das geschrieben:

;init_SPI

  BANKSEL      SSPCON
  movlw      B'00110000'
  movwf      SSPCON

  BANKSEL      SSPSTAT
  movlw      B'11000000'
  movwf      SSPSTAT




Programm
;  bcf      PORTC,2
  BANKSEL      PIE1
  bsf      PIE1,SSPIE
  BANKSEL      PORTA
  bcf      PORTA,0
  BANKSEL      SSPBUF
  movlw      B'00101000'
  movwf      SSPBUF

  movlw      SSPBUF
  movwf      Leer
  BANKSEL      PORTA
  bsf      PORTA,0
  BANKSEL      PIE1
  bcf      PIE1,SSPIE
  BANKSEL      PIR1
;  bcf      PIR1,SSPIF

von Björn P. (bjrn_g)


Lesenswert?

Kannst du mal bitte in Worte fassen, was du mit diesen Zeilen genau 
machen möchtest?
1
  BANKSEL    SSPBUF
2
  movlw      B'00101000'
3
  movwf      SSPBUF

Ich möchte nur prüfen, ob du die Funktionsweise des MCP23S09 verstanden 
hast.

von Hansi M. (hansi875)


Lesenswert?

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.

von Björn P. (bjrn_g)


Lesenswert?

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?
1
  BANKSEL    PORTA
2
  bcf        PORTA,0

von Hansi M. (hansi875)


Lesenswert?

Ja, ich guck mal rein.
Ok, das kannst du leider nicht wissen. Ich setze CS auf low, damit es 
auf Empfangen gestellt ist.

von Björn P. (bjrn_g)


Lesenswert?

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.

von Hansi M. (hansi875)


Lesenswert?

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.

von Björn P. (bjrn_g)


Lesenswert?

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?

: Bearbeitet durch User
von Hansi M. (hansi875)


Lesenswert?

BANKSEL      TRISA
movlw      B'00000000'
movwf      TRISA

movlw      B'00010000'    ; SDI (RC4)
movwf      TRISC

;init_SPI

BANKSEL   SSPSTAT
movlw       B'11000000'
movwf       SSPSTAT

  BANKSEL      SSPCON
  movlw       B'00110000'
  movwf      SSPCON



Programm


  BANKSEL      PORTA
  bcf      PORTA,0


  BANKSEL      SSPBUF
  movlw      B'0010000110101011'
  movwf      SSPBUF

  BANKSEL     SSPSTAT

Flagabfrage
  btfss      SSPSTAT,BF
  goto      Flagabfrage

  BANKSEL      SSPBUF
  movf      SSPBUF, W

  BANKSEL      PORTA
  bsf      PORTA,0

    goto      Programm

end


Ich habe das soweit fertig.Ist das richtig mit den 16 Bit am SSPBUF?

von Björn P. (bjrn_g)


Lesenswert?

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.

von Hansi M. (hansi875)


Lesenswert?

Ich bin verzweifelt. Muss das in das OALT Register reingeschrieben 
werden?

: Bearbeitet durch User
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.