SPI s 8051 a 93C46

V

vikk

Guest
môže mi niekto pomôcť 2 program pre prepojenie 93C46 s 8051 pomocou SPI protocol.Thank vám.

 
u ktorých je uvedené
didnt 8051 založená řadič ur pomocou
budete musieť hľadať založené 8051 radič, ktorý má vstavaný SPI jednotky.
AVR radiče
tj (ATmega16
atď ..) majú zabudovaný SPI jednotky, takže si môžete rozhrania SPI EEPROM ak program je znepokojený, že budete musieť nastaviť niekoľko SPI registre, ktoré umožnia komunikáciu SPI

Ak používate 8051, aby
doesnt mať SPI jednotky budete musieť pracovať extra ťažké.
U prvého bude musieť naučiť SPI protokol a jeho načasovanie grafmi potom napísať program realizovať SPI protokol

Takže je lepšie použiť vstavaný SPI radič s jednotkou

 
Nazdar,
Vikk po čítanie údajov listu 93C46, prosím prísť s malým 8051 assembler program vlastné, takže ostatné môžu byť schopní vám pomôcť, len vyskúšať, môžete tak urobiť.

Pozdravy,
Laktronics

 
vďaka sjerr4u a laktronics pre replying.I používám 89V51rd2 ktorý má vstavaný SPI v it.I want 2 do hlavnej zápis a čítanie z EEPROM majster a odoslať ju 2 lcd.can u sprievodca mi 2 napísať pre tento program.

 
Snažil som sa z kódu na zobrazenie na hyperterminal.but som dostať popelnici value.i dám moje rutina pre čítanie a write.Please sprievodca mi, ako postupovať.

void WR_BYTE (char EE_address, char EE_data)
(
SS = 1, / / čipovej sady vyberte vysokej
SPI_TX_CHAR (0x01); / / start bit je bit 1,
/ / Poznámka: 01 je op-kód napísať, pretože všetko, čo je správne odôvodnených
/ / 1 patrí do druhého byte v nejlevější pozíciu (bit 7).
/ /
The EE_address musia byť ORed s b'1000 0000 '.
EE_address | = 0x80;
SPI_TX_CHAR (EE_address);

/ / Adresa umiestnenia
SPI_TX_CHAR (EE_data);
SS = 0, / / Data
/ / Musí obsahovať čip vyberte nízke začať
/ / Interný programovací cyklus.
)void RD_BYTE (char EE_address)
(
SS = 1, / / čipovej sady vyberte vysokej
SPI_TX_CHAR (0x01);

/ / Start bit je bit 1
EE_address = EE_address & 0xFD, / / bit 7, musí byť 0 - môžeSPI_TX_CHAR (EE_address);
/ / Zmena času polarity na 0
/ / V byte
/ / Tu odovzdávajú je to jedno.
SPCR = SPCR & 0xFB; / / Prineste čip vyberte nízke ukončiť
SS = 0, / / s pre čítanie príkazom
SPCR = SPCR | 0x08; / / Návrat do 1 hodiny polarity

)

 
Nazdar,
Je to viac ako to, čo máte urobiť.Po prvé, nemyslím si, že štandardný SPI je možné použiť pre túto aplikáciu, pretože príkazy, ktoré majú byť uvedené nie sú byte orientované.Myslím si, že musím urobiť bit úroveň SPI.

Ak chcete napísať byte:

1.Povoľte čip vyberte
2.Vydať 10 bitové napiš umožniť príkazom (Ewen).
3.Zakázať čip vyberte Povoli ju znova.
4.Vydanie 10 bit napiš príkaz vrátane 7 bitovú adresu.
5.Vydanie 8 bitov dát bitové s 8 hodín.
6.Zakázať čipu a vyberte Povoli znova.
7.Čakať na zápis alebo omeškania skontrolovať readybusy bit a počkajte, až pripravený
8.Zakázať čipu a vyberte Povoli znova.
9.Výtlačok Zakázať Programovanie velenie (EWDS) ak nie je viac písania reqired.
9.Zakázať Chipselect.

Ak chcete čítať byte:

1.Povoľte Chip vybrať.
2.Vydanie 10 bit Prečítajte si návod, vrátane adresy.
3.Prečítajte 8bit data jeden bit v čase od 8 krát stopovanie.
4.Zakázať chipselect.

Poznámky:
1.Všetky príkazy a dátové bity danom / čítaj s MSB prvý.
2.Stúpajúce hranou hodín strobes in /
out všetky bity.
3.Údaje línia by mala byť odtiahnutý vysoká.
4.ORG pin by byť založené na 93C46 bajtov orientované.

Vyzerá to ťažké, ale to dá urobiť.

Pozdravy,
Laktronics

 
pretože já jsem s použitím 89v51rd2 ktorý má vstavaný SPI v ňom Myslel som, môže ho poslať v byte level.moreover je výhradným SPDAT zaregistrovať pre zasielanie data.please správny mě, jestli jsem špatně.

 
Nazdar,
Môžete si rozhodne poslať byte úrovni a len na úrovni byte Předpokládám?Ale musíte poslať 10 bit 7 bit velenia vrátane adresy, ktoré používajú len 10 hodín, ako to urobiť pomocou byte úrovni hardvéru je moja otázka.

Pozdravy,
Laktronics.

 
Snažil som sa teraz medzi dvoma 89v51rd2 výrobu jednej ako master a ostatné ako slave.i zistilo, že údaje nie sú dostať dovnútra SPDAT.i dali nižšie uvedený kód
je to pre pána
#
Include <p89v51rd2.h>
#
Include <uart.h>unsigned char d;

void SPI_TX_CHAR (unsigned char d)
(

d = SPDAT;
OMEŠKANIA (10);

)

void SPI_INITMASTER ()
(

SPCR = 0x40;
)

void main ()
(
SPI_INITMASTER ();

UART_INIT (9600,0);

SPI_TX_CHAR ( 'A');
while (1)
(
)

)
A to je pre SLAVE
#
Include <p89v51rd2.h>

#
Include <uart.h>

#
Define mosi P1_5
#
Define SS P1_4

unsigned char d;

void SPI_INIT_SLAVE ()
(
SS = 0;
SPCR = 0x40;
)void main ()
(
SPI_INIT_SLAVE ();

UART_INIT (9600,0);if (SPSR == 0x80)

(
TX_CHAR (SPDAT);
)
while (1)
(
)
)
keď nie je dostať dovnútra SPDAT Ako možno očakávať, že 2 dosiahnutie slave.i taktiež pripojí na list 89v51rd2 pre váš odkaz.
Ospravedlňujeme sa, ale musíte prihlásiť a prezerať túto prílohu

 
Bol som schopný písať na kapitána, ale já nebol schopný urobiť slave displej it.any návrhy?

 
Nazdar,
Prepojenie SPI Master a Slave jednotky sa vykonáva takto:

1.Prepojiť tieto signály Master a slave

Mosi to mosi
Miso miso a to
SCK na SCK
Pripojte SS-Majstra na VDD a
SS-Slave to z Vss.

2.Založte SPCR Majstra s 52h (SCK = fosc/64) a
SPCR zo Slave až 42; SCK by mali byť rovnaké pre obidva.

3.Založte SPIDATA Majstra s byte, ktoré majú byť zaslané, je triggers SPI zasielať automaticky.Počkajte na SPIF, ktoré majú byť stanovené v majstrovských zistiť pri prenose dát je u konca.Clear SPIF a môžete nahrať ďalší byte.

4.Pozrite sa na slave pre SPIF, ktoré majú byť stanovené a potom si prečítajte SPIDATA a vyčistiť SPIF bit.

5.Váš otrok by mal byť pripravený na príjem dát pred veliteľa začína jeho odoslanie, alebo stratíte v byte.

6.Máte zvrátiť údajov úlohy v TX bežné, aby SPIDATA = d na zaťaženie SPI
reg s dátami 'd'

Mali by ste byť schopní postarať sa o všetky aspekty a kódovanie správnosti jazyka, nebudem schopný pomôcť vám v tomto ohľade.

Pozdravy,
LaktronicsPridané po 30 minútach:Nazdar,
Tiež v SPI, iba majster môžete prenášať dáta, takže ak sa chcete slučku späť údajov, Master má robiť druhú figuríny TX a čítať dáta, alebo ste pre zmenu Master / Slave rolí zariadenia , ale synchronizácia môže byť problém.Klíring SPIF medzi veľmi dôležité.Koniec koncov, SPI je nič, ale chrbtom k sebe pripojené dva posuvné registre, pohyblivý úplne kormidlujú Master.

Pozdravy,
Laktronics

 
vďaka za vaše reply.the hodnotu sa dostane dovnútra, kým slučky s otrokmi, ale nedefinovaného data sa stále displayed.i am odoslania mojej aktualizovaný kód pre váš odkaz.
pre veliteľa

#
Include <p89v51rd2.h>
#
Include <uart.h>
#
Define mosi P1_5
unsigned char d;

void SPI_TX_CHAR (unsigned char d)
(

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

void SPI_INITMASTER ();
(
SPCR = 0x52;
)
void main ()
(
SS = 1;
UART_INIT (9600,0);
SPI_INITMASTER ();while (1)
(
if (P3_2 == 0)
SPI_TX_CHAR ( 'A');
)

)

PRE SLAVE

#
Include <p89v51rd2.h>

#
Include <uart.h>
#
Include <lcd.h>
#
Include <delay.h>
#
Define mosi P1_5
#
Define SS P1_4
#
Define miso P1_6

unsigned char RXED;

void SPI_INIT_SLAVE ()
(
SS = 0;
SPCR = 0x42;
)

unsigned char SPI_SlaveReceive (void)
(

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

návrat SPDAT;
)
void main ()
(
SS = 0;
SPI_INIT_SLAVE ();
Miso = 0;

UART_INIT (9600,0);while (1)

(
RXED = SPI_SlaveReceive ();
TX_CHAR (RXED);
)

)
Mám aj vzhľadom na okruhu pripojenie v pravom spôsobom.

 
Dobrou správou atlast.was schopná 2 komunikovať medzi dvoma devices.now späť EEPROM program ...
[/ Quote] si môžete definitívne poslať byte, a len na úrovni byte Předpokládám?Ale musíte poslať 10 bit 7 bit velenia vrátane adresy, ktoré používajú len 10 hodín, ako to urobiť pomocou byte úrovni hardvéru je moja otázka.

môže u daj mi 4 akékoľvek riešenie tohto problému?

 
Nazdar,
Je dobré vedieť, že ste schopní komunikovať medzi dvoma milióntin.Mám pocit, pre prepojenie s EEPROM, je lepšie používať bit úroveň SPI pomocou portu bitov, pretože vyžaduje non-byte úrovni SPI.Môže byť môžete balenia bitov zo susedných bytov a zahŕňajú niektoré figuríny bitov, aby bol na úrovni byte a využitie hardvéru SPI, ale myslím,
že to bude neohrabana zvládnuť a ďalšie drobnosti, figuríny mohla dať nejaký problém tiež ,..... I nevím.

Áno,
odporúčame Vám používať bit úroveň SPI pomocou rovnakého SPI bitov ako všeobecné účely bitov.
Môžete odkazovať na SPI odosielať / prijímať bežné pod odkazom:
ftopic305246.html.Môže byť, mali by ste poďakovali Tesion a dať mu 7 bodov za svoj príspevok k fóru a používať bežné vo svojej žiadosti.Tu môžete selektívne ovládať počet bitov, ktoré majú byť odoslané a ľahko prispôsobiť sa vašej žiadosti.

Majte na pamäti, že nemusíte posielať mi body za každú z mojej odpovede.

Pozdravy,
Laktronics

 
aj keď má vstavaný SPI v mojom řadič a keď som sa zaregistrovať, aby moje drobnosti, ktoré sa stará o čas som si myslel, že by sa easier.now problém je aj mať 9 bitov prepravovať vrátane mojej opcodes a addressing.any návrhy? i tiež pripája dátový zo eeprom.tension 's program ... Obávam sa, som sa pozrieť zajtra.
Ospravedlňujeme sa, ale musíte prihlásiť a prezerať túto prílohu

 
Nazdar,
Jo, vyzerá to divne na mě taky, ale nemám lepší návrh v tejto dobe.Taktiež upozorňujeme, že v EEPROM velenie potrebuje vysoko start bit nasledujú dve bit opcode a 7 bitovou adresu, čo je 10-bitový príkaz celkom.

Pozdravy,
Laktronics

 
Ďalším dobrým novinky .. teraz som schopný písať a čítať z veliteľa a zobrazenie medzi dvoma microcontrollres.but EEPROM nie je ešte working.There je prázdny displayed.This údajov je môj zaktualizovaný kód ... nejaké návrhy?

#
Include <p89v51rd2.h>
#
Include <delay.h>
#
Include <SPI.h>
#
Include <uart.h>

#
Define mosi P1_5
#
Define miso P1_6
#
Define SCK P1_7
#
Define SS P1_4

unsigned char DÁT, d, data 1;void SPI_MasterInit (void)
(
/ * Nastaviť mosi a SCK a SS (-) ako výstup, všetky ostatné vstupy * /
P1 = (1 <<P1_7) | (1 <<P1_5) | (1 <<P1_4);
/ * Povoli SPI, Master, nastaviť hodinovej sadzby fck/128 * /
SPCR = 0x52;

)
unsigned char SPI_TX_CHAR (unsigned char d)
(
unsigned char data 1;
SPDAT = d;
while (! (SPSR & (1 <<SPSR | 0x80)));
/ / Návrat údajov registra
data 1 = SPDAT;
návrat data 1;

)

void ERASE ()
(
SS = 0;
SPI_TX_CHAR (0x03);
SPI_TX_CHAR (0xFF);

SS = 1;
)
unsigned char SPI_SlaveReceive (void)
(
/ * Počkajte na recepcii úplné * /
while (! (SPSR & (1 <<SPSR | 0x80)));
/ * Späť údajov registra * /
návrat SPDAT;
)
void Ewen ()
(

SS = 1;
/ / Uistite sa, že SK je vysoko
/ / Start bit je bit1,
data 1 = SPI_TX_CHAR (0x02);
/ / 00 je pre opcode Ewen
data 1 = SPI_TX_CHAR (0x60) / / 0110 (6) potrebné na
/ / 0 Ewen sú nie je to zaujíma
SS = 0, / / pre 5 bitov adresy lsb
/ / Prineste čip vyberte riadok nízke začať
/ / Interný EEPROM písať cyklus
) / / Musí počkať 5 ms pre vnútorný cyklus na dokončenievoid WR_BYTE (char EE_address, char EE_data)
(
SS = 1, / / čipovej sady vyberte vysokej
data 1 = SPI_TX_CHAR (0x02); / / start bit je bit 1,
/ / Poznámka: 01 je op-kód napísať, pretože všetko, čo je správne odôvodnených
/ / 1 patrí do druhého byte v nejlevější pozíciu (bit 7).
/ /
The EE_address musia byť ORed s b'1000 0000 '.

data 1 = SPI_TX_CHAR (EE_address);

/ / Adresa umiestnenia
data 1 = SPI_TX_CHAR (EE_data);

/ / Data
SS = 0, / / Musí byť nastavená čip vyberte nízke začať
/ / Interný programovací cyklus.
)unsigned char RD_BYTE (char EE_address)
(

unsigned char data 1;

SS = 1;
P1 = (1 <<P1_6); / / čipovej sady vyberte vysokej
data 1 = SPI_TX_CHAR (0x03); / / Start bit je bit 1 / / 7 bit musí byť 0 - môže

data 1 = SPI_TX_CHAR (EE_address);
/ / Zmena času polarity na 0
data 1 = SPI_TX_CHAR (0x00);
if (miso == 0)
(

data 1 = SPI_SlaveReceive ();
/ / V byte
) / / Vysiela tu je to jedno.návrat data 1;

)

void main ()
(

SS = 0;
UART_INIT (9600,0);

SPI_MasterInit ();
/ / ERASE ();
Ewen ();

WR_BYTE (0xAF, 'A');
OMEŠKANIA (20);
while (1)
(if (miso == 1)
(

data 1 = RD_BYTE (0x3F);
TX_CHAR (SPDAT);
)
)

)

 
Nazdar

Inak môže u prosím odporučiť akékoľvek iné EEPROM, ktoré môžem robiť jednoduché SPI rozhrania s 89v51rd2.Thank Vy.

 
Ahoj vikk,
Nemám naozaj chápať váš program podarilo nájsť žiadnu logiku používať hardware SPI pre vaše aplikácie, môžete vysvetliť, ako ste odosielanie desiatich bit príkaz?V vlákno dán mi, program dán CMOS je takmer softvér zodpovedajúcu hardvérovú SPI.Môžete ľahko modifikovať pridaním slučky index premenné do funkcie tak, aby volania Program môžete nastaviť počet bitov, ktoré majú byť posunutý von.Všetko, čo musíte urobiť, je opakovane volať túto funkciu s rôznymi údajmi bytes vydať príkaz rám a dáta do EEPROM.Also pamäti, že bity budú posunuté tak MSB prvý.Myslím, že tieto EEPROMS sa narodili pred hardware spišského boli k dispozícii, takže nie je určený, aby sa byte orientované.
Nedless povedať, že softvér bude SPI zviazať procesor času v porovnaní s harware SPI.Čo ešte chcete vo vašej aplikácii.

Pozdravy,
Laktronics

 
Som odosielanie 10 bitové inštrukcie prostredníctvom SPDAT o 2 times.it dôjde takhle

SPDAT = 0 0 0 0 0 0 START BIT OPCODE1
SPDAT = OPCODE2 A6 A5 A4 A3 A2 A1 A0

Som schopný písať dáta, ale já nejsem schopný čítať z D0 pin.i dám môj kód oveľa jasnejšie pre vás pochopiť.

#
Include <p89v51rd2.h>
#
Include <delay.h>
#
Include <SPI.h>
#
Include <uart.h>

#
Define mosi P1_5
#
Define miso P1_6
#
Define SCK P1_7
#
Define SS P1_4

unsigned char DÁT, d, data 1;void SPI_MasterInit (void)
(
/ * Nastaviť mosi a SCK a SS (-) ako výstup, všetky ostatné vstupy * /
P1 = (1 <<P1_7) | (1 <<P1_5) | (1 <<P1_4);
/ * Povoli SPI, Master, nastaviť hodinovej sadzby fck/128 * /
SPCR = 0x53;

)
unsigned char SPI_TX_CHAR (unsigned char d)
(

SPDAT = d;

while (! (SPSR & (1 <<SPSR | 0x80 )));// čakať na presun do úplnéhonávrat SPDAT;

)

void ERASE ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x03); / / odosielanie startbit a prvý opcode
SPI_TX_CHAR (0xFF); / / druhý opcode a adresa
SS = 0;
/ / Zdvihni nízke medzi Najnovšie DI bit a ack dospieť od D0 pin
SS = 1;
while (! (1 <<miso ));// kontrola busy flag
SS = 0;
)
void EWDS ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x02); / / odosielanie startbit a prvý opcode
SPI_TX_CHAR (0x00), / / druhý opcode a adresa
SS = 0;

)
unsigned char SPI_SlaveReceive (void)
(
SPI_TX_CHAR (0x00);
/ * Počkajte na recepcii úplné * /
while (! (SPSR & (1 <<SPSR | 0x80)));
/ * Späť údajov registra * /
návrat SPDAT;
)
void Ewen ()
(
SS = 0;
SS = 1;
/ / Uistite sa, že SK je vysoko
/ / Start bit je bit1,
SPI_TX_CHAR (0x02); / / odosielanie startbit a prvý opcode
/ / 00 je pre opcode Ewen
SPI_TX_CHAR (0x60), / / druhý opcode a adresa / / 0110 (6) potrebné na
/ / 0 Ewen sú nie je to zaujíma
SS = 0, / / pre 5 bitov adresy lsb
OMEŠKANIA (20); / / Prineste čip vyberte riadok nízke začať
/ / Interný EEPROM písať cyklus
) / / Musí počkať 5 ms pre vnútorný cyklus na dokončenievoid WR_BYTE (char EE_address, char EE_data)
(
SS = 0;
SS = 1;
Ewen ();
SS = 0;
SS = 1;
/ / Nastavenie čipu Hodnota / / ct vysokej
SPI_TX_CHAR (0x02); / / start bit je bit 1,
/ / Poznámka: 01 je op-kódSPI_TX_CHAR (EE_address);

/ / Adresa umiestnenia
SPI_TX_CHAR (EE_data);

SS = 0;
SS = 1;
while (! (1 <<miso)); volebných pre busy flag

while (! (SPSR & (1 <<SPSR | 0x80))); čaká na odoslanie kompletnú
/ / Data
/ / SS = 0;
/ / SS = 1;
/ / EWDS ();
SS = 0;
/ / Musí obsahovať čip vyberte nízke začať
OMEŠKANIA (20); / / vnútorný cyklus programovania.
)unsigned char RD_BYTE (char EE_address)
(

unsigned char data 1;

SS = 0;
SS = 1;

P1 = (1 <<P1_6); nastavenia miso ako vstupné
/ / Nastavenie čipu vybrať vysokú
SPI_TX_CHAR (0x03); startbit a opcode / / Start bit je bit 1

SPI_TX_CHAR (EE_address);

/ / Zmena času polarity na 0while (miso! = 0); / / čakanie na nízkej na D0
SPCR = SPCR & 0x7F; / / meniace hodiny na polaritu 0
data 1 = SPI_TX_CHAR (0x00); / / odosielanie figuríny Tx a čítanie na data 1
SPCR = SPCR | 0x80; / / meniace polaritu do 1 hodinySS = 0;

OMEŠKANIA (20);
návrat data 1;
)

void main ()
(
unsigned char data2;
SS = 0;
UART_INIT (9600,0); / / intialising UART

SPI_MasterInit ();// Intialising majster
ERASE ();
while (1)
(

WR_BYTE (0x8F, 'D'); písomnedata2 = RD_BYTE (0x0F);

TX_CHAR (data2); zobrazujúci hodnoty vo HyperTerminal

)

)
Konečným cieľom je moje čítať dáta z pamäti prístroja a zobrazovať ich na hyperterminal.I to urobil úspešne medzi dvoma 89v51rd2 teraz chcem urobiť rozhranie s pamäťou device.IS môj výber EEPROM ok? (93C46). Vďaka za pomoc mě celú dobu.

 

Welcome to EDABoard.com

Sponsor

Back
Top