Sari la conținut
ELFORUM - Forumul electronistilor

16f88 i2c slave


costi002

Postări Recomandate

Salutare.De curand, am inceput sa cochetez un pic cu Raspberry Pi si am zis sa vad cum este cu comunicarea pe i2c cu alte device-uri.Asa ca am facut un soft, pentru 16f88 care este folosit ca slave, si il "citesc" un mic program in Python.Problema mea, este la adresare, si este un pic dubioasa si am sa o descriu mai jos.In Raspberry exista un utilitar care scaneaza device-urile de pe magistrala i2c. In acest moment, daca in pic scriu orice adresa care incepe cu 0x3y sau 0x5y (unde y este un nr de la 0 la 9 sau de la A la F), pic-ul nu raspunde, sau poate Raspberry nu face ce trebuie. Orice alta adresa care nu incepe cu 0x3y sau 0x5y este detectata si comunicarea este ok.A mai intalnit careva aceasta problema? Are cineva vre-un soft gata facut si ar putea sa incerce daca pic-ul raspunde pentru aceste adrese?Mentionez ca adresa din pic trebuie impartita la 2 pentru a corespunde cu adresa din Raspberry. De ex, daca in pic am adresa 0x88, este detectat ca 0x44.MUltumesc anticipat.

Link spre comentariu
  • Răspunsuri 9
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    5

  • costi002

    5

Top autori în acest subiect

Nu stiu de ce nu merge picul cu adresele 0x3xy & 0x5y, da' am o idee de ce Raspi "injumatateste" adresele.De fapt Raspi nu injumatateste adresele, ci se uita la adresa propriuzisa, ignorand bitul de operatie (read/write).In protocolul i2c adresa e pe 7 biti. La bitii de adresa se adauga pe post de LSB bitul de operatie (read/write), rezultand un "byte de adresa". Daca privim byte-ul astfel rezultat, constatam ca orice dispozitiv conectat pe un bus i2c are doua adrese - una pentru scriere si una pentru citire. Raspi, asa cum spuneam, ia in considerare doar cei 7 biti de adresa "reala", pe care-i "aliniaza" la dreapta (deplasare la dreapta cu un bit). Operatia asta de deplasare e echivalenta cu o impartire la 2.

Link spre comentariu
  • 1 lună mai târziu...

Am reluat problema. Surpinzator este faptul ca , cu toate ca pic-ul nu este detectat cu utilitarul i2cdetect, daca in soft-ul din Rpi ii spun sa transmita catre adresa setata in pic (0x34 sau 0x54), acestea se inteleg foarte bine. Deci, problema pare sa fie din i2cdetect, nu din pic.

Link spre comentariu

Presupun ca i2c-detect trimite un pachet de date (incearca sa citeasca un registru, de exemplu) la fiecare adresa i2c si testeaza bitul ack/nack. Cum ai programat picul sa raspunda?

Link spre comentariu

Nu am cautat sa vad daca exista vre-o setare in acest sens. Ideea este ca atunci cand pic-ul vede pe magistrala i2c adresa lui, fie ca este read sau write, trebuie sa raspunda cu akn. Ce ma nedumireste este faptul ca la 2 din 8 adrese setabile in pic, picul nu da akn la scanarea magistralei, dar poate trimite si receptiona date.

Link spre comentariu
Nu am cautat sa vad daca exista vre-o setare in acest sens. Ideea este ca atunci cand pic-ul vede pe magistrala i2c adresa lui, fie ca este read sau write, trebuie sa raspunda cu akn.

Ai dreptate, o face automat cu exceptiile

Either or both of the following conditions will cause the

SSP module not to give this ACK pulse:

a)

The Buffer Full bit, BF (SSPSTAT<0>), was set

before the transfer was received.

b)

The Overflow bit, SSPOV (SSPCON<6>), was

set before the transfer was received.

Ce ma nedumireste este faptul ca la 2 din 8 adrese setabile in pic

De ce doar 8 adrese? SSPADD pare in intregime dedicat adresarii.

 

La problema ta n-am idee care ar fi raspunsul.

Link spre comentariu

Incepe sa se faca un pic de lumina. Am incercat sa capturez adresele trimise de Rpi si sa le pun in eeprom, dar nu mi-a iesit. In schimb, am capturat doar adresele care sunt identice cu ce este setat in pic, ceea ce si este normal. Lucrul curios insa, este ca Rpi, in loc sa transmita 68 (ce corespunde cu adresa reala 34) el trimite 69, si in loc de A8 imi trimite A9. Restul sunt cum trebuie(08,28,48, 69, 88, A9 C8, E8 ), exceptie ce este cu rosu. Partea nasoala este ca dupa o scanare, cand este setata adresa 68 sau A8 in pic, pic-ul ingheata, pentru ca considera ca are de trimis date (R/W = 1). Acum, trebuie sa gasesc o solutie care sa dezghete pic-ul si saelibereze magistrala I2C.

 

Referitor la cele 8 adrese - am trei jumperi din care se pot seta adresele, toate adresele trebuie sa fie cu 4 in coada, de aceea nu pot asigna alte adrese.

Link spre comentariu

Man i2cdetect:

SYNOPSIS i2cdetect [-y] [-a] [-q|-r] i2cbus [first last]DESCRIPTION...The optional parameters first and last restrict the scanning range (default: from 0x03 to 0x77).

Cu alte cuvinte, foloseste first si last sa sari peste adresele cu probleme.
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări