Electronique´ programmable – communications J.-M Friedt
Electronique programmable – communications ´
J.-M Friedt
FEMTO-ST/d´epartement temps-fr´equence jmfriedt@femto-st.fr
transparents `ajmfriedt.free.fr
29 janvier 2020
1 / 17
Electronique´ programmable – communications
J.-M Friedt
Protocoles de communication
Protocole parall`ele :
• un bit/fil : gourmand en ressources mat´erielles (bus parall`eles)
• couplage entre signaux adjacents `a haut d´ebit ⇒isolation (paires diff´erentielles dans LVDS, masse entre les signaux dans SCSI)
Protocoles s´erie : bits transmis s´equentiellement sur 1 ou 2 fil(s).
Asynchrone v.s synchrone :
• asynchrone : pas de partage d’horloge (historiquement, sur ligne t´el´ephonique)
• synchrone : partage d’horloge⇒d´ebit plus ´elev´e
2 / 17
Electronique´ programmable – communications
J.-M Friedt
Protocole asynchrone (RS232)
1• Pasd’horloge commune⇒cadencement des donn´ees par convention (baudrate)
• D´ebut : repos (1)→start bit (0)
• N bits de donn´ees,N∈ {7,8}, LSB first
• bit de parit´e optionnel (E, O, N)
• 1 ou 2 bit(s) de stop (1)
• Exercice : quel est le temps de transmission d’un octet `a 115200 bauds en 8N1 ?
0 1T t
START
1 0 0 0
2T 3T 4T 5T 6T 7T 8T
lsb msb
9T
STOP
1 0 1 0
T=1000/baud ms
1. gtvhacker,Hack All The Things : 20 Devices in 45 Minutes, DEF CON 22 (2014)
`
ahttps://www.youtube.com/watch?v=h5PRvBpLuJs
3 / 17
Electronique´ programmable – communications
J.-M Friedt
Protocole asynchrone (RS232)
1• Pasd’horloge commune⇒cadencement des donn´ees par convention (baudrate)
• D´ebut : repos (1)→start bit (0)
• N bits de donn´ees,N∈ {7,8}, LSB first
• bit de parit´e optionnel (E, O, N)
• 1 ou 2 bit(s) de stop (1)
1. gtvhacker,Hack All The Things : 20 Devices in 45 Minutes, DEF CON 22 (2014)
`
ahttps://www.youtube.com/watch?v=h5PRvBpLuJs
4 / 17
Electronique´ programmable – communications
J.-M Friedt
Protocole asynchrone (RS232)
Quelle est cette lettre ?
5 / 17
Electronique´ programmable – communications
J.-M Friedt
Protocole asynchrone (RS232)
Quel est ce message ?
6 / 17
Electronique´ programmable – communications
J.-M Friedt
Protocole asynchrone (RS232)
00110110S s 00110110S s
0x48=’H’
1
s0000010Ss10100110S s
0x65=’e’ 0x6C=’l’ 0x6C=’l’
11110110S s1
0x6F=’o’
0110000S s
0x0D=’\r’
0 01 10000S
0x0A=’\n’
7 / 17
Electronique´ programmable – communications
J.-M Friedt
Protocoles synchrones (I
2C, SPI)
Acc`es mat´eriel : degr´es de libert´e (´etat au repos de l’horloge, front d’´echantillonnage, ordre des bits
Impos´e dans I2C, libre dans SPI (CPHA, CPOL)
SPI s´electionne par CS#, I2C par l’adressedu destinataire (impos´ee par le mat´eriel). I2C : MSB first6= SPI : LSB ou MSB first. I2C @ ?
↓ Atmega32U4 BMA220 →
8 / 17
Electronique´ programmable – communications
J.-M Friedt
Protocoles synchrones (I
2C, SPI)
Acc`es mat´eriel : degr´es de libert´e (´etat au repos de l’horloge, front d’´echantillonnage, ordre des bits
Impos´e dans I2C, libre dans SPI (CPHA, CPOL)
SPI s´electionne par CS#, I2C par l’adressedu destinataire (impos´ee par le mat´eriel). I2C : MSB first6= SPI : LSB ou MSB first. I2C @ ?
↓ Atmega32U4 BMA220 →
S 1 0 1 0 0 0 1 0 0
A 2
W#
DATA CLOCK
9 / 17
Electronique´ programmable – communications
J.-M Friedt
Attention aux biblioth` eques
Exemple de code Arduino `a [1]
#i n c l u d e " W i r e . h "
#d e f i n e P C F 8 5 6 3 a d d r e s s 0 x 5 1 [ . . . ]
v o i d s e t P C F 8 5 6 3 ( )
// t h i s s e t s t h e t i m e and d a t e t o t h e → ,→PCF8563
{
W i r e . b e g i n T r a n s m i s s i o n ( P C F 8 5 6 3 a d d r e s s ) ; W i r e . w r i t e ( 0 x 0 2 ) ;
[ . . . ]
Datasheet : adresses 0xA2, 0xA3 mais appel `a
i n t 8 t I 2 C w r i t e (c o n s t u i n t 8 t a d d r e s s , → ,→u i n t 8 t∗d a t a , u i n t 8 t n ) {i n t 8 t d ;
i n t i ; d = I 2 C s t a r t ( ) ;
i f( ( d != 0 x 0 8 ) && ( d != 0 x 1 0 ) ){
I 2 C s t o p ( ) ;r e t u r n d ; }
TWDR=a d d r e s s ; // s e n d t h e s l a v e a d d r e s s i f ( ( d=I 2 C a c t i o n ( 0 ) ) != 0 x 1 8 ){
I 2 C s t o p ( ) ; r e t u r n d ; }
f o r( i =0; i<n ; i ++){
TWDR=(∗d a t a++) ;
i f ( ( d=I 2 C a c t i o n ( 0 ) ) != 0 x 2 8 ){
I 2 C s t o p ( ) ; r e t u r n d ; }
} I 2 C s t o p ( ) ; r e t u r n 0 ; }
[ . . . ]
#d e f i n e PCF8563 0 xA2
I 2 C w r i t e ( PCF8563 , ( u i n t 8 t ∗) t i m e , 8 ) ;
pour communiquer (0xA26=0x51 !)
[1]http://tronixstuff.com/2013/08/13/
tutorial-arduino-and-pcf8563-real-time-clock-ic/
10 / 17
Electronique´ programmable – communications
J.-M Friedt
Attention aux biblioth` eques
Datasheet : adresses 0xA2, 0xA3
1 0x51=0xA2>>1
2 m´ethode Wire de Arduino [1]
appelle beginTransmission qui appelle
twi writeTo(txAddress ...)
3 twi writeTo se trouve (par exemple) `a [2] :
t w i s l a r w = TW WRITE ; t w i s l a r w |= a d d r e s s<<1 ;
⇒biblioth`eque appel´ee par Arduino fait un d´ecallage et ajoute 1 si lecture [3]
Opensource : capacit´e `a suivre le cheminement des traitements
[1]github.com/esp8266/Arduino/blob/master/libraries/Wire/Wire.cpp [2]www.libelium.com/v11-files/api/waspmote/d5/d8c/twi_8c_source.html [3]robotika.yweb.sk/skola/!Diplomovka/avr498/avr498/doc/twi__lib_8h.html dit queTWI READvaut 1 etTWI WRITEvaut 0
11 / 17
Electronique´ programmable – communications J.-M Friedt
Emulation logicielle du protocole ´ synchrone (SPI)
Pourquoi ?
• impl´ementer un mode non-support´e par le mat´eriel (e.g.
9 bits/message)
• manque de ressource mat´erielle
Exercice : impl´ementer l’envoi d’une com- mande et d’une donn´ee
`
a un ´ecran LCD Nokia
12 / 17
Electronique´ programmable – communications J.-M Friedt
Emulation logicielle du protocole ´ synchrone (SPI)
Envoi de commande/donn´ee `a un ´ecran LCD Nokia
#d e f i n e c s l o PORTB &= ˜ ( 1<<PORTB5)
#d e f i n e c s h i PORTB|= ( 1<<PORTB5)
#d e f i n e m o s i h i PORTB|= ( 1<<PORTB7)
#d e f i n e m o s i l o PORTB &= ˜ ( 1<<PORTB7)
#d e f i n e c k h i PORTC|= ( 1<<PORTC7)
#d e f i n e c k l o PORTC &= ˜ ( 1<<PORTC7) v o i d a t t e n d ( ){}// t e mp s d ’ a t t e n t e , s c k v o i d s e n d B y t e ( b o o l cmd , u8 d a t a ) {i n t k ;
c k u p ; c s l o ;
i f ( cmd==0) m o s i l o ; e l s e m o s i h i ; c k d o w n ; a t t e n d ( ) ;
c k u p ; a t t e n d ( ) ; f o r ( k =7; k>=0;k−−)
{i f ( ( ( d a t a>>k ) &0x 0 1 ) ! =0 ) m o s i h i ; e l s e m o s i l o ;
c k d o w n ; a t t e n d ( ) ; c k u p ; a t t e n d ( ) ; }
c s h i ; }
13 / 17
Electronique´ programmable – communications
J.-M Friedt
Initialisation du port asynchrone
Atmega32U4
1 configurer le controle de flux
2 configurer le p´eriph´erique (8N1, 115200 bauds)
Initialisation :
UCSR1A = 0 ; // i m p o r t a n t l y U2X1 = 0
UCSR1B = 0 ;
UCSR1B = ( 1<<RXEN1 )|( 1<<TXEN1) ; // e n a b l e r e c e i v e r and t r a n s m i t t e r UCSR1C = BV ( UCSZ11 ) | BV ( UCSZ10 ) ; // 8N1
// UCSR1D = 0 ; // no r t c / c t s ( p r o b l e m e de v e r s i o n de l i b a v r ) baud = ( ( ( ( F CPU / ( USART BAUDRATE∗16UL ) ) )−1 ) ) ;
UBRR1H = (u n s i g n e d c h a r) ( baud>>8);
UBRR1L = (u n s i g n e d c h a r) baud ;
14 / 17
Electronique´ programmable – communications
J.-M Friedt
Initialisation du port asynchrone
Atmega32U4
1 configurer le controle de flux
2 configurer le p´eriph´erique (8N1, 115200 bauds)
Communication :
v o i d u a r t t r a n s m i t ( u n s i g n e d c h a r d a t a ) {w h i l e ( ! ( UCSR1A&(1<<UDRE1) ) ) ;
UDR1 = d a t a ; }
u n s i g n e d c h a r u a r t r e c e i v e (v o i d) {w h i l e ( ! ( UCSR1A&(1<<RXC1 ) ) ) ;
r e t u r n UDR1 ; }
15 / 17
Electronique´ programmable – communications
J.-M Friedt
Initialisation
du port sychrone sur Atmega32U4
v o i d i n i t S P I ( )
{DDRB|= ((1<<DDB0)|(1<<DDB2)|(1<<DDB1) ) ; // MOSI ( B2 ) , SCK ( B1 ) s o r t i e , MISO ( B3 ) e n t r e e DDRB &= ˜ ( 1<<DDB3) ; // ATTENTION : meme s i CS manuel , DDB0 d o i t e t r e o u t ( s i n o n b l o q u e ) DDRC|= ( 1<<DDC7) ; // CS# // p . 1 7 . 2 . 1 d a t a s h e e t
SPCR=(0<<SPIE )|(1<<SPE )|(0<<DORD)|(1<<MSTR) | ( 0<<CPOL)|(0<<CPHA)|(1<<SPR1 )|(1<<SPR0 ) ; // I n t Ena| SPI ENA|0=MSB 1 s t| M a s t e r | CK i d l e h i |s a m p l e t r a i l i n g SCK| f OSC /128
SPSR &= ˜ ( 1<<SPI2X ) ; // No d o u b l e d c l o c k f r e q u e n c y }
16 / 17
Electronique´ programmable – communications
J.-M Friedt
Initialisation du port sychrone sur
Atmega32U4
1 d´ebit de communication (communication synchrone)
2 ´etat au repos de l’horloge et front d’´echantillonnage des donn´ees
c h a r s d r a w s e n d b y t e (c h a r b ) // p a s de d i s t i n c t i o n TX/RX
{SPDR = b ; // emet MOSI
w h i l e( ! ( SPSR & ( 1<<SPIF ) ) ) ; SPSR &= ˜ ( 1<<SPIF ) ;
r e t u r n SPDR ; // r e n v o i MISO
}
17 / 17