Տվյալների փոխանցման գործառույթներ՝ օգտագործելով spi. Սերիական ինտերֆեյս SPI. SPI-ի վրա հիմնված կապի համակարգերի տոպոլոգիա

Այս հոդվածում ես ուզում եմ կարճ ակնարկ SPI ավտոբուս (ինտերֆեյս, որը լայնորեն օգտագործվում է ներկառուցված տեխնոլոգիայի մեջ, որն օգտագործվում է միանալու համար տարբեր սարքեր) և ես կփորձեմ նկարագրել Linux-ի համար SPI սարքի արձանագրության մակարդակի դրայվեր ստեղծելու գործընթացը։ Այս փաստաթուղթըդերի համար չի դիմում ամբողջական ուղեցույց, այլ ավելի շուտ նպատակ ունի ցույց տալ ճիշտ ուղղությամբ: Քանի որ հոդվածը ներառված չէր մեկ թեմայի չափի մեջ, ես ստիպված էի այն բաժանել երկու մասի։

0. Ներկայացնելու փոխարեն

Ինչ է այս հոդվածը:
Այս հոդվածը տարբեր աղբյուրներից ստացված տեղեկատվության հավաքածու է, փաստաթղթերի որոշ մասերի անվճար թարգմանություն, ինչպես նաև իմ սեփական մեկնաբանությունները, լրացումները և առաջացած խնդիրների նկարագրությունը:

Ո՞ւմ համար է այս հոդվածը:
Առաջին հերթին, սկսնակների համար, որը ես եմ: Ներկառուցված Linux ֆորումներում հաճախ կարող եք հանդիպել հարցի. «Ինչպե՞ս կարող եմ աշխատել SPI-ի հետ այս տախտակի վրա»: Հենց դրան էլ կփորձեմ պատասխանել։ Որպես օրինակ՝ ես կտամ իմ փորձնական SPI սարքի հետ աշխատելու համար գրված կոդը։

Հոդվածի կառուցվածքը
Հաշվի առնելով այն հանգամանքը, որ տեղեկատվությունը շատ էր, հոդվածը բաժանված է մի քանի ենթաբաժնիների.

  1. Ի՞նչ է SPI-ն:
  2. SPI ենթահամակարգի ակնարկ Linux-ում
  3. Userspace արձանագրության SPI վարորդի մշակում, օգտագործելով spidev
  4. Արձանագրության SPI միջուկի մակարդակի վարորդի մշակում
  5. Փաստաթղթեր
Առաջին երկու կետերը կներառվեն հոդվածի առաջին մասում, մնացածը՝ երկրորդում։

Առաջին ենթաբաժինը նկարագրում է SPI ավտոբուսի աշխատանքը, հոդվածի այս հատվածը հատուկ կապված չէ Linux-ի հետ, ուստի այն կարող է կարդալ նրանք, ովքեր հետաքրքրված չեն Linux-ով, բայց դուք պարզապես պետք է տեղեկատվություն ստանաք այս ինտերֆեյսի մասին:

Երկրորդ ենթաբաժինը նկարագրում է Linux-ում SPI-ի հետ աշխատանքի հիմքում ընկած կառուցվածքներն ու մեխանիզմները, այն պետք է կարդալ՝ հասկանալու համար, թե ինչ է քննարկվելու երրորդ և չորրորդ մասերում։

Եթե ​​ձեզ չեն հետաքրքրում իմ թարգմանություններն ու հավելումները, կարող եք հանգիստ անցնել ուղիղ հինգերորդ մաս, որտեղ կարող եք գտնել տեղեկատվություն, թե որտեղից կարելի է ստանալ բոլոր անհրաժեշտ տեղեկությունները այս հարցի վերաբերյալ:

Սխալներ
Ես հրաշագործ չեմ, ես պարզապես սովորում եմ: Եթե ​​գտնում եք որևէ սխալ կամ անճշտություն, խնդրում եմ տեղեկացնել ինձ:

1. Ի՞նչ է SPI-ն:

SPI հապավումը նշանակում է «Սերիական ծայրամասային ինտերֆեյս» կամ ռուսերեն տարբերակով «սերիալ ծայրամասային ինտերֆեյս«. Անունն ինքնին խոսում է տրված ինտերֆեյսօգտագործվում էր տարբեր ծայրամասային սարքեր. Օրինակ, դրանք կարող են լինել տարբեր DAC/ADC-ներ, պոտենցիոմետրեր, սենսորներ, մուտքային/ելքային (GPIO) ընդլայնիչներ, տարբեր հիշողություններ և նույնիսկ ավելի բարդ ծայրամասային սարքեր, ինչպիսիք են աուդիո կոդեկները և Ethernet կարգավորիչները:

Տեխնիկական տեսանկյունից SPI-ն համաժամանակյա չորս լարային ավտոբուս է: Այն երկու սինխրոն հերթափոխ ռեգիստրների միացում է, որը ցանկացած SPI սարքի կենտրոնական տարրն է։ Կապը օգտագործում է վարպետ/ստրուկ կոնֆիգուրացիա: Միայն վարպետը կարող է ժամացույցի իմպուլսներ առաջացնել: Շղթայում միշտ կա միայն մեկ վարպետ (ի տարբերություն նույն I2C ավտոբուսի, որտեղ հնարավոր է տարբերակ մեկից ավելի վարպետներով), ստրուկների թիվը կարող է տարբեր լինել: IN ընդհանուր դեպք Master-ի ելքը միացված է ստրուկի մուտքին, և հակառակը՝ ստրուկի ելքը միացված է վարպետի մուտքին։ Երբ ժամացույցի իմպուլսները կիրառվում են SCK ելքի վրա, տվյալները մղվում են վարպետի կողմից MOSI ելքից և գրավում ստրուկը MISO մուտքի միջոցով: Այսպիսով, եթե դուք կիրառեք համաժամացման իմպուլսների քանակը, որը համապատասխանում է հերթափոխի ռեգիստրի բիթային լայնությանը, ապա ռեգիստրներում տվյալները կփոխանակվեն: Սրանից հետևում է, որ SPI-ն միշտ աշխատում է լրիվ դուպլեքս ռեժիմով։ Բայց արդյոք մեզ անհրաժեշտ են սարքից ստացված տվյալները պարամետր ձայնագրելիս, սա այլ հարց է։ Հաճախ է պատահում, որ սարքից ստացված տվյալները դրա վրա տվյալներ գրելիս աղբ են, որի դեպքում դրանք պարզապես անտեսվում են, բայց մենք դրանք կստանանք անկախ մեր ցանկությունից։

SPI կարգավորիչը սովորաբար իրականացվում է ծայրամասային սարքի կողմից MCU-ում կամ eMPU-ում: Չիպերի մեծ մասում այն ​​կարող է աշխատել ինչպես հիմնական, այնպես էլ ստրուկ ռեժիմներում: Բայց վրա այս պահին Linux-ն աջակցում է միայն հիմնական ռեժիմին:

SPI սարքերը միացնելու մի քանի եղանակ կա:

Դրանցից ամենապարզը կարող եք տեսնել վերևի նկարում (շնորհիվ Վիքիպեդիայի՝ անվճար GFDL լիցենզիայի ներքո նկարների համար): Այս դեպքում բոլոր ստրուկները միացված են վարպետին զուգահեռ, բացառությամբ ստրուկի ընտրության ազդանշանի (~CS): Յուրաքանչյուր ստրուկ պահանջում է առանձին ստրուկի ընտրության ազդանշան (նկարում դրանք պիտակավորված են SSx): Slave select ազդանշանների համար կարող են օգտագործվել և՛ հատուկ SPI կարգավորիչի ելքերը, և՛ I/O պորտերը: հիմնական նպատակ, գլխավոր նպատակ(GPIO) միկրոկոնտրոլեր:

Տվյալների փոխանցման համար օգտագործվում են երկու լարեր, մեկը ժամացույցի համար և մեկ ստրուկ ընտրության ազդանշան յուրաքանչյուր ստրուկի համար:
Օգտագործված ազդանշանների նկարագրությունը.

  • MOSI - Master Output, Slave Input (master output, slave input): Այս ազդանշանը նախատեսված է սերիական տվյալների փոխանցման համար վարպետից դեպի ստրուկ: Կարող է նաև կոչվել SDO, DO և այլն:
  • MISO - Master Input, Slave Output (հիմնական մուտքագրում, ստրուկի ելք): Այս ազդանշանը նախատեսված է սերիական տվյալների փոխանցման համար ստրուկից դեպի վարպետ: Կարող է կոչվել SDI, DI և այլն:
  • SCK - Սերիական ժամացույց (համաժամացման ազդանշան): Օգտագործվում է տվյալների փոխանցման ժամանակ համաժամացման համար: Այն կարող է նաև կոչվել SCLK, CLK և այլն:
  • ~CS - Chip Select (չիպի ընտրություն): Այս ազդանշանը ակտիվացնում է ստրուկ սարքը: Այն սովորաբար շրջված է, այսինքն ցածր մակարդակհամարվում է ակտիվ: Այն երբեմն կոչվում է ~SS (Slave Select):

Անկախ կապի առանձնահատուկ դեպքը մեկ ստրուկով տարբերակն է: Այս դեպքում կարող եք ~CS ազդանշանը գետնին քաշել, որպեսզի սարքը միշտ ակտիվ վիճակում լինի: Բայց դա անելը խիստ հուսահատվում է, քանի որ ստրուկ սարքը կարող է օգտագործել CS ազդանշանը սկզբնավորման կամ սպասարկման այլ նպատակների համար:

Սլավոններին ինքնուրույն միացնելու հիմնական անհարմարությունն այն է, որ ստրուկներից յուրաքանչյուրի համար անհրաժեշտ է առանձին ~CS ազդանշան։ Կասկադային կապի սխեման, որն արտասահմանյան գրականության մեջ կոչվում է «շղթա-շղթա» (կարելի է թարգմանել «գառլանդ»), զուրկ է նման թերությունից։

Ինչպես տեսնում եք վերևի նկարից, այստեղ մենք օգտագործում ենք ընդհանուր ազդանշանստրուկների ընտրություն բոլոր ստրուկների համար: Յուրաքանչյուր ստրուկի ելքը միացված է հաջորդի մուտքագրմանը: Վերջին ստրուկի ելքը միացված է վարպետի մուտքին, դրանով իսկ ձևավորելով փակ միացում: Այս կապով մենք կարող ենք ենթադրել, որ սերիական միացված սարքերը կազմում են մեկ մեծ հերթափոխ ռեգիստր: Համապատասխանաբար, տվյալները կարող են գրվել բոլոր սարքերին «մեկ նիստում»՝ նախապես հավաքելով անհրաժեշտ փաթեթը, որը միավորում է սարքերից յուրաքանչյուրի տվյալները՝ միացման ֆիզիկական կարգին համապատասխան հերթականությամբ: Բայց կա մի նուրբ կետ. Նախ, բոլոր միկրոսխեմաները պետք է աջակցեն այս տեսակի միացմանը. երկրորդը, Linux միջուկը չի աջակցում այս տեսակի կապի, այնպես որ, եթե դուք դեռ ցանկանում եք օգտագործել այն, դուք պետք է փոփոխեք առկա դրայվերները կամ գրեք ձեր սեփականը:

SPI սարքերի համար կա չորս գործառնական ռեժիմ: Որպես կանոն, նրանք ամենաշատ շփոթություն են առաջացնում սկսնակների շրջանում։ Այս չորս ռեժիմները երկու բիթերի համադրություն են.

  • CPOL (Clock Polarity) - սահմանում է Առաջին մակարդակհամաժամացման ազդանշանի (բևեռականություն):
    CPOL=0 ցույց է տալիս, որ ժամացույցի ազդանշանը ցածր է սկսվում, այնպես որ բարձրացող եզրը բարձրանում է, իսկ իջնողը ընկնում է:
    CPOL=1, ժամացույցի ազդանշանը բարձր է սկսվում, ուստի բարձրացող եզրն ընկնում է, իսկ անկողը՝ բարձրանում:
  • CPHA (Ժամացույցի փուլ) - համաժամացման փուլ, որը որոշում է, թե ժամացույցի ազդանշանի որ եզրերի վրա է ընտրվում տվյալները:
    CPHA=0 ցույց է տալիս, որ անհրաժեշտ է նմուշառել բարձրացող եզրին, և
    CPHA=1 ցույց է տալիս, որ տվյալները պետք է նմուշառվեն ընկնող եզրին:
Այս երկու բիթերը կազմում են ռեժիմի համարը: CPOL-ը բարձր բիթն է, իսկ CPHA-ն ցածր բիթն է: Երբեմն սարքի փաստաթղթերում հստակորեն չի նշվում ռեժիմի համարը, սակայն այն միշտ կարելի է հեշտությամբ որոշել ժամանակի գծապատկերներից: Կարևոր է նաև հասկանալ, որ առբերման և կարգաբերման տվյալները միշտ տեղի են ունենում ժամացույցի ազդանշանի հակառակ եզրերին: Օրինակ՝ թողեք, որ մեր սարքը աշխատի 0 ռեժիմում (ամենատարածված դեպքը), որի դեպքում ստրուկ սարքը կկարդա տվյալների բիթը MOSI մուտքագրից՝ ժամացույցի ազդանշանի առջևի բարձրացող եզրին, և վարպետ սարք MISO մուտքագրում կկարդա ստրուկի տվյալները նաև բարձրացող եզրին: Ավելի պարզության համար ես կտամ ալիքի ձևեր բոլոր չորս աշխատանքային ռեժիմների համար.

Այս նկարը ցույց է տալիս MOSI (կապույտ գիծ) և SCK (դեղին գիծ) ազդանշանները: Բոլոր դեպքերում փոխանցվում է 0x64 թիվը։ Լույս ուղղահայաց գծերցույց տալ տվյալների նմուշառման պահը. Դիտարկենք 2-րդ ռեժիմը, որի համար, ինչպես հիշում ենք, CPOL=1 և CPHA=0: Այսպիսով, մենք տեսնում ենք, որ համաժամացման ազդանշանն ի սկզբանե ունի բարձր մակարդակ, իսկ նմուշառումը կատարվում է առաջնային եզրով (այս դեպքում՝ ընկնելով)։ Քանի որ իմ օսցիլոսկոպն ունի միայն երկու ալիք, ~CS և MISO ազդանշանները չեն ցուցադրվում: Բայց այս դեպքում դրանք այնքան էլ հետաքրքիր չեն, օրինակ՝ ~CS ազդանշանը պարզապես «ձախողում» է տվյալների փոխանցման ողջ ընթացքում։

2. SPI ենթահամակարգի ակնարկ Linux-ում

Linux SPI դրայվերները բաժանված են երկու մասի. Առաջինը SPI կարգավորիչի դրայվերներն են, որոնք ուղղակիորեն աշխատում են որոշակի կարգավորիչի սարքաշարի հետ: Նման վարորդները որոշում են, թե ինչպես կարգավորել կարգավորիչը, ինչ գործողություններ ձեռնարկել ցածր էներգիայի ռեժիմին անցնելիս (կասեցնել) և դրանից դուրս գալ (վերսկսել), ընտրել հաջորդ փոխանցումը (spi_transfer) փոխանցման հերթից հաղորդագրության մեջ (spi_message, հերթերի մասին հենց ներքևում): ) և այն ուղղակիորեն նավահանգիստ ուղարկելը, որը նաև սահմանվում է որպես միացնել/անջատել կոնկրետ սարք CS-ի միջոցով (cs_activate/cs_deactivate ֆունկցիաներ): Այս հոդվածում ես չեմ նկարագրի տրված տեսակըվարորդներ. Որպես կանոն, դրանք արդեն ներդրված են այն MCU / eMPU-ի համար, որոնց վրա կա Linux պորտ, և դուք պետք է մուտք գործեք դրանց մեջ ձեր ձեռքերով միայն այն դեպքում, եթե ձեզ անհրաժեշտ է որևէ հատուկ գործառույթ, ինչպիսին է Chip Select Decoding-ը, որպեսզի կարողանաք ակտիվացնել ցանկալի ստրուկ սարքը արտաքին տրամաբանության միջոցով: Երբեմն դա օգտակար է, օրինակ, GPIO-ի բացակայության դեպքում:

Երկրորդ մասը պրոտոկոլի դրայվերներն են, որոնք օգտագործվում են տարբեր ստրուկ սարքերի հետ աշխատելու համար, որոնք միացված են SPI ավտոբուսին: Այս դրայվերները կոչվում են «պրոտոկոլ», քանի որ դրանք ուղարկում և ստանում են միայն ստրուկ սարքերից տարբեր տվյալներ, մինչդեռ ուղղակիորեն չեն աշխատում որևէ սարքավորման հետ: Մեզ համար ամենահետաքրքիրն այս տեսակի դրայվերն է, քանի որ այն թույլ է տալիս մեզ ավելացնել համակարգին հետաքրքրող ստրուկ սարքի աջակցությունը, և մենք դա կդիտարկենք:

Արձանագրության դրայվերների մեծ մասը միջուկի մոդուլներ են: Օրինակ, եթե սարքը SPI-ին միացված աուդիո կոդեկ է, ապա վարորդը կօգտագործի նաև ALSA-ի տրամադրած գործառույթները, և ծրագրերը (օրինակ՝ madplay) կկարողանան աշխատել դրա հետ նիշային սարքի /dev/audio, չունենալով նվազագույն պատկերացում, թե ինչպես է այն ապարատային դասավորված և որ ավտոբուսին է միացված։

Միջուկը նաև տրամադրում է ընդհանուր նշանակության արձանագրության դրայվեր, որը կոչվում է spidev՝ նիշերի սարքի միջերեսով: Այն թույլ է տալիս կիսադուպլեքս մուտք գործել SPI ստրուկ՝ օգտագործելով ստանդարտ համակարգային զանգեր read() և write(), սահմանել գործողության ռեժիմը և կատարել լրիվ դուպլեքս հաղորդակցություն ioctl() զանգերի միջոցով:

Այսպիսով, SPI սարքերի արձանագրության դրայվերները կարելի է բաժանել երկու տեսակի.

  • userspace վարորդներ, որոնք աշխատում են օգտագործողի տարածքում և սովորական ծրագրեր են ցանկացած լեզվով, որոնք աշխատում են SPI սարքի հետ՝ կարդալով/գրելով համապատասխան spidev նիշ սարքը:
  • դրայվերներ, որոնք աշխատում են միջուկի տարածքում և ինտերֆեյս են ապահովում userspace-ին սարքի ֆայլերի միջոցով /dev գրացուցակում կամ ատրիբուտների միջոցով սարքի գրացուցակում sysfs-ում:
SPI սարքերի բոլոր զանգերը հերթագրվում են Linux-ի կողմից: SPI արձանագրության դրայվերները բացահայտ կամ անուղղակիորեն գործում են հաղորդագրությունների վրա, որոնք ներկայացված են struct spi_message կառուցվածքով, որը բազմասեգմենտ SPI գործարք է:
struct spi_message (struct list_head փոխանցումներ; struct spi_device *spi; unsigned is_dma_mapped:1; void (*complete)(void *context); void *context; unsigned actual_length; int status; struct list_head queue; void *state; );
փոխանցումներ - գործարքի (փոխանցումներ) փոխանցված հատվածների կապակցված ցանկ.
spi - ցուցիչ դեպի spi սարքը, որում հաղորդագրությունը հերթագրված է.
is_dma_maped - եթե այս դրոշը ճշմարիտ է, ապա և՛ dma, և՛ պրոցեսորի վիրտուալ հասցեները տրամադրվում են յուրաքանչյուր ուղարկման բուֆերի համար;
ամբողջական - հետադարձ զանգ, որը կոչվում է գործարքի ավարտը ծանուցելու համար.
համատեքստը ամբողջական() հետ կանչի փաստարկն է;
actual_length-ը բայթերի ընդհանուր թիվն է, որոնք փոխանցվել են բոլոր հաջողված փոխանցումներում.
կարգավիճակ - 0 հաջողության դեպքում, կամ բացասական արժեք errno-ի սխալի դեպքում;

Tags:

  • Linux
  • սպի
  • սպիդև
  • ներդրված
  • միջուկի մոդուլ
Ավելացնել պիտակներ

Ներածություն

SPI (3-wire) հայտնի ինտերֆեյս է միկրոսխեմաների միջև սերիական տվյալների փոխանակման համար: SPI ինտերֆեյսը, I 2 C-ի հետ մեկտեղ, միկրոսխեմաների միացման ամենատարածված ինտերֆեյսներից է: Այն ի սկզբանե հորինվել է Motorola-ի կողմից և ներկայումս օգտագործվում է բազմաթիվ արտադրողների արտադրանքներում: Դրա անունը «Serial Peripheral Bus»-ի հապավումն է, որն արտացոլում է դրա նպատակը՝ արտաքին սարքերի միացման ավտոբուս։ SPI ավտոբուսը կազմակերպվում է վարպետ-ստրուկ հիմունքներով: Ավտոբուսի վարպետը սովորաբար միկրոկառավարիչ է, բայց այն կարող է լինել նաև ծրագրավորվող տրամաբանություն, DSP կարգավորիչ կամ ASIC: Վարպետին միացված ավտոբուս արտաքին սարքերձևավորել ստրուկների ավտոբուս: Նրանց դերը խաղում են տարբեր տեսակի միկրոսխեմաներ, ներառյալ. պահեստավորման սարքեր (EEPROM, Flash-memory, SRAM), իրական ժամանակի ժամացույց (RTC), ADC/DAC, թվային պոտենցիոմետրեր, մասնագիտացված կարգավորիչներ և այլն:

SPI ինտերֆեյսի հիմնական բաղադրիչը սովորական հերթափոխային ռեգիստրն է, որի համաժամացման և բիթ հոսքի մուտքային/ելքային ազդանշանները կազմում են միջերեսի ազդանշանները: Այսպիսով, SPI արձանագրությունն ավելի ճիշտ կոչվում է ոչ թե տվյալների փոխանցման արձանագրություն, այլ տվյալների փոխանակման արձանագրություն երկու հերթափոխ ռեգիստրների միջև, որոնցից յուրաքանչյուրը միաժամանակ կատարում է և՛ ստացողի, և՛ հաղորդիչի գործառույթը: SPI ավտոբուսի վրա տվյալների փոխանցման անփոխարինելի պայմանը ավտոբուսի ժամացույցի ազդանշանի ստեղծումն է: Այս ազդանշանն իրավունք ունի գեներացնել միայն հիմնական ավտոբուսը, և ստրուկ ավտոբուսի շահագործումն ամբողջությամբ կախված է այս ազդանշանից:

Էլեկտրական միացում

SPI ավտոբուսի հետ կապի երեք տեսակ կա, որոնցից յուրաքանչյուրը ներառում է չորս ազդանշան (տե՛ս Աղյուսակ 1-ը դրանց հիմնական և այլընտրանքային նշանակումների համար): Ամենապարզ միացումը, որը ներառում է ընդամենը երկու չիպ, ներկայացված է Նկար 1-ում: Այստեղ ավտոբուսի վարպետը փոխանցում է տվյալներ MOSI գծի վրա՝ իր կողմից գեներացված SCLK ազդանշանի հետ համաժամանակյա, և ստրուկը գրավում է փոխանցված տվյալների բիթերը որոշակի եզրերի վրա: ստացել է ժամացույցի ազդանշան: Միևնույն ժամանակ, ստրուկը ուղարկում է իր տվյալների փաթեթը: Ներկայացված սխեման կարող է պարզեցվել՝ բաց թողնելով MISO գիծը, եթե օգտագործված ստրուկ IC-ը չի նախատեսում կամ չի պահանջվում հետ ուղարկել տվյալները: Տվյալների միակողմանի փոխանցումը կարելի է գտնել այնպիսի միկրոսխեմաներում, ինչպիսիք են DAC-ները, թվային պոտենցիոմետրերը, ծրագրավորվող ուժեղացուցիչները և դրայվերները: Այսպիսով, ստրուկ IC-ի միացման դիտարկված տարբերակը պահանջում է 3 կամ 4 հաղորդակցման գիծ: Որպեսզի ստրուկ IC-ն ստանա և փոխանցի տվյալներ, բացի ժամացույցի ազդանշանի առկայությունից, անհրաժեշտ է նաև, որ SS գիծը վարվի ցածր: Հակառակ դեպքում, ստրուկ IC-ն անգործուն կլինի: Երբ օգտագործվում է միայն մեկ արտաքին IC, կարող է գայթակղիչ լինել բացառել SS գիծը նաև՝ կոշտ դնելով slave IC-ի ընտրված մուտքը ցածր: Նման լուծումը խիստ անցանկալի է և կարող է հանգեցնել ձախողումների կամ նույնիսկ տվյալների փոխանցման անհնարինության, քանի որ. չիպի ընտրության մուտքագրումն օգտագործվում է IC-ն իր վրա փոխանցելու համար սկզբնական վիճակև երբեմն սկսում է տվյալների առաջին բիտի ելքը:


