SPI busz

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Ubul
DrótVégénSzéndarab
Hozzászólások: 48
Csatlakozott: 2006. január 6. péntek, 7:00

SPI busz

Hozzászólás Szerző: Ubul »

Sziasztok!

Több alkatrész gyártó is használ SPI
buszos vezérlést és a BASCOM fordító
is ír róla valamit. Esetleg ha pár mondatban
összefoglalná valaki a lényeget jól jönne.

Tulajdonképpen az a problémám hogy a legtöbb
gyártónál mások a lábkiosztások.

Én DAC átalakítót szeretnék vezérelni.
Például ezt:

http://www.analog.com/en/prod/0%2C2877% ... %2C00.html

Köszi: Peti
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Üdv,
SPI buszon kellene vezérelnem egy IC-t. Hardveresen nem gond, szoftverrel vannak homályok:
Ha kiadok egy SPIOUT utasítást, akkor a vevő honnan tudja, hogy milyen címre akarok írni?
Automatikusan 0-től kezdődik vagy van valami trükk, amivel meghatározható a cél eszközben a rekesz?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Az SPI es a I2C mas. Az SPInel nem swbol cimzed az eszközt. A Bascom súgóban szépen benne van, én meg most fordítom:).

A katalóguslapokban szépen benne van, mit, milyen sorrendben kell kiadni. Sajna nem egységes a kezelése, kicsit káoszos.
Mostanában egy RF modult tesztelgetek, abban így megy:

Kód: Egész kijelölése

Config Spi = Soft , Din = Pinb.4 , Dout = Portb.3 , Ss = None , Clock = Portb.5

.
.
.
.
Kezd:
   Input "Olvas <0>  Ir <1> ?" , Ut
   Input " hexa parancs  :" , Hx
   Cim(1) = Hexval(hx)
   If Ut = 0 Then
      Reset Cs
      Spiout Cim(1) , 1
      Spiin A , 1
      Set Cs
      Print Hex(cim(1)) ; " cimen adat=" ; A ; " " ; Hex(a)
      A = A / 2
      Print Hex(cim(1)) ; " cimen adat=" ; A ; " " ; Hex(a)
   Else
      Input "adat?:" , Cim(2)
      Cim(1) = Cim(1) + 128
      Reset Cs
      Spiout Cim(1) , 2
      Set Cs
      Print Cim(1) ; " cimre írt adat=" ; Cim(2)
  End If
Goto Kezd
Azaz itt: az elsonek kiirat adat a cimet adja meg, a masodjara kiirt az erteket adja meg/olvassa be.
Kiiras: SPIOut, be azu SPIIn. Hasonlo az 2Chez, az I2CWrite/I2Cread utasitasokhoz, csak itt nem foglalkozol a ack/nack jelekkel, illetve az eszköz címzése lábbal megy. Próbának én hőmérőchipet vagy valami egyszerűen kezelhető eszközt javasolnék....
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Köszönöm! Ebben nem voltam biztos pontosan, köszi még1x!
Mondjuk simán elszúrtam az órajel fázisát is (lefutó/felfutó)...
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Jól haladok, viszont van 1 kérdésem:
16 biten kell az eszközt vezérelni, szoftveres SPI nem hozott eredmény.
Írtam egy rutint, ami a követekező:

Kód: Egész kijelölése

Reset cs
Kiiro = "0000000010111110" 'BE címe
Gosub Adatki
Reset Clk
Kiiro = "0000001010001000" 'BE adata
Gosub Adatki
Set Cs

Sub Adatki
For T = 16 To 1 Step -1
   Set Clk
   Z = Mid(kiiro , T , 1)
   If Z = "1" Then Set Dat Else Reset Dat
   Reset Clk
Next
Set Clk
Waitms 10
End Sub
Az adatlap szerint, először a címet kell kiírni, majd az adatot. Előszőr a szóból az LSB-T, a legvégén az MSB-t.
"Szerintem" így van a progban, de mégsem jó...
Nem lehet, hogy valahol csúszik 1 bitet a programom?
Robert-

Hozzászólás Szerző: Robert- »

SUB-ot CALL-lal hivunk meg, GOSUB-bal meg cimkére hivatkozunk:).

