SPI probleem

Hallo,

Om een oscilloscoop op USB te maken, heb ik een schakeling met 1 master PIC die communiceert via SPI met een slave pic, grafisch LCD scherm en extern sRAM geheugen.

Wanneer ik de schakeling op breadboard gemaakt heb, werkte deze perfect. Nu ben ik de componenten geleidelijk aan het solderen op een gaatjesprint (en via draden verbonden met de rest van de schakeling op het breadboard.

Wanneer ik in een tweede stap de slave PIC op de gaatjesprint gesoldeerd heb, werkte de SPI communicatie niet meer. Ik had (toevallig) gevonden dat het terug werkte wanneer ik een 330 ohm weerstand in serie zet tussen de CS uitgang van de master PIC en de SS ingang van de slave PIC. Goed, dat werkt dus terug.

Als ik nu in een derde stap het sRAM geheug naar de gaatjesprint verplaatst heb, werkt enkel het sRAM niet meer. Er is niets verkeerd met de connecties en contacten, ik heb ze allen doorgemeten. En als ik dit IC terug op het breadboard aansluit, werkt het terug.

Wat doe ik verkeerd?
Ik verbind gewoon de SCK van de master rechtstreeks (zonder weerstanden, condensators, ...) met de SCK van de verschillende slaves. SDO van master naar SDI's van slaves. SDI van master naar SDO's van slaves. En de CS (dacht ik) dat die ook gewoon rechtstreeks verbonden mochten worden van de verschillende CS's van de master naar de slaves.

Dank bij voorbaat

Arco

Special Member

Zijn ze allemaal wel voor dezelfde spanning? (3.3v of 5v).
Als dat verschillend is per ic krijg je grote problemen met niet kloppende logic levels...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Heb je de voedingslijnen van de PIC en SRAM IC's wel goed ontkoppeld (met 100nF of zo)?

Fan van Samsung (en repareer ook TV's). :)

Master pic is 18f4550, slave 18f2550 en sram 23lc1024. Volgens mij allen 5v.

Eh, nee denk niet dat ik die ontkoppeld heb... Hoe moet dat? Heb enkel 1 keer 100 nF parallel met voeding staan.

Zou wel eens het probleem kunnen zijn. Werkt soms ook wel afhankelijk van lengte/type draden of als je er met een stuk metaal tegen komt (niet met plastic)

Arco

Special Member

Richtlijn:
Ieder ic een 100nF bij iedere voedingsaansluiting naar Gnd, en wel zo kort mogelijk aansluiten.
(bij hoge frequenties kan een waarde van < 100nF effectiever werken)
Bij analoge ic's indien mogelijk daaraan parallel een 10uF.

[Bericht gewijzigd door Arco op donderdag 5 juli 2018 17:34:48 (17%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

Op 5 juli 2018 16:33:46 schreef elektronica:
Eh, nee denk niet dat ik die ontkoppeld heb...

Dat wordt nog steeds door velen onderschat, het ontkoppelen van IC's.

Als je haar maar goed zit, GROETEN LAMBIEK.

Op 5 juli 2018 16:36:19 schreef Arco:
Bij analoge ic's indien mogelijk daaraan parallel een 10uF.

Voor de analoge voeding van de STM32 serie geloof ik dat het advies was: 10nF // 1uF. 10x meer, 10x minder dan de normale 100nF.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Ik heb nu ieder IC voorzien van een 100 nF condensator bij elke voedingsaansluiting vlak bij het IC zelf.

De vooruitgang die hierdoor geboekt is, is dat als ik de sRAM IC aansluit op de master PIC in serie met de draden die ik gebruikte op het breadboard en met 330 ohm weerstand in serie met CS, de schakeling werkt. Maar wanneer ik de draden die ik op het breadboard gebruikt heb ertussen uit doe, en de sRAM rechtstreeks op de master IC aansluit, werkt het niet meer...

Wat doe ik nog verkeerd?

Ik heb alle connecties nog eens nagemeten en ze zijn echt wel in orde. Wanneer ik de sRAM IC terug op het breadboard zet, werkt het terug, schakel ik hem terug via de gaatjesprint werkt het niet.

De low spanningen zijn 0 V, de high spanningen 4,84V = Vcc

Maak eens een foto van beide situaties. (en voeg hem bij een posting.. duh!). :-)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Op 5 juli 2018 16:54:44 schreef Lambiek:
[...]
Dat wordt nog steeds door velen onderschat, het ontkoppelen van IC's.

Of overschat (echter zet ik ze er zelf ook altijd wel bij): https://www.youtube.com/watch?v=P8MpZGjwgR0

^De stabiliteit lijkt prima, maar ik zou er niet op vertrouwen... :P

Kom eens langs bij RevSpace of één van de andere spaces!
Lambiek

Special Member

Op 6 juli 2018 10:15:13 schreef Benadski:
Of overschat.....

Het gaat niet alleen om het ontkoppelen natuurlijk, een stukje ontwerp van je board is ook belangrijk. Zeker bij multilayer.

Als je haar maar goed zit, GROETEN LAMBIEK.

Worden je outputs van de slaves wel hoogimpedant als de CS niet geselecteerd is?

Heb meer dan eens meegemaakt, dat een SPI bus niet per definitie zijn outputs hoogimpedant maakt. Simpel op te lossen met en switch overigens (74xx126 bijvoorbeeld).

Op 6 juli 2018 11:28:01 schreef Antoine:
Worden je outputs van de slaves wel hoogimpedant als de CS niet geselecteerd is?

Heb meer dan eens meegemaakt, dat een SPI bus niet per definitie zijn outputs hoogimpedant maakt. Simpel op te lossen met en switch overigens (74xx126 bijvoorbeeld).

Heb alle slaves afzonderlijk getest: CS hoog gemaakt, en dan afzonderlijk SCK, SDO en SDI verbonden met het midden van 2 weerstanden van 10 kOhm in serie en op de uiteinden Vcc en GND. Bij alle slaves en alle pinnen meette ik Vcc/2. Dan is dit in orde?

benleentje

Golden Member

Hier is wel iets geks aan de hand. MEt lange draden op een breadboard en veel extra capaciteit (breadboard) werkt het wel en met korte draden niet.
Ik denk dat er een probleem is op je gaatjes print en dat je daar een storend signaal hebt gecreëerd wat er op het breadboard niet is.
Een aantal goed foto's zal inderdaad helpen. Maar een scope of logicanalyzer zal je nog meer helpen:).

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
Arco

Special Member

Je maakt niet per ongeluk meerdere CS tegelijk laag? (want dat gaat natuurlijk ook mis)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Hier zijn de foto's:
-Stap 1: https://www.dropbox.com/s/09xjcgct62oiiv5/Stap%201.mp4?dl=0
werkt perfect, alles op breadboard
-Stap 2: hierbij valt er zeker commentaar te geven op de lange kabel en connector naar het scherm, maar wanneer ik het scherm en stekker weglaat, werkt het ook niet. Het heeft tijdelijk gewerkt wanneer ik pull-up weerstanden naar CS plaatste en pull-down weerstanden op SCK, SDO en SDI
-Stap 3: extern sRAM werkt niet meer. Ik weet dat de kabellengte alleen langer geworden is, maar wou nog niet direct alles vastsolderen aangezien het misschien niet zal werken.

Ik begin er eigenlijk een beetje genoeg van te krijgen... Master pic, slave pic voor usb en schermpje werken gelukkig wel. Ik denk dat ik het externe sRAM gewoon achterwege ga laten ;-)
Ik ga alles vastsolderen en de kabels inkorten en dan zien we wel of sRAM werkt of niet, werkt het niet dan laat ik het weg ;-)
PS: iemand suggesties voor een eenvoudig aan te sturen sRAM geheugen met een andere dan SPI interface (dat ik ook gelijktijdig met de SPI voor de andere zaken kan gebruiken)?

Arco

Special Member

Aan SCLK,MISO en MOSI horen geen pull-downs of pull-ups...
Pull-up aan CS kan (i.v.m. opstarten), maar hoort wel gewoon een push-pull aansturing te zijn...
Zijn al die chips aan de SPI bus wel compatible qua mode en snelheid?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Eens met Arco, kan een type 0 of type 3 zijn, die kom ik tenminste het meeste tegen, 1 en 2 bestaat ook. Als ik zo je filmpje bekijk dan vind ik knap dat het daar wel werkt :).

Even puntsgewijs je problemen analyseren.

  1. SPI bus, geen weerstanden of condensators aan of tussen signaal lijnen
  2. Klok dramatisch verlagen om te kijken of signalen overal aan komen
  3. Met scoop meten of de betreffende chip uberhaupt een poging doet terug te praten als jij klokt, of dat jij gewoon niet luistert. Nog eens keer testen met de MISO pin los. De chip moet dan data klokken.
  4. In rust, met alle CS lijnen hoog, dient de gemeenschappelijke MISO lijn te zweven. Deze is hoog impedant. Is hij dat niet, dan heb je ergens een weerbarstige MISO lijn, op te lossen door eerder genoemde switch
  5. In rust, moet de MOSI en SCK HOOG zijn (meestal dan toch), bij een CS geselecteerd in rust is de MISO ook HOOG. Deze lijnen zweven nooit op VCC/2 in rust.
  6. Nooit opgeven, het is een klein en leerzaam probleem dat je noooooit meer fout doet als je het gevonden hebt

Groet Antoine (die alle bus ellende inmiddels wel gehad heeft volgens mij :))

Ja, zelfde modus en snelheid. (Werkte perfect op breadboard.)

1. Ja, daarvan was ik vertrokken. De pull ups en downs had ik uit miserie en wanhoop toegevoegd ;-) Nu staat een 330 ohm weerstand in serie met de CS van de slave pic (anders werkt die niet).
3. Dit gaat mijn scoop worden, dus kan het niet :-p
5. Is het geval.
6. Heb ik nu wel gedaan, ben er iets teveel dagen mee bezig geweest :-p Ik kan 250 metingen opslaan op het interne RAM geheugen van de PIC, en daarbij is de tussentijd tussen 2 metingen minimaal 65 µs.

benleentje

Golden Member

Ja, zelfde modus en snelheid. (Werkte perfect op breadboard.)

Op het breadboard bleven de signalen goed. Op het gaatjes board is er iets in de signalen verander waardoor ze niet meer goed zijn. Dat kan de route zijn via het gaatjes print, overspraak en tal van andere zaken. Straal je kristal niet naar je signaal lijnen?

3. Dit gaat mijn scoop worden, dus kan het niet :-p

Op ebay koop je al voor weinig een logicanalyser, echter zie je daar alleen of het signaal van niveau verandert niet de vervorming op het signaal.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.
Arco

Special Member

Bij de pic wel de speciale /SS lijn gebruikt voor slave select?
(en die pin ook als input gedefinieerd?)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 7 juli 2018 00:08:55 schreef Arco:
Bij de pic wel de speciale /SS lijn gebruikt voor slave select?
(en die pin ook als input gedefinieerd?)

Ja

Iemand suggesties voor een sRAM geheugen met ander communicatie type dat ik naast spi kan gebruiken?

fatbeard

Honourable Member

Ik heb iets soortgelijks meegemaakt (geen breadboard, geen gaatjesprint maar een professionele multilayer).
Betrof de communicatie tussen twee identieke PICs (4MHz bus 'snelheid'): een slave-processor aan een bestaand -goed werkend- apparaat.
Het gekke was dat het alleen werkte met de scoop (HP54645D) aan de CLK en MISO/MOSI lijn...

Heel lang zitten zoeken met twee collega's in zowel hardware als software, datasheets tot op de laatste komma uitgeplozen, nooit wat gevonden. En ja, beide PICs hadden dezelfde bussnelheid en -mode, en dezelfde kristalfrequentie (wel beiden met hun eigen kristal).
Uiteindelijk (product deadline) maar 22pF van zowel CLK, MISO als MOSI naar GND geplaatst: nooit meer problemen gehad met dat ding...

Voor bussen tot een MHZ of 5 (was toen het maximaal haalbare) is dit een werkbare kludge, bij hogere snelheden is het toch een kwestie van spitten.

Ik ben het met Arco en Antoine eens: de meest waarschijnlijke oorzaak is een verkeerde modus. Dan kan in een breadboard-setting (vanwege de grote parasitaire capaciteiten daar) nog nèt werken, als je dan de parasitaire capaciteit verkleint (gaatjesprint) zit je precies aan de verkeerde kant van de marge.

Helaas is dat soort dingen alleen met een -goede- scoop vast te stellen (maar soms ook helemaal niet, zoals in mijn geval), misschien is er iemand die je daarmee kan helpen.

Een goed begin is geen excuus voor half werk; goed gereedschap trouwens ook niet. Niets is ooit onmogelijk voor hen die het niet hoeven te doen.

Ik heb nu alle draden ingekort en vastgesoldeerd. Met de 22 pF weerstanden op SCK, SDI en SDO én met pull-up weerstand op CS komen er af en toe data van sRAM door met veel fouten.

Verdere gegevens (geprogrammeerd met micro basic):
-MASTER PIC: PIC 18F4550
SPI_Init_Advanced(MASTER_OSC_DIV4, DATA_SAMPLE_MIDDLE, CLK_IDLE_LOW, LOW_2_HIGH)
Spi_Glcd_Init(PORTB, 5, PORTB, 4, 0)

-SLAVE 1: PIC 18F2550
TRISA.5 = 1 'SS
TRISB.1 = 1 'SCK
TRISB.0 = 1 'SDI
TRISC.7 = 0 'SDO
adcon1 = 15

sspstat=64 '0b_0100_0000
sspcon1=36 '0b_0010_0100

-SLAVE 2: MCP23S17 voor GLCD aan te sturen

-SLAVE 3: 23LC1024 sRAM