duminică, 1 decembrie 2013

Despre protoculul SPI..... (Partea 2)

        Am vazut in prima parte a prezentarii faptul ca lucrurile "se misca in cerc" si, contrar intelesului, in final chiar se intampla ceva (se transmite informatie). Daca lucrurile nu pareau complicate si totul era frumos (bitii se bateau cap in cap pe ritmul impus de semnalul de ceas ) cei care au dezvoltat protocolul s-au gandit ca ar fi cazul sa le complice, introducand doua concepte : CLOCK POLARITY si CLOCK PHASE. 

        Ce Dumnezeu or fi si astea ? Personal mie mi-au scos peri albi si nu pentru ca ar fi cine stie ce taina de nepatruns ci tocmai datorita faptului pe care il subliniam in prima parte : FIECARE PRODUCATOR IMPLEMENTEAZA PROTOCLUL UTILIZAND DENUMIRI PROPRII. 

         Pentru a intelege exact cine cu ce se mananca este de mare ajutor urmatoarea imagine:



POZA 1: Faza si polaritate


      Stim deja ca pentru a initia transmisia este necesar ca pinul SS sa fie adus LOW. Apoi mai stim ca este necesar un semnal de ceas (SCK).
    Daca ati cautat cate ceva pe net despre acest protocol probabil ca v-ati intalnit cu termenul IDLE CLOCK. Chestiuta asta inseamna de fapt nivelul logic al semnalului de ceas in momentul in care SS este adus LOW. Cum orice bit nu poate lua decat doua valori 0 sau 1 asta inseamna ca  la randul lui semnalul de ceas nu poate lua deacat doua valori : 0 sau 1. De aici provine ideea de CLOCK POLARITY (CPOL):

  • DACA LA INITIEREA SS LOW SCK  ESTE 0 ATUNCI   CPOL   ESTE   0
  • DACA LA INITIEREA SS LOW SCK  ESTE 1 ATUNCI   CPOL   ESTE  1

      Acum mai ramane de explicat CPHA. Cand bitii incep sa se impinga intre ei in registrii si sa il dea afara pe ultimul din dreapta fac chestia asta ordonat in ritmurile SCK.  Dar cum o fac? Pentru a transmite 8 biti sunt necesare 8 perioade ale semnalului de ceas. Cum fiecare perioada are doua fronturi, unul crescator si altul descrescator si cum bitii se transmit numai pe aceste fronturi rezulta ca exista doar doua posibiliatati de transmitere: fie pe frontul crescator fie pe cel descrescator. Dar asta nu explica inca CPHA. Daca apelam la imaginea de mai sus si urmarim "X-urile" observam ca ele marcheaza primul front al primei perioade. Urmarind sagetile observam 2 lucruri: primul ar fi ca directia sagetii  indica daca frontul este crescator (LOW to HIGH) sau descrescator ( HIGH to LOW), iar cel de-al doilea ar fi faptul ca unele sageti sar peste primul front. Astfel se poate face urmatoarea afirmatie:

  • DACA BITII SE TRANSMIT PE PRIMUL FRONT PE CARE IL INTALNESC ATUNCI CPHA ESTE 0
  • DACA BITII SE TRANSMIT PE AL DOILEA  FRONT PE CARE IL INTALNESC ATUNCI CPHA ESTE 1.
      Combinand CPHA cu CPOL rezulta 4 moduri de functionare:

  1. Modul 1     CPOL =0  CPHA=0
  2. Modul 2     CPOL =0  CPHA=1
  3. Modul 3     CPOL =1  CPHA=0
  4. Modul 4     CPOL =1  CPHA=1
     Cele 4 moduri sunt universal valabile insa de fiecare data cand implementati acest protocol trebuie sa aveti in vedere doua lucruri: primul ar fi in care mod din cele 4 functioneaza perifericul iar cel de-al doilea cum se seteaza acest mod in interiorul uC.
      Acum la final, ca pentru amuzament voi prelua postarea userului " ckielstra " existenta pe forumul celor de la CCS C (compilator de C pentru microcontrollere din famila Microchip) la adresa  de aici :

// SPI Mode | MOTOROLA | MICROCHIP | CCS                          | Data clocked in at
//----------------------------------------------------------------|-------------------
//          | CPOL CPHA|  CKP CKE  |                              |
//    0     |  0    0  |   0   1   | SPI_L_TO_H | SPI_XMIT_L_TO_H | low to high edge
//    1     |  0    1  |   0   0   | SPI_L_TO_H                   | high to low edge
//    2     |  1    0  |   1   1   | SPI_H_TO_L                   | high to low edge
//    3     |  1    1  |   1   0   | SPI_H_TO_L | SPI_XMIT_L_TO_H | low to high edge 


     Simplu nu ????



Niciun comentariu:

Trimiteți un comentariu