Mondjuk szerintem túl gyors is lehet a SPI buszod így (waitus részekkel megtűzdelném...
A HW-es SPI miért nem jó?


Szerintem valami más hiba lehet. Az eszközről olvasni tudsz? én azzal szoktam kezdeni. így tudom ellenőrizni jó-e a kommunikáció, valamint utána az írás is megy - és ellenőrizhető (ha regiszterbe megy).
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

A hw-s és sw-s SPI azért nem jó, mert:
Írás után felemeli a cs lábat. Próbáltam, hogy a cs lábat külön vezérlem (írás előtt 0, írás végén 1). Ennek ellenére az SPI az írás után felemeli a lábat. Erre az első byte elveszik... :(
Olvasni nem lehet erről az eszközről, csak írni.

Még a sebességet megpróbálom, hátha...
Robert-

Hozzászólás Szerző: Robert- »

A CS lábat azért emeli fel, mert a Configban azt mondtad neki!
Ha a SS=NONE paraméterrel kommunikálsz, akkor NEKED kell a ChipSelect lábat emelgetni...
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

SS=NONE-t használtam SPI-nél, ennek ellenére felemelte.
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

Hozzászólás Szerző: nobody_hun »

Jelentem beleőrültem, de készen van.
Mindennek a forrása a szoftveres SPI port volt 2313-on, ez volt a vesztem (főként, hogy a 2313-ban nincs csak USI).
Átraktam az egészet M16-ra, hw-s SPI-re és láss csodát, korrekten működik. :lol:
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

:) Előfordul. De az eredmény számít!
Mindenki esik bele ilyenbe... :evil:
Avatar
Ubul
DrótVégénSzéndarab
Hozzászólások: 48
Csatlakozott: 2006. január 6. péntek, 7:00

Memória

Hozzászólás Szerző: Ubul »

Sziasztok!

Esetleg ha van valakinek linkje SPI buszos EEPROM-ot
tartalmazó BASCOM-ban íródott projektre és elküldené,
nagyon hálás lennék.

A Megaboard tesztprogramjai közt, csak a méret lekérdezést találom....

Köszönettel: Peti
Avatar
7kaz
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2006. szeptember 26. kedd, 6:00

Hozzászólás Szerző: 7kaz »

Volt itthon egy Winbond W25P16-os soros flashram, gondoltam kipróbálom. Az eszköz sajnos SPI buszos. A szokásos illesztéssel dolgozik:
/CS, Din, Dout, CLK

A ram 3,3V-os eszköz, külön 3,3V-os stab. IC-ről kapja a tápot. Az M32 felől a ram felé ellenállásosztók vannak, tehát a ram nem kap túlfeszt.

M32 hardveres SPI-jét használom, azaz csak használnám, merthogy nem megy.

A /CS-t a szoftver kezeli, mert a ramnál a teljes utasítás végrehajtása alatt a /CS-nek alacsony szinten kell lennie.
A ram 30MHz-ig kezeli az SPI-t, így a config így néz ki:

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1

Mire jó a Phase? Mindkét beállítást kipróbáltam, egyiknél sem ment. A Bascom helpje itt (is) szűkszavú, abból nem sikerült rájönnöm.

Itt a program, hátha rájöttök, hogy miért nem megy:


$crystal = 14745600
Config Portb.4 = Output

Set Portb.4

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0

Spiinit

Wait 1

Dim Parancs As Byte
Dim Adat(3) As Byte

Parancs = &H90

Reset Portb.4

Spiout Parancs , 1

Parancs = 0
Spiout Parancs , 1
Spiout Parancs , 1
Spiout Parancs , 1

Spiin Adat(1) , 1
Spiin Adat(2) , 1

Set Portb.4

Print "adat1: " ; Adat(1)
Print "adat2: " ; Adat(2)

End

A fenti kód az azonosító kiolvasását végezné.
A kommunikáció a /CS high->low átmenetére indul, az adatlapnak megfelelően, s úgy is marad az adatforgalom végéig, ami a /CS low->high átmenetekor fejeződik be. Ezt a portláb kapcsolásával végzem.

Hexa 90 a parancs kódja, amit 3 db 00 byte követ, s ezután jönne a kétbájtos azonosító.

Szóval, hol a hiba? Van valami ötletetek?
Avatar
7kaz
Bitmanipulátor
Hozzászólások: 138
Csatlakozott: 2006. szeptember 26. kedd, 6:00

Hozzászólás Szerző: 7kaz »

Megoldódott a probléma. Leírom, hátha segít másoknak is.

Ennek a ram-nak van még két lába, az egyik a hardveres írásvédelem lába, a másik a /HOLD.
Az utóbbi a kulcs a megoldáshoz, mert ha az logikai magas szinten van, csak akkor lehet az IC-vel kommunikálni. Még akkor sem megy a dolog, a /CS alacsony szintre kerül. Ez egyfajta védelem. De egy napom ráment, mire rájöttem :(

Hát, ennyi a történet. Ez az IC egyébként egy 16 megabites flashram, párszáz forint és a Chipcad-nél lehet kapni. Ha kevés az EEPROM, de sok az SD kártya, akkor olcsó megoldásként szóba jöhet.
Hooligan01

Hozzászólás Szerző: Hooligan01 »

Hello!

Csak ötletek:

Config Portb.4 = Output helyett nem inkább Config Pinb.4 = Output ?

/Hold láb fel van huzva?
Válasz küldése