SPI kanssa 8051 ja 93C46

Hei,
Mielestäni koodisi olisi työ, etunollat ovat hyväksyttävissä, siru, niin kauan kuin DI ei ole korkea.Käytä vetää jopa MISO koska DO menee tristate ajoittain.

1.Voit tarkistaa laite 93C46 eikä 93C46A,
molemmat ovat hieman eri toiminnassa.

2.Jos sinulla on laitteisto SPI, voit lähettää ja vastaanottaa samanaikaisesti 8bits.Kun kirjoitat haluamasi tavu tai harjoitustestien byte aina etsiä SPIF ollakseen totta, selkeä SPIF lukemaan SPIDAT jos vain tarvita.

3.Voit tarkistaa valmis tila jälkeen byte kirjoittaa lähettämällä nolla byte ja etsivät nonzero saanut byte.Reading MISO ei välttämättä toimi, koska nastat ovat määritetty SPI.

4.Voit asettaa MISO ainoastaan kerran alussa tarvittaessa useimmiten jopa, että ei vaadita, koska configuring kuin SPI päällikkö tekee kaikki SPI bittiä niiden vaaditaan valtiolle.Ei tarvitse määritellä mitään tuotos bittinen vuonna 8051.

5.Tarkista koodisi huolellisesti.

Terveisin,
Laktronics

 
Hei
Satun
ks. hakemuksen merkinnän osalta 93C46 ja todennut, että se on 3 lanka sarjaliitäntä mikä tarkoittaa sitä, DI ja DO olisi kytketty together.Which merkitsee myös sitä, MOSI on toimittava lähtö, kun kirjallisesti ja syöttää kun reading.I ovat muuttaneet koodi sopii tämän edellytyksen.
täällä se menee (olen antanut vain lukea osa)
unsigned char RD_BYTE (char EE_address)
(

unsigned char data1;

SS = 0;
SS = 1;SPI_TX_CHAR (0x03); / / Käynnistä-bittinen on bittinen 1 / / bit 7 on 0 - voi

SPI_TX_CHAR (EE_address);

data1 = SPI_SlaveReceive ();

SS = 0;

palata data1;
)

unsigned char SPI_SlaveReceive (void)
(
SPI_TX_CHAR (0x00);

/ * Odota vastaanotto täydellinen * /
while (! (SPSR & (1 <<SPSR | 0x80)));
/ * Return tiedot rekisteriin * /
MOSI = 1;
while (! (SPSR & (1 <<SPSR | 0x80)));
palata SPDAT;
)
Main Aion lähettävän data1.

Btwn kanisteri u ehdoteta mitään 4 lanka sarjapäätettä EEPROM.I usko AT25080A/160A tai Microchip 25LC080/160 on hyvä option.Please saanen luovuttamaan joitakin kohtia teille, koska olette todella menojen aika me.Thank sinua.

 
Hei,
Toistaiseksi olit menossa oikeaan suuntaan, mutta nyt olet poikkeavat sen.93C46 on aina neljän lanka EEPROM ja se tehdään kolme lanka (joka pelastaa nastainen), jonka shorting Do ja Di nastat,
käytät vastus on Do tiellä.Mutta ei ole mitään vikaa, koska laitteisto SPI käytetään aina neljä lanka.Ainakin Microchip vahvistaa, että johtava nollia, että komento on laiminlyöty, ja toivon, että se on sama kuin muiden tekee myös.Olen siksi sitä mieltä, että jos kirjoitat oikean päällikön SPI ohjelma sen pitäisi toimia.Tarkastamisessa valmis asema, voit lähettää 0x0FF (ei Zero kuin kirjoitin eilen) ja tarkista saanut tavu on nonzero arvo
sen sijaan, että käsittelyssä MISO suoraan.Olen varma, että se pitäisi toimia hyvin.

Terveisin,
Laktronics

 
Jos haluan käyttää sitä kuin 4 lanka i shud liittää org on Vcc.then siitä tulee 16-bittinen architecture.Please viitata siihen tekninen olen liittämässä jossa käyttöliittymä yksityiskohdat on selvitetty hyvin.
Anteeksi, mutta sinun on kirjautumistunnuksen nähdäksesi tämän liitäntävaatimuksia

 
merkki 93C46 on Atmel eikä mikrosiru joka on hieman different.in Atmel tehdä sitä voidaan käyttää 3 lanka muuten olemme konfiguroida kuin 16-bittinen, joka lisää tuskamme only.Moreover Olen yrittänyt kaikkea, mutta i cant laatia miksi se ei toimi ..
tässä on minun päivitetty koodi:
unsigned char SPI_SlaveReceive (void)
(

/ * Odota vastaanotto täydellinen * /
while (! (SPSR & (1 <<SPSR | 0x80)));

/ * Return tiedot rekisteriin * /palata SPDAT;
)
mitätön RD_BYTE (char EE_address)
(SS = 0;
SS = 1;

SPI_TX_CHAR (0x03); / / Käynnistä-bittinen on bittinen 1 / / bit 7 on 0 - voi

SPI_TX_CHAR (EE_address);SPI_TX_CHAR (0xFF);
P1 = P1 | 0x20;
data2 = SPI_SlaveReceive ();
P1 = (1 <<P1_7) | (1 <<P1_5) | (1 <<P1_4);

SS = 0;

DELAY (20);

)

Jos yritän tyhjentää SPIF lipun tai poll aseman varattu lippu ohjelma on juutu there.Moreover tein kirjallisesti ja käsittelyssä kahden 89v51rd2 ilman tyhjentämällä SPIF lippu ja se toimii täysin fine.So i ei poista SPIF flag.If on joitakin muutoksia koodi kerro minulle know.This työ on todella ylittää sen aikaa ja i cant arvailla miksi, mutta olen todellakin harkita ymmärtää SPI ja joka on sen harmaa puolella.

 
Hi Vikky,
Minulla on vain kokemusta Atmel 93C46 ja ne toimivat 8 bittisessä tilassa kanssa org nastainen maadoitettuja.Olen ohjelmoija, joka tukee näitä divices 8 bittisessä tilassa.En ole kokeillut etunollat koska rajapinta EEPROMs vuonna ohjelmoijan on portti bittinen perustuu, ja se käyttää neljä nastainen tilassa.Aion yrittää muuttaa ohjelmistoa myös etunollat on Atmel siru ja antaa sinulle palautetta.Hyväksyttävyys etunollat mainitaan Microchip käyttöturvallisuustiedote, ja se kuulostaa loogista koska suuri aloittaa bittinen tarvitaan kaikki komennot.Lisäksi uskon, että kaikki pelimerkit saman osa numero on sama arkkitehtuuri ja sen vuoksi olisi sovellettava Atmel liikaa, yritän testata sitä nyt.Kaikki 93C46 Ics sikäli kuin tiedän on org nastainen.

Samaan aikaan,
kerro minulle, mikä C Compiler käytät.

Terveisin,
Laktronics

 
Hi laktronics,
Olen samaa mieltä, että org maadoitettuja ne toimivat 8 bitin mode.but DI ja DO olisi kytketty together.Please läpi hakemuksen merkinnän, joka minulla on kiinnitettävä aiempaa post.SO mitä tein oli MOSI syöttää jälkeen kirjallisesti osoite luetut mode.after käsittelyssä tiedot DI nastainen i uudelleen konfiguroida MOSI kuin output.Should i muuttaa mitään edelleen lukea mode.I saan undefined tietojen minun O / P.Any muutos piiri tarvitaan?
The kääntäjään Olen käyttäen on SDCC C-kääntäjän.

 
Hi Vikky,
Omasta Sovellushaku.HuomautusQuote:The org (sisäinen Organization) nastainen valitsee 8 bittinen tietojen kun maadoitettuja ja 16-bittinen tietoja, kun kelluvat tai sidottu Vcc .... 8bit tai 16-bittinen tiedot voidaan valita joko 3-wire-tai 4-wire-kokoonpano

 
Thanks a ton ... se oli hyvä uutinen ... id
didnt huomata, että statement.Now Olen ottanut palvelet ohjeet ja muutettu minun koodi 4 lanka ... Katso, onko mitään wrong.Regarding SPIF i cant auttaa sitä, koska jos käytän SPIF suoraan ja jotkut virhe näkyy minun kääntäjän niin aion tässä usage.So takaisin 4 johtimet ja tarkista minun muunnettu koodi 4 lanka.
#
include <p89v51rd2.h>
#
include <delay.h>

#
include <uart.h>

#
define MOSI P1_5
#
define MISO P1_6
#
define SCK P1_7
#
define SS P1_4

unsigned char DAT, d, data2;mitätön SPI_MasterInit (void)
(
/ * Aseta MOSI ja SCK ja SS (-) tuotokseksi, kaikki muut panos * /
P1 = (1 <<P1_7) | (1 <<P1_5) | (1 <<P1_4);
/ * Ota SPI, Master,
aseta kello korko fck/128 * /
Spcr = 0x52;

)
unsigned char SPI_TX_CHAR (unsigned char d)
(

SPDAT = d;

while (! (SPSR & (1 <<SPSR | 0x80)));palata SPDAT; / / Return tiedot rekisteriin

) / / Olen käyttäen tämä on commen toiminnon kaikki operaatiotmitätön ERASE ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x03);
SPI_TX_CHAR (0xFF);

SS = 0;
/ / Vedetty vähän välillä Viimeisin DI bittinen
SS = 1;
SS = 0;
DELAY (20);
)
mitätön EWDS ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x02);
SPI_TX_CHAR (0x00);
SS = 0;

)

mitätön Ewen ()
(
SS = 0;
SS = 1;
/ / Varmista, CS on korkea
/ / Käynnistä-bit on bit1,
SPI_TX_CHAR (0x02);
/ / 00 on opcode varten Ewen
SPI_TX_CHAR (0x60); / / 0110 (6) tarvitaan
/ / Ewen 0's eivät välitä
SS = 0; / / 5 lsb osoite bittiä
DELAY (20); / / Tuo siru valitse linja alhainen alkaa
/ / EEPROM sisäinen kirjoittaa sykli
) / / On odotettava 5 ms sisäisen kierron loppuunmitätön WR_BYTE (char EE_address, char EE_data)
(
SS = 0;
SS = 1;
Ewen ();
SS = 0;
SS = 1;
/ / Aseta pelimerkki Sele / / ct korkea
SPI_TX_CHAR (0x02); / /
käynnistys bittinen on bittinen 1,
/ / Note: 01 on op-koodi kirjoittaa, koska kaikki on oikein perusteltu
/ / 1 kuuluu toinen tavu on vasemmalla kanta (bit 7).
/ / The EE_address on ORed kanssa b'1000 0000 ".

SPI_TX_CHAR (EE_address);

/ / Osoite sijainti
SPI_TX_CHAR (EE_data);
SS = 0;
SS = 1;
/ / On asetettava pelimerkin valitse alhainen aloittaa
DELAY (20); / / sisäinen ohjelmakauden aikana.
)mitätön RD_BYTE (char EE_address)
(SS = 0;
SS = 1; / / Aseta pelimerkki valitse korkea
SPI_TX_CHAR (0x03); / / Käynnistä-bittinen on bittinen 1 / / bit 7 on 0 - voi

SPI_TX_CHAR (EE_address);
data2 = SPI_TX_CHAR (0xFF); / / Tässä olen lähettämällä harjoitustestien tiedot ja odottaa tietoja EEPROM josta olen tallentaminen data2 ja näyttämään vuonna HyperTerminal.
TX_CHAR (data2);

SS = 0;
DELAY (20);
/ /
return data1;
)

mitätön tärkeimmät ()
(
/ / unsigned char data2;
SS = 0;
UART_INIT (9600,0);

SPI_MasterInit ();
ERASE ();
kun taas (1)
(

WR_BYTE (0x8C, 'B');

DELAY (20);
RD_BYTE (0x0C);

TX_CHAR (data2);

)

)

Saan!minun HyperTerminal ... mitään korjausta tämän koodin?Lisätty jälkeen 4 tuntia 12 minuuttia:Hi Laktronics,
Atlast voin lukea jotain pois EEPROM.Now uusi ongelma on, on muutos.
esimerkiksi silloin, kun yritän lukea K saan%. kun yritän 2 lukea V saan . ja H i get $. Jos yritän verrata sitä ascii arkin löysin sen kaksi merkkiä ovat samassa ascii luonteen ja lisäys on proportional.for eg.j ja k ovat ssharing%. L, M jakavat &. N, O-jakamista. "miten päästä eroon tästä uudesta ongelma ... mitään ulospääsyä?Lisätty jälkeen 1 tunnin 33 minuuttia:Hi Laktronics,
on kiinnostava havainto .... Viimeinen bittinen ei päästä sisälle.
esim.Kirjeet K saatuihin tietoihin on 01001100, mutta Saan 00100101
Kirjeet L saatuihin tietoihin on 01001100, mutta Saan 00100110
Kirjeet N saatuihin tietoihin on 01001110, mutta Saan 00.100.111.
että lsb ei täysin päästä sisälle.Lisätty jälkeen 55 minuuttia:Mielestäni harjoitustestien bittinen (looginen 0) edeltävän 8 bittinen merkkijono luetut tila on luoda ongelma, koska löydät ylimääräinen nolla on MSB, joka ei ole needed.Now kysymys on, kuinka voidaan välttää tämän nolla ... . olen antamalla koodin alla.

#
include <p89v51rd2.h>
#
include <delay.h>

#
include <uart.h>

#
define MOSI P1_5
#
define MISO P1_6
#
define SCK P1_7
#
define SS P1_4

unsigned char DAT, d, data2;mitätön SPI_MasterInit (void)
(
/ * Aseta MOSI ja SCK ja SS (-) tuotokseksi, kaikki muut panos * /
P1 = (1 <<P1_7) | (1 <<P1_5) | (1 <<P1_4);
/ * Ota SPI, Master,
aseta kello korko fck/128 * /
Spcr = 0x50;

)
unsigned char SPI_TX_CHAR (unsigned char d)
(

SPDAT = d;
while (! (SPSR & (1 <<SPSR | 0x80)));

SPSR = SPSR & 0x7F;

/ / Return tiedot rekisteriin
palata SPDAT;

)

mitätön ERASE ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x03);
SPI_TX_CHAR (0xFF);

SS = 0;
/ / Vedetty vähän välillä Viimeisin DI bittinen
SS = 1;
while (MISO == 0);
/ / TX_CHAR ( "U");
SS = 0;
)
mitätön EWDS ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x02);
SPI_TX_CHAR (0x00);
SS = 0;

)

mitätön Ewen ()
(
SS = 0;
SS = 1;
/ / Varmista, CS on korkea
/ / Käynnistä-bit on bit1,
SPI_TX_CHAR (0x02);
/ / 00 on opcode varten Ewen
SPI_TX_CHAR (0x60); / / 0110 (6) tarvitaan
/ / Ewen 0's eivät välitä
SS = 0; / / 5 lsb osoite bittiä
DELAY (20); / / Tuo siru valitse linja alhainen alkaa
/ / EEPROM sisäinen kirjoittaa sykli
) / / On odotettava 5 ms sisäisen kierron loppuunmitätön WR_BYTE (char EE_address, char EE_data)
(
SS = 0;
SS = 1;
Ewen ();
SS = 0;
SS = 1;
/ / Aseta pelimerkki Sele / / ct korkea
SPI_TX_CHAR (0x02); / /
käynnistys bittinen on bittinen 1,
/ / Note: 01 on op-koodi kirjoittaa, koska kaikki on oikein perusteltu
/ / 1 kuuluu toinen tavu on vasemmalla kanta (bit 7).
/ / The EE_address on ORed kanssa b'1000 0000 ".

SPI_TX_CHAR (EE_address);

/ / Osoite sijainti
SPI_TX_CHAR (EE_data);
SS = 0;
SS = 1;
while (MISO == 0);
/ / TX_CHAR ( "S"); / / Data
SS = 0;
/ / TX_CHAR ( "B"); / / on asetettava pelimerkin valitse alhainen aloittaa
DELAY (20); / / sisäinen ohjelmakauden aikana.
)unsigned char RD_BYTE (char EE_address)
(

unsigned char data1;

SS = 0;
SS = 1; / / Aseta pelimerkki valitse korkea
SPI_TX_CHAR (0x03); / / Käynnistä-bittinen on bittinen 1 / / bit 7 on 0 - voi

SPI_TX_CHAR (EE_address);
data1 = SPI_TX_CHAR (0x00);

SS = 0;

palata data1;
)

mitätön tärkeimmät ()
(
P1_6 = 1;
unsigned char data2;
SS = 0;
UART_INIT (9600,0);

SPI_MasterInit ();
ERASE ();kun taas (1)
(WR_BYTE (0xEF, 'K');data2 = RD_BYTE (0x6F);

TX_CHAR (data2);))Lisätty jälkeen 27 minuuttia:Hi laktronics,
Olen löytänyt solution.but se ei koske kaikkia cases.I olen tekemässä vasemmalle muutos siten, että 0 maat esille viime bit ja olen saada oikeus tuotos, mutta tämä on mahdollista vain jopa cases.if saada pariton määrä, joka on 1: n viime bittinen tämä ei ole mahdollista, ja minulla on ongelma me.anything tulossa mieltäsi?

 
Hi Vikky,
Hyvää työtä Vikky,
en ole tulossa takaisin, koska en voinut saada valmis ratkaisu ongelman ja olen varma, että se olisi auttanut sinua oppimaan asioita itse.

Nyt palaan ongelman, näyttää siltä, että järjestelmä on poimien johtava Zero edeltävän tietojen tavu.Jos tarkastellaan ajoituksen kaavio sivulla 44 suoritintehon käsikirja, voit nähdä, että SPI Mode 0 odottaa MISO panos on valmis, kun kello menee myönteinen, kun EEPROM siirtyy pois tietojen jälkeen pian saaduista myönteisistä reunan pulssi.Joten lähettämisen jälkeen luetut komentoa spcr = 0x52, voit muuttaa spcr = 0x56 (SPI Mode1) ennen käsittelyssä tietojen byte alkaen EEPROM.Näin varmistetaan, että Master strobs koskevat tiedot, jotka kuuluvat reuna kellon ja sitten EEPROM tulostaa tiedot MISO, joita aiheuttaa positiivisen reuna vuorokauden.

As far as I can see , reloading the SPCR should not affect anything else.

After reading the byte, in the same function set SPCR back to 0x52 before leaving the function.

I hope it should solve your problem. Terveisin,Laktronics
 

Welcome to EDABoard.com

Sponsor

Back
Top