You are on page 1of 9

Utilisation du SPI sur le PIC 16F876

Claude Barbaud 14 septembre 2010


Principe du SPI:
Le port syn!rone SPI "Serial Perip!eral Inter#ae$ est un port s%rie syn!rone& Il permet
de ommuni'uer sur ( #ils a)e un ertain nombre de p%rip!%ri'ues& La syn!ronisation
est assur%e par le proesseur& Les arat%risti'ues essentielles sont*
rapidit% "on peut #ontionner + #os,4& #os - osillation d.entr%e du PIC/ soit 20
012 pour le PIC2(2& 3n a don une #r%'uene ma4imale de 5 012&
robustesse" peu sensible au4 inter#%renes$
peu de #ils ou de traes + router&
Il y a deu4 modes de #ontionnement SPI*
0aster mode* l6appareil ontr7le l6!orlo8e
Sla)e mode* l6appareil re9oit une !orlo8e e4terne
Les bro!es utilis%es sont*
Serial :ata 3ut* S:3,;C5
Serial :ata In* S:I,;C4
Serial Clo<* SC=,;C(
Une 4
>me
bro!e peut ?tre utilis%e omme C!ip Selet en mode Sla)e*
Sla)e selet @SS,;A5&
Le PIC maBtre peut !oisir un PIC esla)e par ette bro!e& Si on n.utilise 'u.un
seul PIC esla)e/ on peut la plaer + CD: ou la d%sati)er par lo8iiel en pla9ant
SPIESSE:ISABLF: en param>tre de la #ontion setupEspi"$&
Fontionnement*
Fn mode 0aster/ le PIC ontr7le le SC=&
Une %riture GspiEHrite"$I du Pi master pro)o'ue 8 impulsions sur SC= et l6en)oi
de la donn%e sur S:3
La #ontion spiEdataEisEin"$ permet de sa)oir si une donn%e est re9ue&
Une leture GspiEread"$I du Pi sla)e n6est termin%e 'ue 'uand les 8 impulsions
sur le SC= sont termin%es&
Initialisation:
Pour initialiser le SPI/ on doit plaer un ertain nombre de bits& Pour l6essentiel/ es bits
se trou)ent dans le re8istre SSPC3D/ + l6adresse 0414& Ils sont manipul%s par la
#ontion setupEspi"$& Les autres bits/ + l6adresse 04J4 Gpour le PIC 16F876I sont
manipul%s indi)iduellement "C=F et S0P$
setup_spi(SPI_MASTER | SPI_CLK_DIV_4 | SPI_L_TO_H);
les param>tres*
SPI sur le PIC16F876 Page 1
SPIE0ASKF; ou SPIESLALF ou SPIESSE:ISABLF:
SPIE0ASKF;* le PIC est le maBtre du protoole SPI
SPIESLALF* le PIC est l6esla)e du protoole
SPIESSE:ISABLF:* Bro!e @SS d%sati)%e
SPIELEK3E1 ou SPIE1EK3EL
:%termine l6%tat du bit C=P "Clo< polarity$
SPIELEK3E1 * C=P - 0 * d%but sur un #ront montant "repos - 0$
SPIE1EK3EL * C=P - 1 * d%but sur un #ront desendant "repos - 1$
Loir la #i8ure iMdessous&
SPIECL=E:ILE4 ou SPIECL=E:ILE16 ou SPIECL=E:ILE64
:i)ision de l6osillation du PIC "20 012$
CKE = TRUE; // C!"# E$%e
// CKE = TRUE& T'()s*issi!) $e ( $!))+e su' u) ,'!)t
// *!)t()t $u "!"# (SCK)-
// Si !) p("e CKE = ./ ( t'()s*issi!) se ,(it su' u)
// ,'!)t $es"e)$()t
SMP = 0ALSE; // 1"2()ti!)(%e $e 3e)t'+e (u "e)t'e $3u) "'+)e(u
// si !) p("e SMP = TRUE/ 3+"2()ti!)(%e se ,(it
// su' ( ,i)
Communication:
Du ct du PIC
Nriture sur la bro!e S:3 du PIC "- ;C5$
spi_4'ite(5(eu') // 5(eu' 6 7 8its
Leture sur la bro!e S:I du PIC "-;C4$
5(eu' = spi_'e($()
5(eu' = spi_'e($(.) %+)9'e e C!"# su' SCK
SPI sur le PIC16F876 Page 2
Ntat du re8istre de r%eption
I, (spi_$(t(_is_i)()) :;<
Exemple: criture sur master, lecture sur slave
Branchement :
PIC master PIC sla)e LC: 3ptre4 2J481
S:3MC5 S:IMC4
SC=MC( SC=MSC=MC(
A4 ;S Gpin 4I
A5 F GPin 6I O pullMup 1<P
B0 Q B7 :0 GPin 7I M :7GPin 14I
Programme denvoi de donnes(PIC master)
// C(u$e =('8(u$ .> !"t!8'e ?..@ CCSAC
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
// B_MASTER-C
//
// Utiis(ti!) $u *!$e SPI
// Le p'!%'(**e e)5!ie $es $!))ees (u p!'t SPI
//
// ='()"2e*e)t $es PICs&
// SPI_MASTER | SPI_SLAVE
// AAAAAAAAAAAAACAAAAAAAAAAAA
// SDO | SDI
// SCLK | SCLK
//
//
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Di)"u$e EF>07G>-HE
D,uses HS/HOBDT/PUT/HOPROTECT
Duse $e(I("!"#=?.......)
Duse RS?J?(=(u$=FK?../L*it=PIH_C>/R"5=PIH_CG)
D8it CKE = .MK4-> // SPI C!"# e$%e see"t
// CKE = F& ( $!))ee est t'()s*ise su' u) ,'!)t
*!)t()t $e SCK
// CKE = .& su' u) ,'!)t $es"e)$()t $e
SCK
//AAAAAAAAAAAAAAAAAAAA P'!%'(**e p'i)"ip( AAAAAAAAAAAAAAAAAAAAAAAA
5!i$ *(i)(5!i$)
:
i)t i;
setup_spi(SPI_MASTER | SPI_CLK_DIV_4 | SPI_L_TO_H); // "# (u 'ep!s
( .
CKE = TRUE; // T'()s*issi!) $e ( $!))ee su' u) ,'!)t *!)t()t
,!'(;;)
,!'(i = 3A3; i N= 3O3; i)
:
spi_4'ite(i); // $!))ee su' SPI
SPI sur le PIC16F876 Page 3
$e(I_*s(@..);
<
<
Programme de rception de donnes(PIC slave)
//C(u$e =('8(u$ .> !"t!8'e ?..@ CCSAC
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
// R_SLAVE-C //
// Ce p'!%'(**e 'e"!it es $!))ees su s!) p!'t spi et es //
// (,,i"2e su' e LCD Opt'eM //
// DMC?.4J4 !u DMC?.47F //
// //
// C!))eMi!)s& Re%iste' see"t& PIC_A4 AAP LCD_4 //
// E)(8e& PIC_A@ AAP LCD_> //
// D!))ees& PIC_=.--PIC_=G AAP LCD_G--LCD_F4 //
// Re"epti!) SPI& SDIAC4 AAP PIC_*(ste' SDOAC@ //
// C!"# SPI& SCKACJ AAP PIC_*(ste' SCKACJ //
// //
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
Di)"u$e NF>07G>-HP
D,uses HS/HOBDT/PUT/HOPROTECT/HOLVP
Duse $e(I("!"#=?.......)
Duse RS?J?(=(u$=FK?../L*it=PIH_C>/R"5=PIH_CG/ 8its=7/ e''!'s)
Duse st()$('$_i!(=)
D$e,i)e RS PIH_A4 // Re%iste' see"t
D$e,i)e E PIH_A@ // E)(8e
D$e,i)e ALL_OUT . // $e,i)iti!) $es 8'!"2es e) s!'tie
D8Ite p!'t_8 = > // A$'esse $u p!'t = = .>2
D8it SMP = .MK4-G // S(*pe 8it
// SMP = F& e"2()ti!)(%e $e SDI ( ( ,i)
// SMP = .& e"2()ti!)(%e $e SDI (u *iieu
//AAAAAAAAAAAAAAP!t!tIpes $es ,!)"ti!)sAAAAAAAAAAAAAAAAA//
5!i$ i*pusi!)(5!i$);
5!i$ i)iti(ise(5!i$);
5!i$ p!s_"u'(i)t p!se);
5!i$ e"'it("2(' (s"ii);
5!i$ e)"2(i)e("2(' "2(i)eQ?.R);
"2(' (uteu'Q?.R = :3C3/33/3(3/3u3/3$3/3e3/3
3/3=3/3(3/3'3/383/3(3/3u3/3$3/.M.4<;
"2(' 'e"uQ?.R = :3R3/3e3/3"3/3u3/3 3/3=3/3 3/.M.4<;
5!i$ *(i)(5!i$)
:
"2(' i;
setup_spi(SPI_SLAVE | SPI_L_TO_H | SPI_SS_DISA=LED);
// ='!"2e SSS $es("ti5ee (i)$ispe)s(8e)
SMP = 0ALSE; // e"2()ti!)(%e $e 3e)t'ee (u "e)t'e $3u) "'e)e(u
i)iti(ise();
p!s_"u'(.M7.); // p'e*ie'e i%)e
SPI sur le PIC16F876 Page 4
e)"2(i)e((uteu');
p!s_"u'(.MC.); // $euMie*e i%)e
e)"2(i)e('e"u);
,!'(;;)
:
i,(spi_$(t(_is_i)())
:
i = spi_'e($();
p!s_"u'(.MCG);
e"'it (i);
<

<
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ i*pusi!)(5!i$)
:
!utput_!4(E);
$e(I_*s(@);
!utput_2i%2(E);
$e(I_*s(@);
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ i)iti(ise(5!i$)
:
"2(' i)itQ@R = :.MJ7/ .M.7/ .M.F/ .M.C/ .M.><;
i)t "!u)t;
set_t'is_8(ALL_OUT); // Les 7 8'!"2es $u p!'t = e) s!'tie
!utput_!4(RS); // *!$e "!**()$e
,!' ("!u)t = .; "!u)t N @; "!u)tCC)
:
p!'t_8 = i)itQ"!u)tR; // "!$e $e "!)t'!e
i*pusi!)(); // C i*pusi!) su' E
<
!utput_2i%2(RS); // *!$e $(t(
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ p!s_"u'(i)t p!se)
// P("e e "u'seu' ( ( p!siti!) spe"i,iee su' e LCD
:
!utput_!4(RS); // *!$e "!**()$e
p!'t_8 = p!se ; // ( p!siti!)
i*pusi!)(); // C i*pusi!) su' E
!utput_2i%2(RS); // *!$e $(t(
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ e"'it("2(' (s"ii)
// E"'it e "('("te'e ASCII p(sse e) p('(*et'e/ ( ( p!siti!) $u "u'seu'
// Le "u'seu' se $ep("e ( ( p!siti!) sui5()te
:
p!'t_8 = (s"ii;
i*pusi!)();
SPI sur le PIC16F876 Page 5
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ e)"2(i)e("2(' "2(i)eQ?.R)
// E"'it ( "2(i)e $e "('("te'e p(ssee e) p('(*et'e/ ( ( p!siti!) $u
"u'seu'
:
i)t "!u)t;
"!u)t = .;
$!
:
e"'it("2(i)eQ"!u)tR);
"!u)tCC;
<
42ie("2(i)eQ"!u)tR T= .M.4);
<
Exemple: criture sur slave, lecture sur master
Branchement :
PIC master PIC sla)e LC: 3ptre4 2J481
S:3MC5 S:IMC4
SC=MC( SC=MSC=MC(
S:IMC4 S:3MC5
A4 ;S Gpin 4I
A5 F GPin 6I O pullMup 1<P
B0 Q B7 :0 GPin 7I M :7GPin 14I
Principe
Le Clo< est enore donn% par le PIC 0aster& Il est d%len!% par une %riture du 7t%
0aster&
:u 7t% du sla)e/ on aura beau %rire/ ette %riture ne sera r%alis% 'ue 'uand l6!orlo8e
sera pr%sente.(Il y a une attente)
C6est don le master 'ui ontr7le la ommuniation& Par une %riture sur le port SPI
"spiEHrite"0$ ou spiEread"0$$ il r%% un Clo< sur SC= 'ui est utilis% par le sla)e/ en
attente d6%riture "spiEHrite"i$R
Programme denvoi de donnes(PIC slave)
// C(u$e =('8(u$ .> !"t!8'e ?..@ CCSAC
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
// B_SLAVE-C
//
// Utiis(ti!) $u *!$e SPI
// Le p'!%'(**e e)5!ie $es $!))ees (u p!'t SPI
//
// ='()"2e*e)t $es PICs&
// SPI_MASTER | SPI_SLAVE
// AAAAAAAAAAAAACAAAAAAAAAAAAA
// SDO | SDI
SPI sur le PIC16F876 Page 6
// SCLK | SCLK
// SDI | SDO
//
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Di)"u$e EF>07G>-HE
D,uses HS/HOBDT/PUT/HOPROTECT
Duse $e(I("!"#=?.......)
Duse RS?J?(=(u$=FK?../L*it=PIH_C>/R"5=PIH_CG)
D8it SMP = .MK4-G
D8it CKE = .MK4->
//AAAAAAAAAAAAAAAAAAAA P'!%'(**e p'i)"ip( AAAAAAAAAAAAAAAAAAAAAAAA
5!i$ *(i)(5!i$)
:
i)t i;
setup_spi(SPI_SLAVE | SPI_L_TO_H | SPI_SS_DISA=LED);
// ='!"2e SSS $es("ti5ee (i)$ispe)s(8e)
SMP = 0ALSE; // e"2()ti!)(%e $e 3e)t'ee (u "e)t'e $3u) "'e)e(u
CKE = TRUE; // T'()s*issi!) $e ( $!))ee su' u) ,'!)t *!)t()t
,!'(;;)
,!'(i = 3A3; i N= 3O3; iCC)
:
spi_4'ite(i); // $!))ee su' SPI
<
<
Programme de rception de donnes (master)
//C(u$e =('8(u$ .> !"t!8'e ?..@ CCSAC
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
// R_MASTER-C //
// C(u$e =('8(u$ //
// Ce p'!%'(**e 'e"!it es $!))ees su' s!) p!'t spi et es //
// (,,i"2e su' e LCD Opt'eM //
// DMC?.4J4 !u DMC?.47F //
// //
// C!))eMi!)s& Re%iste' see"t& PIC_A4 AAP LCD_4 //
// E)(8e& PIC_A@ AAP LCD_> //
// D!))ees& PIC_=.--PIC_=G AAP LCD_G--LCD_F4 //
// Re"epti!) SPI& SDIAC4 AAP PIC_s(5e SDOAC@ //
// C!"# SPI& SCKACJ AAP PIC_s(5e SCKACJ //
// E*issi!) SPI SDOAC@ AAP PIC_s(5e SDIAC4
// //
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
Di)"u$e N"&Spi""SeM(*pesSF>07G>-HP
D,uses HS/HOBDT/PUT/HOPROTECT/HOLVP
Duse $e(I("!"#=?.......)
Duse RS?J?(=(u$=FK?../L*it=PIH_C>/R"5=PIH_CG/ 8its=7/ e''!'s)
Duse st()$('$_i!(=)
D$e,i)e RS PIH_A4 // Re%iste' see"t
D$e,i)e E PIH_A@ // E)(8e
D$e,i)e ALL_OUT . // $e,i)iti!) $es 8'!"2es e) s!'tie
D8Ite p!'t_8 = > // A$'esse $u p!'t = = .>2
SPI sur le PIC16F876 Page 7
D8it CKE = .MK4->
D8it SMP = .MK4-G
//AAAAAAAAAAAAAAP!t!tIpes $es ,!)"ti!)sAAAAAAAAAAAAAAAAA//
5!i$ i*pusi!)(5!i$);
5!i$ i)iti(ise(5!i$);
5!i$ p!s_"u'(i)t p!se);
5!i$ e"'it("2(' (s"ii);
5!i$ e)"2(i)e("2(' "2(i)eQ?.R);
"2(' (uteu'Q?.R = :3C3/33/3(3/3u3/3$3/3e3/3
3/3=3/3(3/3'3/383/3(3/3u3/3$3/.M.4<;
"2(' 'e"uQ?.R = :3R3/3e3/3"3/3u3/3 3/3=3/3 3/.M.4<;
5!i$ *(i)(5!i$)
:
"2(' i;
setup_spi(SPI_MASTER | SPI_CLK_DIV_4 | SPI_L_TO_H );
SMP = 0ALSE; // e"2()ti!)(%e $e 3e)t'ee (u "e)t'e $3u) "'e)e(u
CKE = TRUE; // T'()s*issi!) $e ( $!))ee su' u) ,'!)t *!)t()t
i)iti(ise();
p!s_"u'(.M7.); // p'e*ie'e i%)e
e)"2(i)e((uteu');
p!s_"u'(.MC.); // $euMie*e i%)e
e)"2(i)e('e"u);
,!'(;;)
:
i = spi_'e($(.);
p!s_"u'(.MCG);
e"'it (i);
$e(I_*s(@..);


<
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ i*pusi!)(5!i$)
:
!utput_!4(E);
$e(I_*s(@);
!utput_2i%2(E);
$e(I_*s(@);
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ i)iti(ise(5!i$)
:
"2(' i)itQ@R = :.MJ7/ .M.7/ .M.F/ .M.C/ .M.><;
i)t "!u)t;
set_t'is_8(ALL_OUT); // Les 7 8'!"2es $u p!'t = e) s!'tie
!utput_!4(RS); // *!$e "!**()$e
,!' ("!u)t = .; "!u)t N @; "!u)tCC)
:
p!'t_8 = i)itQ"!u)tR; // "!$e $e "!)t'!e
SPI sur le PIC16F876 Page 8
i*pusi!)(); // C i*pusi!) su' E
<
!utput_2i%2(RS); // *!$e $(t(
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ p!s_"u'(i)t p!se)
// P("e e "u'seu' ( ( p!siti!) spe"i,iee su' e LCD
:
!utput_!4(RS); // *!$e "!**()$e
p!'t_8 = p!se ; // ( p!siti!)
i*pusi!)(); // C i*pusi!) su' E
!utput_2i%2(RS); // *!$e $(t(
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ e"'it("2(' (s"ii)
// E"'it e "('("te'e ASCII p(sse e) p('(*et'e/ ( ( p!siti!) $u "u'seu'
// Le "u'seu' se $ep("e ( ( p!siti!) sui5()te
:
p!'t_8 = (s"ii;
i*pusi!)();
<
//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//
5!i$ e)"2(i)e("2(' "2(i)eQ?.R)
// E"'it ( "2(i)e $e "('("te'e p(ssee e) p('(*et'e/ ( ( p!siti!) $u
"u'seu'
:
i)t "!u)t;
"!u)t = .;
$!
:
e"'it("2(i)eQ"!u)tR);
"!u)tCC;
<
42ie("2(i)eQ"!u)tR T= .M.4);
<
SPI sur le PIC16F876 Page 9

You might also like