Բրինձ. 1. Ամենապարզ միացումը SPI ավտոբուսին

Եթե ​​անհրաժեշտ է մի քանի միկրոսխեմաներ միացնել SPI ավտոբուսին, ապա օգտագործվում է կամ անկախ (զուգահեռ) միացում (նկ. 2), կամ կասկադ (սերիական) միացում (նկ. 3): Անկախ կապավելի տարածված, քանի որ ձեռք է բերվել SPI-ի հետ համատեղելի ցանկացած չիպերի միջոցով: Այստեղ բոլոր ազդանշանները, բացառությամբ չիպսերի ընտրության, միացված են զուգահեռ, և ավտոբուսի վարպետը, այս կամ այն ​​SS ազդանշանը ցածր վիճակի տեղափոխելով, սահմանում է, թե որ ստրուկ IC-ի հետ կփոխանակի տվյալներ։ Նման կապի հիմնական թերությունը անհրաժեշտությունն է լրացուցիչ գծերստրուկ միկրոսխեմաների հասցեավորման համար (հաղորդակցման գծերի ընդհանուր թիվը 3+n է, որտեղ n-ը ստրուկ միկրոսխեմաների թիվն է): Կասկադը զերծ է այս թերությունից, քանի որ այստեղ մի մեծ հերթափոխի ռեգիստր է ձևավորվում մի քանի միկրոսխեմաներից: Դա անելու համար մեկ IC-ի փոխանցման տվյալների ելքը միացված է մյուսի ստացման տվյալների մուտքագրմանը, ինչպես ցույց է տրված Նկար 3-ում: Չիպային ընտրության մուտքերը միացված են այստեղ զուգահեռ, և այդպիսով կապի գծերի ընդհանուր թիվը պահվում է 4-ի վրա: Այնուամենայնիվ, կասկադը հնարավոր է միայն այն դեպքում, եթե դրա աջակցությունը նշված է օգտագործված չիպերի փաստաթղթերում: Պարզելու համար անհրաժեշտ է իմանալ, որ նման կապը անգլերենում կոչվում է «daisy-chaining»:


Բրինձ. 2. Անկախ միացում SPI ավտոբուսին


Բրինձ. 3. Կասկադ դեպի SPI ավտոբուս

Փոխանցման արձանագրություն

SPI փոխանցման արձանագրությունը չափազանց պարզ է և, ըստ էության, նույնական է հերթափոխի ռեգիստրի տրամաբանությանը, որը բաղկացած է հերթափոխի գործողություն կատարելուց և, համապատասխանաբար, համաժամացման ազդանշանի որոշակի եզրերի վրա տվյալների մուտքագրում և ելքից բիթ առ բիթ: . Տվյալների հավաքածուն փոխանցման և ստացման ժամանակ միշտ կատարվում է ժամացույցի հակառակ եզրերի վրա: Սա անհրաժեշտ է ապահովելու համար, որ տվյալները վերականգնվեն այն արժանահավատորեն հաստատվելուց հետո: Եթե ​​հաշվի առնենք, որ բարձրացող կամ իջնող եզրը կարող է հանդես գալ որպես փոխանցման ցիկլի առաջին եզր, ապա SPI ինտերֆեյսի տրամաբանության չորս հնարավոր տարբերակ կա։ Այս տարբերակները կոչվում են SPI ռեժիմներ և նկարագրվում են երկու պարամետրով.

  • CPOL - համաժամացման ազդանշանի սկզբնական մակարդակը (եթե CPOL=0, ապա համաժամացման գիծը փոխանցման ցիկլի մեկնարկից առաջ և դրա ավարտից հետո ունի ցածր մակարդակ (այսինքն՝ առաջին եզրը բարձրանում է, իսկ վերջին եզրը՝ ընկնում), հակառակ դեպքում, եթե CPOL=1, - բարձր (այսինքն՝ առաջին ճակատն ընկնում է, իսկ վերջինը՝ բարձրանում));
  • CPHA - համաժամացման փուլ; այս պարամետրը որոշում է այն հաջորդականությունը, որով տվյալները տեղադրվում և առբերվում են (եթե CPHA=0, ապա տվյալների նմուշառումը կկատարվի համաժամացման ցիկլի բարձրացող եզրին, այնուհետև՝ ընկնող եզրին, տվյալները կսահմանվեն, եթե CPHA= 1, այնուհետև պարամետրերի տվյալները կվերցվեն ժամացույցի ցիկլի բարձրացող եզրին և նմուշառվեն անկման եզրին): SPI ռեժիմների մասին տեղեկատվությունը ամփոփված է Աղյուսակ 2-ում:

SPI-ի տարբեր ռեժիմներում գործող հիմնական և ստրուկ չիպերը համատեղելի չեն, ուստի կարևոր է հստակեցնել, թե որ ռեժիմներն են ապահովվում ավտոբուսի վարպետի կողմից՝ նախքան ստրուկ չիպեր ընտրելը: SPI ապարատային մոդուլները, որոնք ինտեգրված են միկրոկոնտրոլերների մեջ, շատ դեպքերում աջակցում են ցանկացած SPI ռեժիմ ընտրելու կարողությանը, և, հետևաբար, ցանկացած SPI ստրուկ միկրոսխեման կարող է միացված լինել դրանց (կիրառվում է միայն անկախ կապի տարբերակի դեպքում): Բացի այդ, SPI արձանագրությունը ցանկացած ռեժիմում հեշտությամբ իրականացվում է ծրագրային ապահովման մեջ:

Համեմատություն I 2 C ավտոբուսի հետ

Ինչպես արդեն նշվեց, 2-լարային I 2 C սերիական ավտոբուսը ոչ պակաս տարածված է միկրոսխեմաների միացման համար: Ստորև կարող եք տեսնել, թե ինչ առավելություններ է տալիս այս կամ այն ​​սերիական ավտոբուսը.

SPI ավտոբուսի առավելությունները I2C ավտոբուսի առավելությունները
Ֆիզիկական շերտում փոխանցման արձանագրության ծայրահեղ պարզությունը որոշում է փոխանցման բարձր հուսալիությունը և արագությունը: SPI ավտոբուսի արագության սահմանաչափը չափվում է տասնյակ մեգահերցով և, հետևաբար, իդեալական է տվյալների մեծ հոսքի համար և լայնորեն օգտագործվում է բարձր արագությամբ DAC/ADC, LED էկրանի դրայվերներում և հիշողության չիպերում: I 2 C ավտոբուսը մնում է երկլարային՝ անկախ դրան միացված չիպերի քանակից։
SPI-ի բոլոր ավտոբուսային գծերը միակողմանի են, ինչը մեծապես հեշտացնում է մակարդակի փոխակերպման և միկրոսխեմաների գալվանական մեկուսացման խնդիրը Multi-master շահագործման հնարավորությունը, երբ մի քանի հիմնական միկրոսխեմաներ միացված են ավտոբուսին:
SPI արձանագրության ծրագրային ապահովման իրականացման հեշտությունը: I2C արձանագրությունն ավելի ստանդարտացված է, հետևաբար, I2C չիպերի օգտագործողն ավելի պաշտպանված է ընտրված բաղադրիչների անհամատեղելիության խնդիրներից:

Ստացված և համատեղելի արձանագրություններ

  • ՄԻԿՐՈՎԱՌ.

    National Semiconductor-ի MICROWIRE արձանագրությունը նույնական է SPI արձանագրությանը 0 ռեժիմում (CPOL = 0, CPHA = 0):

  • Maxim 3-լարային ինտերֆեյս

    Այս ինտերֆեյսի տարբերությունն այն է, որ երկու միակողմանի գծերի վրա լրիվ դուպլեքս փոխանցման փոխարեն, այն կատարում է կիսադյուպլեքս փոխանցում մեկ երկկողմանի DQ գծով:

  • QSPI

    SPI-ից ավելի բարձր մակարդակի արձանագրություն, որը թույլ է տալիս տվյալների ավտոմատ փոխանցում՝ առանց պրոցեսորի ներգրավման:

Բացի այդ, SPI ինտերֆեյսը հիմք է հանդիսանում մի շարք մասնագիտացված ինտերֆեյսների կառուցման համար, ներառյալ. JTAG վրիպազերծման ինտերֆեյս և ֆլեշ հիշողության քարտի միջերեսներ, ներառյալ. SD և MMC:

Ներդիր 1. SPI ավտոբուսի էլեկտրական ազդանշաններ

Առաջատար անվադողեր ստրուկ ավտոբուս
Հիմնական նշանակում Այլընտրանքային նշում Նկարագրություն Հիմնական նշանակում Այլընտրանքային նշում Նկարագրություն
ՄՈՍԻ ԱՐԵԼ, ՍԴՈ, ԴԱՈՒԹ ՄՈՍԻ DI, SDI, DIN
MISO DI, SDI, DIN Սերիական մուտքագրում MISO ԱՐԵԼ, ՍԴՈ, ԴԱՈՒԹ Սերիական ելք
SCLK DCLOCK, CLK, SCK Տվյալների փոխանցման համաժամացման ելք SCLK DCLOCK, CLK, SCK Ստացեք համաժամացման մուտքագրում
ՍՍ CS Ստրկական ընտրության ելք (չիպի ընտրություն) ՍՍ CS Ստրկական ընտրության մուտքագրում (չիպի ընտրություն)

SPI(Սերիական ծայրամասային ավտոբուս) - սերիական ծայրամասային փոխանակման արձանագրություն: Այս պունկցիան մշակվել է ընկերության կողմից Motorola, բայց ներկայումս օգտագործվում է բազմաթիվ արտադրողների կողմից: Այն նախագծված է միկրոկոնտրոլերները միմյանց հետ հաղորդակցվելու համար, ինչպես նաև բոլոր տեսակի ծայրամասային սարքերի հետ՝ սենսորներ, ADC-ներ, հիշողության չիպեր, ժամացույցներ: Այնուամենայնիվ, ամենատարածված օգտագործումը SPIմիկրոկոնտրոլերի հիշողության մեջ գրված ծրագիր է։ Միկրոկարգավորիչներում AVRօգնությամբ SPIդուք կարող եք թարթել միկրոկոնտրոլերը առանց այն տախտակից զոդելու, որոնվածի այս մեթոդը կոչվում է ISP (համակարգային ծրագրավորման մեջ). Չնայած անունները SPIԵվ ISPշատ համահունչ, դա նույն բանը չէ, ներս AVR SPIօգտագործվում է որպես ֆիզիկական շերտ ISP, այսինքն՝ օգտագործվում են տողերը SPIտվյալների փոխանցման համար, բայց ինքնին արձանագրությունը (ծրագրային շերտը) տարբեր է:

SPI-ին տվյալները փոխանցելու համար օգտագործվում են երեք տող.

MISO (Master Input Slave Output)- այս տողում Վարպետը (վարպետը) տվյալներ է ստանում ստրուկից (ստրուկից):

MOSI (Master Output Slave Input)– այս տողում Master-ը տվյալներ է ուղարկում Slave-ին:

SCK (Սերիական ժամացույց)- ծառայում է ժամացույցի ազդանշան փոխանցելու ստրուկ սարքին:

Գիծը նույնպես օգտագործվում է SS (Slave Select), որը նշում է սարքը, որի հետ Վարպետկփոխանակեն տվյալներ։

Շնորհիվ այն բանի, որ շատ արտադրողներ օգտագործում են SPI իրենց սարքերում, կապումների անունները կարող են մի փոքր տարբերվել: Ստորև ներկայացված է այլընտրանքային անուններով աղյուսակ:


SPI-ն գալիս է երկու ձևով՝ ապարատային և ծրագրային: Ծրագրային ապահովման ներդրման ժամանակ SPI, մենք պետք է ձեռքով սահմանենք ազդանշանը համապատասխանի ոտքերի վրա MISO, MOSI, SSձգվելիս SCK. Սարքավորումների ներդրմամբ SPIմենք տվյալները փոխանցում ենք հատուկ ռեգիստր, և միկրոկառավարիչը ինքն է կատարում վերը նշված մանիպուլյացիաները՝ ըստ նախնական պարամետրերի:

Ֆիզիկական իրականացում SPI, երկու հերթափոխ ռեգիստրներ են՝ միացված միասին:


Կախված նրանից, թե ազդանշանի որ տրամաբանական մակարդակը SCK, տեղի է ունենում համաժամացում ՎարպետԵվ ստրուկիսկ թե որ ճակատում են տվյալները գրավում և տեղափոխվում, հնարավոր է 4 ռեժիմ SPI.

  • CPOL = 0 - համաժամացման ազդանշանը սկսվում է ցածր մակարդակից.
  • CPOL = 1 - համաժամացման ազդանշանը սկսվում է բարձր մակարդակից.
  • CPHA = 0 - տվյալները նմուշառվում են համաժամացման ազդանշանի բարձրացող եզրին.
  • CPHA = 1 - տվյալները նմուշառվում են համաժամացման ազդանշանի անկման եզրին:
Ստորև բերված օսցիլոգրամները ցույց են տալիս, թե ինչ տեսք ունի 0x17 փաթեթը տարբեր ռեժիմներում:
CPOL=0 CPHA=0


CPOL = 1 CPHA = 0


CPOL = 0 CPHA = 1


CPOL=1 CPHA=1

SPI- համաժամանակյա ինտերֆեյս, այսինքն՝ որոշակի տվյալներ ստանալու համար ստրուկ, Վարպետպետք է ինչ-որ բան ուղարկի: Թվում է, թե ամեն ինչ պարզ է, բայց եթե Վարպետուղարկում է մեկ բայթ, և ստրուկՊե՞տք է նրան երկուսը վերադարձնել: Այս դեպքում Վարպետը պետք է նրան ինչ-որ բան ուղարկի 2 անգամ, օրինակ 0x00։
//ուղարկեք հրամանը, ի պատասխան պետք է գա երկու բայթ Spi_Master_Transmit(chx); // ուղարկել ինչ-որ բան առաջին բայթը ստանալու համար Spi_Master_Transmit(0X00); touch_x = SPDR; touch_x<<= 8; //отправляем что-нибудь для того чтобы принять второй байт Spi_Master_Transmit(0X00); touch_x |= SPDR; touch_x >>= 3;
Այսքանը, վերևում ներկայացված է աշխատանքային նախագծից վերցված ծածկագրի օրինակ:

SPI համաժամանակյա սերիական ինտերֆեյսը նախատեսված է մեկ հիմնական (SPI-master) և մեկ slave (SPI-slave) սարքի հետ կետ առ կետ ինտերֆեյսներում տվյալների մուտքագրման և ելքի համար (նկ. 1.24): SPI-գլխավոր կառավարման սխեման առաջացնում է SCK ժամացույցը, որը միաժամանակ ազդանշաններ է փոխանցում MOSI ելքի վրա և ազդանշաններ է ստանում MISO մուտքի մոտ: Նույն ժամացույցը իմպուլսացնում է SCK-ը, մտնելով SPI ստրուկ, վերահսկում է ազդանշանների ընդունումը իր MOSI մուտքի մոտ և ազդանշանների ձևավորումն իր MISO ելքում: Առանձին MOSI և MISO ազդանշանային սխեմաները հեշտացնում են լրիվ դուպլեքս հաղորդակցությունների իրականացումը:

Տվյալների ձևաչափեր, ազդանշանի պարամետրեր, ժամանակացույց և այլն: ինտերֆեյսում չեն կարգավորվում, օրինակ, տվյալների փոխանակման փոխարժեքը որոշվում է միայն SPI-ի վարպետի կողմից ստեղծված SCK ժամացույցի իմպուլսների հաճախականությամբ: Առավելագույն հեռավորությունը կախված է կապի գծերում ազդանշանի աղավաղման մակարդակից, ենթադրվում է, որ տվյալների հուսալի փոխանակումը հնարավոր է մինչև մի քանի մետր հեռավորության վրա:

Ըստ էության, դա լիարժեք ինտերֆեյս չէ նույնիսկ ֆիզիկական շերտի համար։ Փաստորեն, SPI-ն իրականացնում է տվյալների մուտքագրման-ելքի ստանդարտ ընթացակարգ հերթափոխային ռեգիստրներում, գործողության վերահսկման ալգորիթմներ չկան, փոխանցված տվյալների վերահսկումն ապահովված է: Բոլոր անհրաժեշտ հսկողության ընթացակարգերը պետք է իրականացվեն SPI-վարպետի կողմից: Սա մի կողմից պահանջում է լրացուցիչ միջոցներվերահսկողություն, իսկ մյուս կողմից՝ այն պարզեցնում է ինքնին SPI ինտերֆեյսի իրականացման միջոցները։ SPI ստրուկը ստանդարտ հերթափոխային ռեգիստր է՝ անհրաժեշտ քանակությամբ տվյալների բիթերով:

Օրինակ, ATMEL-ի AVR ընտանիքի միկրոկոնտրոլերները աջակցում են I/O տվյալները ինչպես SPI-master, այնպես էլ SPI-slave ռեժիմներում: Ստանդարտ փոխանակման ցիկլը ներառում է տվյալների մեկ բայթի միաժամանակյա փոխանցում երկու ուղղություններով (նկ. 1.24): Բազմաբայթ հաղորդագրություններ փոխանցելիս SPI-slave-ը պետք է պարունակի համապատասխան բիթային խորության հերթափոխ ռեգիստր, իսկ SPI-master-ը պետք է վերահսկի տվյալների բայթերի պահանջվող հաջորդականության փոխանակումը, յուրաքանչյուր բայթ մշակելով հաջորդ ստանդարտ ինտերֆեյսի գործառնական ցիկլից հետո և ապահովելով. հաջորդ ստանդարտ փոխանակման ցիկլի մեկնարկը:

օգտագործվում է ոչ միայն միկրոկոնտրոլերների միջև տվյալների փոխանակման համար, այլ նաև արտաքին ADC-ների (ADC) և DAC-ների (DAC), հիշողության չիպերի` SRAM, FRAM, SEERAM և շատ այլ սարքերի հետ միկրոկառավարիչների միջերեսի համար: Սերիական տվյալների ձևաչափի և SPI ինտերֆեյսի պարզ տրամաբանական կազմակերպման շնորհիվ այս միկրոսխեմաները արտադրվում են կոմպակտ 8-16 փին փաթեթներով: Աղյուսակում. 1.6-ը ցույց է տալիս միկրոսխեմաների օրինակներ տարբեր ֆունկցիոնալ նպատակներով և տարբեր արտադրողներից SPI ինտերֆեյսով: Այս օրինակները ցույց են տալիս, որ սերիական ինտերֆեյսի ձևաչափը կարող է զգալիորեն նվազեցնել պահանջվող I/O գծերի քանակը:

Աղյուսակ 1.6

Չիպի տեսակը

Հիմնական կարգավորումներ

Կեղևի տեսակը

Արտադրող

24-բիթ, Delta-Sigma, 15 Հց

24 բիթ, Delta-Sigma, 41 կՀց

16-բիթ, SAR, 100 կՀց

16 բիթ, PulSAR, 500 կՀց

12 բիթ, U-ելք, 2,5 մկվ

16-bit, U-out, 10 µs

14-bit, I-out, 0.04 µs

12-bit, I-out, 0.6 μs

16-bit, U-out, 1 µs

www.maximic.com

Չիպի տեսակը

Հիմնական կարգավորումներ

Կեղևի տեսակը

Արտադրող

16 կբիթ/վրկ, 1 տրլն

4 կբիտ, անսահմանափակ

64 kbps, անսահմանափակ

256K, 32768×8, 0.1M ցիկլեր

8K, 1024×8, 0,1M ցիկլեր

16K, 8192×8, 0.1M ցիկլեր

128K, 16384×8, 0.1M ցիկլեր

256K, 32768×8, 0.1M ցիկլեր

Թերմոսենսոր

13 բիթ, -40-ից +150 C o (±0,5C o)

Խնդիրներից մեկը, որը հաճախ պետք է լուծվի ավտոմատացման գործիքներում, կապված է միկրոկառավարիչների I/O գծերի սահմանափակ քանակի հետ: Սովորաբար, փոխանցվող ազդանշանների թիվը զգալիորեն գերազանցում է զուգահեռ նավահանգիստների հնարավորությունները, սակայն փոխանցվող ազդանշանների մեծ մասի մշակման ալգորիթմները թույլ են տալիս լրացուցիչ ժամանակային ուշացումներ՝ կապված սերիական ձևաչափով դրանց փոխանցման հետ: Այս դեպքերում արդյունավետ է ստանդարտ շարքի զուգահեռ ռեգիստրների օգտագործումը:

Օրինակ, SPI ինտերֆեյսը կարող է օգտակար լինել մեծ թվով միացման/անջատման սենսորների կարգավիճակի տեղեկատվությունը կարդալու կամ զուգահեռ ձևաչափով բազմաբիթ տվյալների մուտքագրման համար: Այս նպատակների համար հարմար է օգտագործել առանձին ռեգիստրներ զուգահեռ գրությամբ և սերիական ընթերցմամբ (8-bit Parallel-In / Serial-Out Shift Register), օրինակ CD74HCT166 (նկ. 1.25):

Միկրոկարգավորիչի SPI ինտերֆեյսի միջոցով տասնվեց միացման սենսորների (S1 - S16) միացման սխեման ներկայացված է նկ. 1.26. Հարկ է նշել, որ նախքան SPI ինտերֆեյսի շահագործումը սկսելը, անհրաժեշտ է ազդանշան ստեղծել՝ D0-D7 զուգահեռ մուտքերից ռեգիստրներին տեղեկատվություն գրելու համար։ Դրա համար կարող եք օգտագործել միկրոկոնտրոլերի ելքերից մեկը՝ in այս օրինակը PC0.

Բրինձ. 1.25. Ֆունկցիոնալ դիագրամգրանցել CD74HCT166

Բրինձ. 1.26. Միացման/անջատման սենսորների միացում SPI ինտերֆեյսին

Բրինձ. 1.27. Վեցանիշ ցուցիչի միացում SPI ինտերֆեյսին

Օգտագործելով ռեգիստրներ սերիական ձայնագրմամբ և տեղեկատվության զուգահեռ ելքով (8-bit Serial-In, Parallel-Out Shift Register) - SN74HC595, SPI ինտերֆեյսը կարող է օգտագործվել նաև տեղեկատվության մի քանի բայթ զուգահեռ ելքի համար: Որպես օրինակ, նկ. 1.27-ը ցույց է տալիս միկրոկառավարիչին վեցանիշ յոթ հատվածի ցուցիչի միացման դիագրամը: Ի տարբերություն նախորդ սխեմայի, զուգահեռ ելքային ազդանշանը (PB1) պետք է գեներացվի SPI ինտերֆեյսի կողմից տվյալների փոխանցման ավարտից հետո միջերեսից դուրս միջոցներով: Օրինակ, ինտերֆեյսի հետ փոխազդելու ալգորիթմը պետք է նախատեսի փոխանցված տվյալների բայթերի քանակի վերահսկում, իսկ վերջին բայթի փոխանցումն ավարտելուց հետո անհրաժեշտ է լրացուցիչ փոխանցել զուգահեռ ելքային ազդանշան: