SPI busz
SPI busz
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
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
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
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:
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....
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
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....
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
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ő:
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?
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
"Szerintem" így van a progban, de mégsem jó...
Nem lehet, hogy valahol csúszik 1 bitet a programom?
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).
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).
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
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...
Í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...
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
Memória
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
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
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?
/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?
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.
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.