SPI busz

Hogyan programozzak AVR chipet? Programozók beállításai...
Bascom nyelvű programok...
Válasz küldése
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

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!
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

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

Ugye az előbb leírtak az EEPROM-ra és nem a FLASHRAM-ra vonatkoznak?

Az SD-s dologról meg éppen elég eltántorító buktatót olvastam már, hogy messzire elkerüljem! :) A tiszta, egyértelmű dolgokat szeretem. Olvasgattam az idevonatkozó topikot, meg nézelődtem a neten. Nekem annyi elég volt belőle. :?
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 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 :twisted: .

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..
Avatar
dummy
Chipgyilok
Hozzászólások: 264
Csatlakozott: 2008. május 24. szombat, 6:00

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

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! :D
És tényleg az volt a baja, amire gondoltam.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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.

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)
Ui.: Programozáskor az éppen nem aktuális készüléket áramtalanítani kel, mert különben zavarják egymást! 8)
Avatar
evildodo
Pákabűvész
Hozzászólások: 213
Csatlakozott: 2009. február 4. szerda, 7:00

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

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.

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)
Ui.: Programozáskor az éppen nem aktuális készüléket áramtalanítani kel, mert különben zavarják egymást! 8)
Előszőr is : "Hajlongós szmájli :)"
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!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

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!
:wink: :)
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

Shiftin-el próbálkozott már valaki?
pl.
Egyik avr átküld egy bájtot a másiknak.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10191
Csatlakozott: 2005. december 9. péntek, 7:00

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

Nálam AD konverter küldte és nem veszett el...
:)
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

De mégis hogyan?
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

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

herc1234 írta:Shiftin-el próbálkozott már valaki?
pl.
Egyik avr átküld egy bájtot a másiknak.
Shiftin/Shiftout a világ legjobb dolga. Bármit meglehet oldani vele.
É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."
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

Hát ez remek!
A kérdés konkrétan a következő volna:
Hogy a fenébe kell a shiftin-el elkapni?
Próbáltam már interruptba tenni de akkor sem sikerült.
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

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

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:
Kép
"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."
Avatar
herc1234
Bitfaragó
Hozzászólások: 459
Csatlakozott: 2007. február 9. péntek, 7:00

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

Slave:

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
És ez volna a master:

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á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..
Avatar
nobody_hun
Bitfaragó
Hozzászólások: 425
Csatlakozott: 2005. november 14. hétfő, 7:00

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

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.
"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."
Válasz küldése