SPI busz
Hasonló nálam is a feladat....
Ezért lett az Atmel 45DB chipje... remélem nagy különbség az 1Mbit...64Mbit vonatkozásában nincs. miond létezik SOIC8 tokban, így a feladat által megkívánt megy a panelra.... Ha meg kevés, akkor SDkártya . Vagy inkább már szemezek a Mini/MikroSD foglalattal....
1Mbit alatt meg az i2C buszra meg DIP8-ban a 24LC sorozat....
Az adatmentésre-tárolásra vigyázz!
Ha sűrűn írsz ugyanoda, akkor ciki van. EEPROM elfárad.
Ahogy én csináltam I2C-ben:
- az adathalmaz fix 32 byte hosszú. (A beírt adat: év-hónap-nap-óra-perc-másodperc-adathalmaz (össz 32 byte)).
- Az üres IC FF-l van tele.
- A bekapcsoláskor az IC minden 1-33-65... byte-ja letapogat. ha FF van valahol, akkor az a következő üres:) Ehhez 1 trükk kellett. ha az IC körbeér, akkor is a köv byte-ba (azaz a 33.) FF-t kell írjak....
A beírás "szektorát" bekapcsoláskor mentem SRAM-ba és a köv. íráskor csak növelem eggyel. Minden írás előtt nem lehet végigtapogatni a memóriát (a végén lassú volt nagyon) (8 byte adat esetén, a 24LC512 (64kByte!) ~ 0,5-1,5 sec!). Adatgyűjtés meg másodpercenként volt....
De lehet hogy csalok:
a page: 1...8 adat. Így nem kell sűrűn letapogatni....
SD/MMC esetén a minimum méret: 32 MB, 2 GB-s kártyáknál már válogat (Kingston nem megy, TakeMS meg OK). 4 GB-s meg már más szabvány és nincs is itthon próbára:).
Adatátvitel (olvasás byte szinten 40k/sec!) Sima ENTER keresés szövegláncban...
Ja és a memóriaigénye 1 file megnyitásakor 1.2 kbyte SRAM és ~ 4 kbyte Flash!
Ezért lett az Atmel 45DB chipje... remélem nagy különbség az 1Mbit...64Mbit vonatkozásában nincs. miond létezik SOIC8 tokban, így a feladat által megkívánt megy a panelra.... Ha meg kevés, akkor SDkártya . Vagy inkább már szemezek a Mini/MikroSD foglalattal....
1Mbit alatt meg az i2C buszra meg DIP8-ban a 24LC sorozat....
Az adatmentésre-tárolásra vigyázz!
Ha sűrűn írsz ugyanoda, akkor ciki van. EEPROM elfárad.
Ahogy én csináltam I2C-ben:
- az adathalmaz fix 32 byte hosszú. (A beírt adat: év-hónap-nap-óra-perc-másodperc-adathalmaz (össz 32 byte)).
- Az üres IC FF-l van tele.
- A bekapcsoláskor az IC minden 1-33-65... byte-ja letapogat. ha FF van valahol, akkor az a következő üres:) Ehhez 1 trükk kellett. ha az IC körbeér, akkor is a köv byte-ba (azaz a 33.) FF-t kell írjak....
A beírás "szektorát" bekapcsoláskor mentem SRAM-ba és a köv. íráskor csak növelem eggyel. Minden írás előtt nem lehet végigtapogatni a memóriát (a végén lassú volt nagyon) (8 byte adat esetén, a 24LC512 (64kByte!) ~ 0,5-1,5 sec!). Adatgyűjtés meg másodpercenként volt....
De lehet hogy csalok:
a page: 1...8 adat. Így nem kell sűrűn letapogatni....
SD/MMC esetén a minimum méret: 32 MB, 2 GB-s kártyáknál már válogat (Kingston nem megy, TakeMS meg OK). 4 GB-s meg már más szabvány és nincs is itthon próbára:).
Adatátvitel (olvasás byte szinten 40k/sec!) Sima ENTER keresés szövegláncban...
Ja és a memóriaigénye 1 file megnyitásakor 1.2 kbyte SRAM és ~ 4 kbyte Flash!
Az SD-t ki kell tapasztalni...
Éles rendszerbe csak akkor, ha már ismered.....
Lassan úgyis lesz egy cikkrész / alkalmazási minta belőle....
Most a tezsteken vagyok, és a buktatókat írom eddig kb. 1 oldal a buktatók .
FlashRAM az melyik?
Amiket írtam:
- általánosságban az I2C-s EEPROM illetve az SPI-s EEPROM.
- FlashRAMként egyedül a ZeroWaitState FRAM-okat ismerem. legalábbis hívják őket - hibásan - így is. Kémiailag érdekesek.... Mintha miniben a régi ferrit tárak lennének:), csak molekuláris szintre levíve..
Éles rendszerbe csak akkor, ha már ismered.....
Lassan úgyis lesz egy cikkrész / alkalmazási minta belőle....
Most a tezsteken vagyok, és a buktatókat írom eddig kb. 1 oldal a buktatók .
FlashRAM az melyik?
Amiket írtam:
- általánosságban az I2C-s EEPROM illetve az SPI-s EEPROM.
- FlashRAMként egyedül a ZeroWaitState FRAM-okat ismerem. legalábbis hívják őket - hibásan - így is. Kémiailag érdekesek.... Mintha miniben a régi ferrit tárak lennének:), csak molekuláris szintre levíve..
Olvasnivaló:
http://www.winbond.com/hq/enu/ProductAn ... rialFlash/
Én most a W25X32-vel próbálkozom.
Ja, és mivel már hazaértem melóból, megvolt a vacsora, átírtam a programot, és működik!
És tényleg az volt a baja, amire gondoltam.
http://www.winbond.com/hq/enu/ProductAn ... rialFlash/
Én most a W25X32-vel próbálkozom.
Ja, és mivel már hazaértem melóból, megvolt a vacsora, átírtam a programot, és működik!
És tényleg az volt a baja, amire gondoltam.
Elégé elhanyagolt téma a SPI adatcsere.
Pedig a legegyszerűbb adatcsere 2 ATMega között.
Csak egy 3 szálas árnyékolt kábel kel hozzá. Mindent a Mester vezérel, még a különböző órajel, és tápfesz sem akadály. Slave megszakításban veszi az adatokat. Persze túl nagy távolság nem jöhet szóba.
Ui.: Programozáskor az éppen nem aktuális készüléket áramtalanítani kel, mert különben zavarják egymást!
Pedig a legegyszerűbb adatcsere 2 ATMega között.
Csak egy 3 szálas árnyékolt kábel kel hozzá. Mindent a Mester vezérel, még a különböző órajel, és tápfesz sem akadály. Slave megszakításban veszi az adatokat. Persze túl nagy távolság nem jöhet szóba.
Kód: Egész kijelölése
'SPImaster.bas
'SPI Adat csere 2 ATMega között
'HW: Master, Slave
' MOSI<----->MOSI
' MISO<----->MISO
' SCK<------->SCK
$regfile = "m128def.dat" 'VCC = 3.3V
'$crystal = 16000000
$crystal = 11059200
'$regfile = "m64def.dat"
'$crystal = 14745600
$baud = 9600 'USB
'$sim
$hwstack = 40 '
$swstack = 40 '
$framesize = 40 '
'$baud = 19200
'CONFIG SPI = HARD, INTERRUPT=ON|OFF, DATA ORDER = LSB|MSB , MASTER = YES|NO , POLARITY = HIGH|LOW , PHASE = 0|1, CLOCKRATE = 4|16|64|128 , NOSS=1|0 , SPIIN=value
'config the SPI in master mode.The clock must be a quarter of the slave cpu
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 64
'init the spi pins
Spiinit
Dim B As Byte , Bfromslave As Byte
Dim Tslave(255) As Byte , Tmaster(255) As Byte
Dim Tsadd As Byte , Tmadd As Byte
Dim Im As Byte
Print "Start Mester mode"
'Mester tömb feltöltése teszt adattal. Ezt fogjuk átküldeni a Slave eszközre.
Tmadd = 1
For Im = 1 To 255
Tmaster(im) = Im
Next Im
Tsadd = 1
Tmadd = 1
Do
Print " received from slave: "
'send 1 byte
For Im = 1 To 255
Tslave(im) = Spimove(tmaster(im)) '1 Byte csere
Print " M" ; Tmaster(im) ; " ,S" ; Tslave(im) ; " | " ; 'Master küld, Közben Slavetöl fogadott Bytes
Waitms 500
Next Im
Wait 1
Loop
End
'SPI körforgalom séma: "Tslave(is) = Spimove(tmaster(im))"
' | Master SPDR: | | Slave SPDR: |
' |<-MOSI<- 7,6,5,4,3,2,1,0 <--MISO--< 7,6,5,4,3,2,1,0 <-MOSI<-<|
' |>-------------------------->MOSI>--------------------------->|
'Mester _____ 7 _ 6 _ 5 _ 4 _ 3 _ 2 _ 1 _ 0 __________
' SCK |_| |_| |_| |_| |_| |_| |_| |_|
**********************************************************
'SPIslave.bas
'$regfile = "m128def.dat"
'$crystal = 16000000
'$crystal = 11059200
$regfile = "m64def.dat" 'VCC = 5V
$crystal = 14745600
$baud = 9600 'USB
$hwstack = 40 '
$swstack = 40 '
$framesize = 40 '
'$baud = 19200
Dim B As Byte , Rbit As Bit , Bsend As Byte
Dim Tslave(255) As Byte , Tmaster(255) As Byte
Dim Tsadd As Byte , Tmadd As Byte
Dim Im As Byte
'First configure the MISO pin
'Config Pinb.6 = Output '
'Then configure the SPI hardware SPCR register
Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = Low , Phase = 0 , Clockrate = 64
'Then init the SPI pins directly after the CONFIG SPI statement.
Spiinit
'specify the SPI interrupt
On Spi Spi_isr Nosave 'Nosave utasítással lekapcsoljuk a Bascom Megszakítás Regiszterek mentését
'enable global interrupts
Enable Interrupts
'show that we started
Print "***Start***"
'Slave tömb feltöltése teszt adattal. Ezt fogjuk átküldeni a mester eszközre.
Tsadd = 1 ' start with sending 1 the first time
For Im = 255 To 1 Step -1
Tslave(tsadd) = Im
Tsadd = Tsadd + 1
Next Im
'Első adat betöltése SPI adatregiszterbe
Tsadd = 1
Spdr = Tslave(tsadd)
Tmadd = 1
Rbit = 0
Do
If Rbit = 1 Then ' Ha jött SPI adat feldolgozza
'Mestertől kapott adat feldolgozása:
Tmaster(tmadd) = B 'Mestertől érkezett adat eltárolása
Print "Slave received : " ; Tmaster(tmadd)
Tmadd = Tmadd + 1
If Tmadd = 0 Then Tmadd = 1
Reset Rbit 'Adat feldolgozás megtörtént
'Slave adat küldés elökészitése mesternek:
Tsadd = Tsadd + 1 'increase Save adat mutató
If Tsadd = 0 Then Tsadd = 1 'Ha elment minden adat, 1-re állítja a mutatót
Spdr = Tslave(tsadd) 'Következő elküldendő adat betöltése SPI adatregiszterbe
End If
Loop
'Interrupt routine
'since we used NOSAVE, we must save and restore the registers ourself
'when this ISR is called it will send the content from SPDR to the master
'the first time this is 0
'INT ha SPI adatcsere megtörtént
Spi_isr:
push r24 ; save used register
in r24,sreg ; save sreg
push r24
B = Spdr
Set Rbit ' we received something
pop r24
!out sreg,r24 ; restore sreg
pop r24 ; and the used register
Return
'Ha ezt bővíteni akarod, vedd figyelembe, hogy a használt regiszterek értékét meg kel őrizni a visszatérésig! (PUSH-POP)
Előszőr is : "Hajlongós szmájli "kapu48 írta:Elégé elhanyagolt téma a SPI adatcsere.
Pedig a legegyszerűbb adatcsere 2 ATMega között.
Csak egy 3 szálas árnyékolt kábel kel hozzá. Mindent a Mester vezérel, még a különböző órajel, és tápfesz sem akadály. Slave megszakításban veszi az adatokat. Persze túl nagy távolság nem jöhet szóba.Ui.: Programozáskor az éppen nem aktuális készüléket áramtalanítani kel, mert különben zavarják egymást!Kód: Egész kijelölése
'SPImaster.bas 'SPI Adat csere 2 ATMega között 'HW: Master, Slave ' MOSI<----->MOSI ' MISO<----->MISO ' SCK<------->SCK $regfile = "m128def.dat" 'VCC = 3.3V '$crystal = 16000000 $crystal = 11059200 '$regfile = "m64def.dat" '$crystal = 14745600 $baud = 9600 'USB '$sim $hwstack = 40 ' $swstack = 40 ' $framesize = 40 ' '$baud = 19200 'CONFIG SPI = HARD, INTERRUPT=ON|OFF, DATA ORDER = LSB|MSB , MASTER = YES|NO , POLARITY = HIGH|LOW , PHASE = 0|1, CLOCKRATE = 4|16|64|128 , NOSS=1|0 , SPIIN=value 'config the SPI in master mode.The clock must be a quarter of the slave cpu Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 64 'init the spi pins Spiinit Dim B As Byte , Bfromslave As Byte Dim Tslave(255) As Byte , Tmaster(255) As Byte Dim Tsadd As Byte , Tmadd As Byte Dim Im As Byte Print "Start Mester mode" 'Mester tömb feltöltése teszt adattal. Ezt fogjuk átküldeni a Slave eszközre. Tmadd = 1 For Im = 1 To 255 Tmaster(im) = Im Next Im Tsadd = 1 Tmadd = 1 Do Print " received from slave: " 'send 1 byte For Im = 1 To 255 Tslave(im) = Spimove(tmaster(im)) '1 Byte csere Print " M" ; Tmaster(im) ; " ,S" ; Tslave(im) ; " | " ; 'Master küld, Közben Slavetöl fogadott Bytes Waitms 500 Next Im Wait 1 Loop End 'SPI körforgalom séma: "Tslave(is) = Spimove(tmaster(im))" ' | Master SPDR: | | Slave SPDR: | ' |<-MOSI<- 7,6,5,4,3,2,1,0 <--MISO--< 7,6,5,4,3,2,1,0 <-MOSI<-<| ' |>-------------------------->MOSI>--------------------------->| 'Mester _____ 7 _ 6 _ 5 _ 4 _ 3 _ 2 _ 1 _ 0 __________ ' SCK |_| |_| |_| |_| |_| |_| |_| |_| ********************************************************** 'SPIslave.bas '$regfile = "m128def.dat" '$crystal = 16000000 '$crystal = 11059200 $regfile = "m64def.dat" 'VCC = 5V $crystal = 14745600 $baud = 9600 'USB $hwstack = 40 ' $swstack = 40 ' $framesize = 40 ' '$baud = 19200 Dim B As Byte , Rbit As Bit , Bsend As Byte Dim Tslave(255) As Byte , Tmaster(255) As Byte Dim Tsadd As Byte , Tmadd As Byte Dim Im As Byte 'First configure the MISO pin 'Config Pinb.6 = Output ' 'Then configure the SPI hardware SPCR register Config Spi = Hard , Interrupt = On , Data Order = Msb , Master = No , Polarity = Low , Phase = 0 , Clockrate = 64 'Then init the SPI pins directly after the CONFIG SPI statement. Spiinit 'specify the SPI interrupt On Spi Spi_isr Nosave 'Nosave utasítással lekapcsoljuk a Bascom Megszakítás Regiszterek mentését 'enable global interrupts Enable Interrupts 'show that we started Print "***Start***" 'Slave tömb feltöltése teszt adattal. Ezt fogjuk átküldeni a mester eszközre. Tsadd = 1 ' start with sending 1 the first time For Im = 255 To 1 Step -1 Tslave(tsadd) = Im Tsadd = Tsadd + 1 Next Im 'Első adat betöltése SPI adatregiszterbe Tsadd = 1 Spdr = Tslave(tsadd) Tmadd = 1 Rbit = 0 Do If Rbit = 1 Then ' Ha jött SPI adat feldolgozza 'Mestertől kapott adat feldolgozása: Tmaster(tmadd) = B 'Mestertől érkezett adat eltárolása Print "Slave received : " ; Tmaster(tmadd) Tmadd = Tmadd + 1 If Tmadd = 0 Then Tmadd = 1 Reset Rbit 'Adat feldolgozás megtörtént 'Slave adat küldés elökészitése mesternek: Tsadd = Tsadd + 1 'increase Save adat mutató If Tsadd = 0 Then Tsadd = 1 'Ha elment minden adat, 1-re állítja a mutatót Spdr = Tslave(tsadd) 'Következő elküldendő adat betöltése SPI adatregiszterbe End If Loop 'Interrupt routine 'since we used NOSAVE, we must save and restore the registers ourself 'when this ISR is called it will send the content from SPDR to the master 'the first time this is 0 'INT ha SPI adatcsere megtörtént Spi_isr: push r24 ; save used register in r24,sreg ; save sreg push r24 B = Spdr Set Rbit ' we received something pop r24 !out sreg,r24 ; restore sreg pop r24 ; and the used register Return 'Ha ezt bővíteni akarod, vedd figyelembe, hogy a használt regiszterek értékét meg kel őrizni a visszatérésig! (PUSH-POP)
Másodszor: Nálam is tökéletesen megy a kommunikáció a két avr között, viszont pár észrevétel:
- Az STK 500 (itteni) zavarja az adatcserét, hibás értékek jönnek vissza.A programozó fizikia eltávolítása után, a kommunikáció feláll, tökéletes lesz.
Gondolom Robi majd hozzászól a kérdéshez.
- Nekem akkor sem megy a chip programozása, ha bármelyik AVR az isp lábakon lóg, természetesen tápmentes állapotba. Szintén le kell választani a buszról!
Kapu tanácsolta, hogy a programozó, és az AVR közé 330R-eket betenni sorba mindhárom lábra. Ezt még nem próbáltam, remélem ez kiszűri majd az eszközök közti "összeakadást"!
És még egy "hajlongós szmájli" Kapunak!
Geht nicht, Gibt's nicht!
Nem véletlenül írtam az elején, hogy ÁRNYÉKOLT kábel kel az összeköttetéshez!
Mivel a programozódhoz szalagkábel vezet az antennaként, viselkedik és összeszedi a zavaró jeleket!
Nekem ilyen gondom nincsen, mivel már régen lecseréltem ezt a szalag kábelt árnyékoltra! De van, aki a 100. szívás után sem teszi ezt meg!
Mivel a programozódhoz szalagkábel vezet az antennaként, viselkedik és összeszedi a zavaró jeleket!
Nekem ilyen gondom nincsen, mivel már régen lecseréltem ezt a szalag kábelt árnyékoltra! De van, aki a 100. szívás után sem teszi ezt meg!
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
Shiftin/Shiftout a világ legjobb dolga. Bármit meglehet oldani vele.herc1234 írta:Shiftin-el próbálkozott már valaki?
pl.
Egyik avr átküld egy bájtot a másiknak.
Én ezekhez használtam:
Sht71
Nokia kijelzők garmada
ISD17XXX
OSD IC-k
megafenetudja...
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
Shiftin-nél tudomásom szerint nincs megszakítás, csak SPI-nél.
Én egy lábra tennék chip select funkciót, ami ha 0, akkor kell beolvasni a stream-et.
Slave áramkörök is így működnek: CS aktívvá válása után vár órajelet, majd az órajel állapotánál beclockolja (vagy órajel felfutóra vagy lefutóra) az adatot (húúú ez a mondat nagyon gáz lett...)
Szerk:
Valahogy így:
Én egy lábra tennék chip select funkciót, ami ha 0, akkor kell beolvasni a stream-et.
Slave áramkörök is így működnek: CS aktívvá válása után vár órajelet, majd az órajel állapotánál beclockolja (vagy órajel felfutóra vagy lefutóra) az adatot (húúú ez a mondat nagyon gáz lett...)
Szerk:
Valahogy így:
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
Slave:
És ez volna a master:
bármit csinálok csupa 1 jön csak ....
bár ISIS szimulátorban van csak de szerintem azért ennek még menni
kéne..
Kód: Egész kijelölése
$regfile = "attiny45.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 8
$framesize = 24
Config Portb.0 = Output
Set Portb.0
Config Portb.1 = Output
Set Portb.1
Dim W as Word
do
W = 2222
Reset Portb.1
Shiftout Portb.1 , Portb.0 , W , 0 , 12
Wait 1
loop
Kód: Egész kijelölése
$regfile = "m8def.dat"
$crystal = 8000000
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.3 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portb.6 , Rs = Portb.7
Config Lcd = 16 * 2
Config Pinb.5 = Input
Config Pind.2 = Input
Initlcd
Lcd "touch parameterek"
Dim W As Word
Do
Set Portb.4
Waitms 500
Reset Portb.4
If Portb.5 = 0 Then
Shiftin Pinb.5 , Portd.2 , W , 0 , 12
If W > 0 Then
Locate 2 , 1
Lcd W
End If
End If
Loop
bár ISIS szimulátorban van csak de szerintem azért ennek még menni
kéne..
- nobody_hun
- Bitfaragó
- Hozzászólások: 425
- Csatlakozott: 2005. november 14. hétfő, 7:00
Slave-hez:
Shiftout után Set Portb.1, majd utána wait.
Master-hez:
If Portb.5 = 0 Then
helyett
If Pinb.5=0 Then, mivel bemenet.
Shiftin-ben is a Portd.2 helyett megpróbálkoznék a Pind.2-vel az órajelnél.
Esetleg a Pinb.5 helyett az INT0-t felhasználni és megszakításban beolvasni?
Plusz a ki-bemeneteket a DDRX regiszter beállításával is megtámogatnám.
Shiftout után Set Portb.1, majd utána wait.
Master-hez:
If Portb.5 = 0 Then
helyett
If Pinb.5=0 Then, mivel bemenet.
Shiftin-ben is a Portd.2 helyett megpróbálkoznék a Pind.2-vel az órajelnél.
Esetleg a Pinb.5 helyett az INT0-t felhasználni és megszakításban beolvasni?
Plusz a ki-bemeneteket a DDRX regiszter beállításával is megtámogatnám.
"Az IC-k füsttel működnek. Ha kijön belőlük a füst, nem működnek tovább." - ismeretlen szerző
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."
"Az ID:FFFFFF egyenlő az Atmel még nem kiadott processzorával."