SPI s 8051 a 93C46

Nazdar,
Myslím, že váš kód by mal fungovať, vedúci nuly sú prijateľné na čipe, tak dlho, ako DI nie je vysoká.Použite ťahajte do miso pretože ide DO tristate at times.

1.Skontrolovať váš prístroj 93C46 a nie 93C46A,
obe sú trochu odlišné v prevádzke.

2.When ste s hardvérom SPI, môžete odosielať a prijímať súčasne 8bits.Po napísaní požadovaného byte alebo figuríny byte, vždy hľadať SPIF, aby to bola pravda, jasné SPIF a čítať SPIDAT iba ak nepotrebujete.

3.Môžete skontrolovať stav pripravený po byte napísať zaslaním nulový byte a hľadáte pre pozitívne dostal byte.Reading miso nemusí pracovať, pretože piny sú nastavené ako SPI.

4.Môžete nastaviť miso len raz na začiatku ak je potrebné, väčšinou ani to nie je odôvodnené, pretože konfiguráciu ako SPI majster bude všetko SPI bitov na požadované stave.Nie je potrebné nastavovať žiadne výstupné bit v 8051.

5.Skontrolujte, či váš kód starostlivo.

Pozdravy,
Laktronics

 
Nazdar
I stalo sa pozrieť na nejaký aplikačnú poznámku ohľadom 93C46 a zistil, že je to 3 drôty sériové rozhranie, čo znamená, DI a DO by mal byť spojený together.Which tiež znamená mosi musí konať ako výstup pri písaní a ako vstup pri reading.I mať upravil kód aby vyhovovali tomuto stavu.
tady to ide (aj dali len prečítať časť)
unsigned char RD_BYTE (char EE_address)
(

unsigned char data 1;

SS = 0;
SS = 1;SPI_TX_CHAR (0x03); / / Start bit je bit 1 / / 7 bit musí byť 0 - môže

SPI_TX_CHAR (EE_address);

data 1 = SPI_SlaveReceive ();

SS = 0;

návrat data 1;
)

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

/ * Počkajte na recepcii úplné * /
while (! (SPSR & (1 <<SPSR | 0x80)));
/ * Späť údajov registra * /
Mosi = 1;
while (! (SPSR & (1 <<SPSR | 0x80)));
návrat SPDAT;
)
v hlavných i bude vysielať data 1.

Btwn môže navrhnúť u akejkoľvek 4 vodičové sériové EEPROM.I myslím AT25080A/160A alebo Microchip 25LC080/160 je dobrá option.Please dovolte mi, abych darovať nejaké body pre vás, pretože ste naozaj bolo trávenie času me.Thank pre vás.

 
Nazdar,
Zatiaľ ste na správnej ceste, ale teraz ste sa odchyľujú od neho.93C46 je vždy štyrmi oceľovými EEPROM a možno urobiť tri vodiče (zachrániť jeden pin) o skrat Do Di a kolíky, používať rezistory v Myslíte cestu.Ale nie je problém vo vašom prípade, pretože hardvér SPI je vždy použiť štyri vodiče.Aspoň Microchip potvrdzuje vedúce nuly na príkaz bude zanedbané a dúfam, že to je ten istý prípad s inými robí tiež.I tu preto myslím, že ak píšete správne majster SPI program by mal fungovať.Pre kontrolu pripraveného stave, odoslania 0x0FF (nie je nula, jak jsem psal včera) a kontrola obdržané byte pre pozitívne hodnoty, namiesto čítania miso priamo.Som si istý, že by malo fungovať v poriadku.

Pozdravy,
Laktronics

 
Keď chcem použiť ako 4 drôt aj shud pripojiť ORG Vcc.then to sa stáva a 16 bit architecture.Please odkazovať na manuále som sa viažu v ktorej rozhranie informácií je vysvetlená dobre.
Ospravedlňujeme sa, ale musíte prihlásiť a prezerať túto prílohu

 
v prevedení sa ATMEL 93C46 a nie mikročip, ktorý je mierne different.in ATMEL je možné použiť ako 3 drôt inak musíme nastaviť ako 16 bitov, ktoré budú pridané na naše bolesti only.Moreover i všetko, čo sa pokúšali, ale aj prevýšenie, aby sa prečo to nefunguje ..
tady je moje zaktualizovaný kód:
unsigned char SPI_SlaveReceive (void)
(

/ * Počkajte na recepcii úplné * /
while (! (SPSR & (1 <<SPSR | 0x80)));

/ * Späť údajov registra * /návrat SPDAT;
)
void RD_BYTE (char EE_address)
(SS = 0;
SS = 1;

SPI_TX_CHAR (0x03); / / Start bit je bit 1 / / 7 bit musí byť 0 - môže

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;

OMEŠKANIA (20);

)

ak chcem vymazať SPIF vlajkou alebo prieskum stavu busy flag programu je získanie štukatura there.Moreover som písať a čítať medzi dvoma 89v51rd2 bez zúčtovania sa SPIF vlajky a je dokonale fine.So pracovné i nebolo jasné, že SPIF flag.If existuje niekoľko úprav kódu, prosím dajte mi know.This práca je naozaj prekročila svoju dobu a i cant hádejte prečo, ale aj fakt žvanec SPI dobre pochopiť, ktorý je jeho šedej strane.

 
Ahoj vikk,
Mám len skúsenosti s Atmel 93C46 a robia pôsobí v 8-bitový režim s ORG pin uzemnění.Som programátor, ktorý podporuje tieto divices v 8 bit režim.I
Nenašli pokúsil s vedúcimi nulami, pretože rozhranie EEPROM vo programátor je prístav bit založený a využíva štyri pin režime.Budem sa snažiť zmeniť softvér zaradiť vedúci nuly na čipe Atmel a dať vám spätnú väzbu.Prijateľnosti úvodnej nuly, je uvedené v Microchip listu a to znie logicky, pretože vysoký štart bit je vyžadovaný u všetkých príkazov.Ďalej som presvedčený, že všetky čipy s rovnakým číslom dielu by mal mať rovnaké architektúre, a preto by sa mal použiť pre Atmel moc, budem sa snažiť to vyskúšať hneď.Všetky 93C46 IC pokiaľ viem majú ORG pin.

Do tej doby, prosím dajte mi vedieť, ktoré C Compiler, ktorý používate.

Pozdravy,
Laktronics

 
Ahoj laktronics,
Súhlasíte s tým, že aj to sa ORG uzemnění, v ktorých pracujú 8 bitové mode.but DI a DO by mal byť spojený together.Please prejsť aplikačnú poznámku, ktoré som pripojený v mojich predchádzajúcich post.SO, čo som urobil bolo mosi ako vstupné po napísaní adresa v čítaj mode.after čítaní dát z DI pin i znovu nakonfigurovaný mosi ako output.Should aj zmeniť čokoľvek ďalšieho čítania mode.I som dostať nedefinovaného údaje ako moje O / P. Any požadované zmeny v okruhu?
Prekladač i používám je SDCC C kompilátoru.

 
Ahoj vikk,
Z vašich vlastných aplikácií.PoznámkaCitácia:V ORG (vnútornej organizácie) pin vyberie 8 bitov dát pri uzemnenej a 16 bitov dát pri plávajúce alebo viazané na Vcc .... 8bit alebo 16 bit data môžu byť vybraté buď 3-vodičové alebo 4-vodičové konfigurácia

 
Vďaka t ... to bola dobrá správa ... id
didnt oznámenie, že statement.Now aj vzali starostlivosť o vaše pokyny a upravil môj kód 4 drôt ... Uvidíme, či existuje niečo wrong.Regarding SPIF i cant pomoci
, pretože aj keď využitie SPIF priamo a kontrolu niektorých chýb, je uvedený v mojej kompileru tak jdu k tomuto usage.So späť až 4 drôt a skontrolujte moje upravil kód pre 4 vodiče.
#
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 DÁT, d, data2;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)
(

SPDAT = d;

while (! (SPSR & (1 <<SPSR | 0x80)));návrat SPDAT; / / Návrat údajov registra

) / / I am pomocou tejto funkcie ako commenté pre všetky mojej operácievoid ERASE ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x03);
SPI_TX_CHAR (0xFF);

SS = 0;
/ / Zdvihni nízke medzi Najnovšie DI bit
SS = 1;
SS = 0;
OMEŠKANIA (20);
)
void EWDS ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x02);
SPI_TX_CHAR (0x00);
SS = 0;

)

void Ewen ()
(
SS = 0;
SS = 1;
/ / Uistite sa, že SK je vysoko
/ / Start bit je bit1,
SPI_TX_CHAR (0x02);
/ / 00 je pre opcode Ewen
SPI_TX_CHAR (0x60) / / 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ó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 '.

SPI_TX_CHAR (EE_address);

/ / Adresa umiestnenia
SPI_TX_CHAR (EE_data);
SS = 0;
SS = 1;
/ / Musí obsahovať čip vyberte nízke začať
OMEŠKANIA (20); / / vnútorný cyklus programovania.
)void RD_BYTE (char EE_address)
(SS = 0;
SS = 1, / / čipovej sady vyberte vysokej
SPI_TX_CHAR (0x03); / / Start bit je bit 1 / / 7 bit musí byť 0 - môže

SPI_TX_CHAR (EE_address);
data2 = SPI_TX_CHAR (0xFF); / / tady jsem odosielanie dát figuríny a očakávame dáta z EEPROM, ktoré som v data2 ukladanie a zobrazovanie v HyperTerminal.
TX_CHAR (data2);

SS = 0;
OMEŠKANIA (20);
/ / Vráti data 1;
)

void main ()
(
/ / Unsigned char data2;
SS = 0;
UART_INIT (9600,0);

SPI_MasterInit ();
ERASE ();
while (1)
(

WR_BYTE (0x8C, 'B');

OMEŠKANIA (20);
RD_BYTE (0x0C);

TX_CHAR (data2);

)

)

Som dostať!na mojom HyperTerminal ... opravu v tomto kóde?Pridané po 4 hodiny 12 minút:Ahoj Laktronics,
Atlast som schopný čítať niečo z EEPROM.Now nový problém je, že je posun.
napríklad keď sa snažím čítať K dostanu%. když zkusím prečítať 2 W i dostať . i pre H i dostanete $. Ak sa aj pokúsiť sa porovnať s ascii listu som to dva znaky sú zdieľanie rovnakej ascii znak a Zvýšenie je proportional.for eg.j a sú k ssharing%. L, M sú zdieľanie &. N, O zdieľanie '. ako sa zbaviť tohto nového problému ... nijak ven?Pridané po 1 hodina 33 minút:Ahoj Laktronics,
existuje zaujímavá pozorovania .... posledný bit nie je dostať dovnútra.
napríkladK listu pre získaných údajov je potrebné 01001100 ale já dostať 00100101
k listu L získaných údajov musí byť 01001100, ale já jsem dostat 00100110
za písmenom N získaných údajov je potrebné 01001110 ale já dostať 00100111.
o lsb nie je plne dostať dovnútra.Pridané po 55 minútach:Cítim figuríny bit (logická 0) predoąlú 8 bitový reťazec v režime čítania vytvára problém, pretože môžete nájsť ďalšie nulu v MSB, ktorý nie je needed.Now otázkou bude, ako sa vyhnúť tejto nule ... . já dávám kód nižšie.

#
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 DÁT, d, data2;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 = 0x50;

)
unsigned char SPI_TX_CHAR (unsigned char d)
(

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

SPSR = SPSR & 0x7F;

/ / Návrat údajov registra
návrat SPDAT;

)

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

SS = 0;
/ / Zdvihni nízke medzi Najnovšie DI bit
SS = 1;
while (miso == 0);
/ / TX_CHAR ( 'U');
SS = 0;
)
void EWDS ()
(
SS = 0;
SS = 1;
SPI_TX_CHAR (0x02);
SPI_TX_CHAR (0x00);
SS = 0;

)

void Ewen ()
(
SS = 0;
SS = 1;
/ / Uistite sa, že SK je vysoko
/ / Start bit je bit1,
SPI_TX_CHAR (0x02);
/ / 00 je pre opcode Ewen
SPI_TX_CHAR (0x60) / / 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ó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 '.

SPI_TX_CHAR (EE_address);

/ / Adresa umiestnenia
SPI_TX_CHAR (EE_data);
SS = 0;
SS = 1;
while (miso == 0);
/ / TX_CHAR ( 'S'); / / Data
SS = 0;
/ / TX_CHAR ( 'B'); / / Musí byť nastavená č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, / / čipovej sady vyberte vysokej
SPI_TX_CHAR (0x03); / / Start bit je bit 1 / / 7 bit musí byť 0 - môže

SPI_TX_CHAR (EE_address);
data 1 = SPI_TX_CHAR (0x00);

SS = 0;

návrat data 1;
)

void main ()
(
P1_6 = 1;
unsigned char data2;
SS = 0;
UART_INIT (9600,0);

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

TX_CHAR (data2);))Pridané po 27 minútach:Ahoj laktronics,
Našiel som solution.but to neplatí pre každého cases.I dělám doľava na smeny, takže 0 pristane až v poslednej bit a jsem získali právo výstup, ale je to možné len v cases.if dokonca dostanete nepárne číslo 1, ktorý má v poslednej bit to nie je možné, a já budu mít problém me.anything príde na svojej mysli?

 
Ahoj vikk,
Dobrá práca vikk som nebola vraciam, pretože som nemohol dostať pripravená riešenie svojho problému, a som si istý, že by vám pomohla sa naučiť veci, ktoré sami.

Teraz sa vracajú k svojmu problému, zdá sa, že systém je zdvihnúť predné Zero, ktoré predchádza dátumu byte.Ak sa pozriete na načasovanie diagram na strane 44 v manuáli procesora, môžete vidieť, že SPI Mód 0 očakáva miso vstupy, ktoré majú byť pripravení, ak ide hodiny pozitívne, je-li ako EEPROM presúva z údajov po krátkom zdržali z pozitívneho okraj tepu.Takže, po zaslaní čítaj velenia s SPCR = 0x52, budete meniť SPCR = 0x56 (SPI Mode1) pred prečítaním údajov byte z EEPROM.

This will ensure that the Master strobs data on the falling edge of the clock and by then the EEPROM will output the data to MISO, triggered by the positive edge of the clock. 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. Pozdravy,Laktronics
 

Welcome to EDABoard.com

Sponsor

Back
Top