A. Le Bus I2C :
1. Historique
Le bus I2C ( Inter Integrated Circuit Bus ) est développé par Philips pour les
applications de domotique et d'électronique domestique au début des années 80,
notamment pour permettre de relier facilement à un microprocesseur les différents
circuits d'un téléviseur moderne. Il existe d'innombrables périphériques exploitant ce
bus, il est même implantable par logiciel dans n'importe lequel des microcontrôleurs.
2. Caractéristiques
3. Principe
Afin de d'éviter les conflits électriques les Entrées/Sorties SDA et SCL sont de
type "Collecteur Ouvert". Cela permet ainsi la présence de plusieurs maîtres sur le
bus.
page 8
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
4) protocole I2C
Le protocole I2C définit la succession des états logiques possibles sur SDA et
SCL, et la façon dont doivent réagir les circuits en cas de conflits.
Pour prendre le contrôle du bus, il faut que celui-ci soit au repos ( SDA et SCL à
'1' ). Pour transmettre des données sur le bus, il faut donc surveiller deux conditions
particulières :
La condition de départ. ( SDA passe à '0' alors que SCL reste à '1' )
La condition d'arrêt. ( SDA passe à '1' alors que SCL reste à '1' )
Lorsqu'un circuit, après avoir vérifié que le bus est libre, prend le contrôle de celui-ci,
il en devient le maître. C'est lui qui génère le signal d'horloge.
Après avoir imposé la condition de départ, le maître applique sur SDA le bit de
poids fort D7.
Il valide ensuite la donnée en appliquant pendant un instant un niveau '1' sur
la ligne SCL.
Lorsque SCL revient à '0', il recommence l'opération jusqu'à ce que l'octet
complet soit transmis.
Il envoie alors un bit ACK à '1' tout en scrutant l'état réel de SDA.
page 9
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
L'esclave doit alors imposer un niveau '0' pour signaler au maître que la
transmission s'est effectuée correctement.
Les sorties de chacun étant à collecteurs ouverts, le maître voie le '0' et peut
alors passer à la suite.
Le nombre de composants qu'il est possible de connecter sur un bus I2C étant
largement supérieur à deux, il est nécessaire de définir pour chacun une adresse
unique.
L'adresse d'un circuit, codée sur sept bits, est définie d'une part par son type
et d'autre part par l'état appliqué à un certain nombre de ces broches. Cette adresse
est transmise sous la forme d'un octet au format particulier.
Le bit d'acquittement ACK fonctionne comme pour une donnée, ceci permet
au maître de vérifier si l'esclave est disponible.
L'espace adressable d'un circuit de mémoire étant sensiblement plus grand que
la plupart des autres types de circuits, l'adresse d'une information y est codée sur
deux octets ou plus. Le premier représente toujours l'adresse du circuit, et les
suivants l'adresse interne de la mémoire.
page 10
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
L'écriture d'un octet dans certains composants (Mémoires, microcontrôleur, ...) peut
prendre un certain temps. Il est donc possible que le maître soit obligé d'attendre
l'acquittement ACK avant de passer à la suite.
La lecture d'une donnée par le maître se caractérise par l'utilisation spéciale qui
faite du bit ACK. Après la lecture d'un octet, le maître positionne ACK à '0' s'il veut
lire la donnée suivante (cas d'une mémoire par exemple) ou à '1' le cas échéant. Il
envoie alors la condition d'arrêt.
La structure même du bus I2C a été conçue pour pouvoir y accueillir plusieurs
maîtres. Se pose alors le problème commun à tous les réseaux utilisant un canal de
communication unique : la prise de parole.
page 11
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
En effet, chaque maître pouvant prendre possession du bus dès que celui-ci est
libre, il existe la possibilité de que deux maîtres prennent la parole en même temps.
Si cela ne pose pas de problème sur le plan électrique grâce à l'utilisation de
collecteurs ouverts, il faut pouvoir détecter cet état de fait pour éviter la corruption
des données transmises. Comme nous l'avons vu précédemment, pour prendre le
contrôle du bus, un maître potentiel doit d'abord vérifier que celui-ci soit libre, et
qu'une condition d'arrêt ait bien été envoyée depuis au moins 4,7µs. Mais il reste la
possibilité que plusieurs maîtres prennent le contrôle du bus simultanément.
Chaque circuit vérifie en permanence l'état des lignes SDA et SCL, y compris
lorsqu'ils sont eux même en train d'envoyer des données. On distingue alors
plusieurs cas :
Si il ne relit pas un niveau '1', c'est qu'un autre maître a pris la parole en même
temps. Le premier perd alors immédiatement le contrôle du bus, pour ne pas
perturber la transmission du second. Il continue néanmoins à lire les données au cas
celles-ci lui auraient été destinées.
5.3. Exemple
page 12
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Analyse :
Le premier octet est transmis normalement car les deux maîtres imposent les
mêmes données. (Cas n°1). Le bit ACK est mis à '0' par l'esclave.
Lors du deuxième octet, le maître n°2 cherche à imposer un '1' (SDA2) , mais
relit un '0' (SDAR), il perd alors le contrôle du bus et devient esclave (Cas n°3) . Il
reprendra le contrôle du bus, lorsque celui-ci sera de nouveau libre.
Le maître n°1 ne voit pas le conflit et continue à transmettre normalement. (Cas n°2)
Au total, l'esclave à reçu les données du maître n°1 sans erreurs et le conflit
est passé inaperçu.
La mise en haute impédance d'un circuit non alimenté : Ceci évite de bloquer le
bus si un périphérique n'est pas alimenté.
Remarque :
En 1998, le mode haut débit porte la vitesse maximum du bus I2C à 3.4 Mb/s.
Les marges de bruit ont aussi été modifiées pour permettre de relier des circuits
faible consommation (alimentation 2V )
Les adresses 0000 0xxx ne sont pas utilisées pour l'adressage de composants. Elles
ont été réservées par Philips pour effectuer certaines fonctions spéciales.
page 13
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Après l'émission d'un appel général, les circuits ayant la capacité de traiter ce genre
d'appel émettent un acquittement.
0000 0110 : RESET. Remet tout les registres de circuits connectés dans leur état
initial (Mise sous tension). Les circuits qui le permettent rechargent leur adresse
d'esclave.
0000 0010 : Les circuits qui le permettent rechargent leur adresse d'esclave.
0000 0100 : Les circuits définissant leur adresse de façon matérielle réinitialisent leur
adresse d'esclave.
xxxx xxx1 : Cette commande joue le rôle d'interruption. xxxx xxx peut être l'adresse
du circuit qui a généré l'interruption.
Cet octet est utilisé pour synchroniser les périphériques lents avec les
périphériques rapides.
L'émission de cet octet permet de rendre sourd tout les circuits I2C présents
sur le bus. A partir de ce moment, on peut transmettre ce que l'on désire sur le bus,
en utilisant par exemple un autre protocole. Le bus repasse en mode normal lors de
la réception d'une condition d'arrêt.
6.4. Autres
Ces octets ne sont pas définit et sont ignoré par les circuits I2C. Ils peuvent
être utilisés pour débugger un réseau multi master.
page 14
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
7 exemple :
program Eeprom_Test;
var EE_adr, EE_data, k : byte;
jj : word;
begin
I2C_Init(100000); // Initialize full master mode
TRISD := 0; // PORTD is output
PORTD := $FF; // Initialize PORTD
I2C_Start; // Issue I2C start signal
I2C_Wr($A2); // Send byte via I2C(command to 24cO2)
EE_adr := 2;
I2C_Wr(EE_adr); // Send byte(address for EEPROM)
EE_data := $AA;
I2C_Wr(EE_data); // Send data(data that will be written)
I2C_Stop; // Issue I2C stop signal
for jj := 0 to 65500 do nop; // Pause while EEPROM writes data
I2C_Start; // Issue I2C start signal
I2C_Wr($A2); // Send byte via I2C
EE_adr := 2;
I2C_Wr(EE_adr); // Send byte(address for EEPROM)
I2C_Repeated_Start; // Issue I2C signal repeated start
I2C_Wr($A3); // Send byte (request data from EEPROM)
k := I2C_Rd(1); // Read the data
I2C_Stop; // Issue I2C stop signal
PORTD := k; // Show data on PORTD
end.
page 15
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
B. Le Bus CAN :
1) Introduction :
Depuis les années 1960 la longueur de câble utilisée dans l’automobile ne
cesse de croître pour dépasser 2000 m en 1995. Le nombre des connexions atteint
1800 à cette même date. La fiabilité et la sécurité sont menacées.
Les normes en matière de pollution et de consommation d’énergie obligent
les constructeurs à multiplier les capteurs et actionneurs intelligents dans leurs
véhicules accélérant ce processus de multiplication des câbles et connexion depuis
une vingtaine d’années.
Le besoin de sécurité accrue (ABS, ESP, AIR-BAG…) et la demande de
confort (mémorisation des réglages de conduite, climatisation régulée par passager,
système de navigation…) ne font que renforcer cette tendance.
La société BOSCH développe dès le début des années 1980 une solution
de multiplexage des informations circulant à bord de la voiture. Le bus CAN
apparaîtra et sera normalisé dans les années qui suivent (dès 1983).
Les composants CAN se démocratisent et investissent d’autres secteurs de
l’électronique embarqué (médical, produits numériques, systèmes
électrotechnique…).
2) Le bus CAN
Le bus CAN (Control Area Network) est un moyen de communication série qui
supporte des systèmes embarqués temps réel avec un haut niveau de fiabilité. Ses
domaines d’application s’étendent des réseaux moyens débits aux réseaux de
multiplexages faibles coûts. Il est avant tout à classer dans la catégorie des réseaux
de terrain utilisé dans l'industrie.
La structure du protocole du bus CAN possède implicitement les principales
propriétés suivantes :
hiérarchisation des messages.
page 16
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Pour les niveaux physiques sur le bus, il est important de distinguer les deux types
de transmission possibles :
- transmission en bus CAN low speed,
- transmission en bus CAN high speed.
page 17
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
ISO11519-2 ISO11898
Low Speed CAN < 125Kbps High Speed CAN 125Kbps - 1Mbps
Le tableau ci-dessous résume les principales différences entre les deux types de bus
notamment sur les débits supportés.
page 18
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
4) Protocole CAN
Le concept de communication du bus CAN est celui de la diffusion
d’information (broadcast) : chaque station connectée au réseau écoute les trames
transmises par les stations émettrices. Ensuite chaque nœud décide quoi faire du
message, s’il doit y répondre ou non, s’il doit agir ou non, etc…
Le protocole CAN autorise différents stations à accéder simultanément au
bus. C’est un procédé rapide et fiable d’arbitrage qui détermine la station qui émet en
premier.
L’accès au bus est donc aléatoire car une station peut émettre à n’importe
quel moment. Mais cet accès se fait par priorité ; cette méthode est appelée CSMA
CD/AMP (Carrier Sense Multiple Acces with Collision Detection and Arbitration
Message Priority).
Comme dans la plupart des protocoles, il est nécessaire d’utiliser un vocabulaire
adapté à la situation. Nous allons donc définir un certain nombre de termes et de
règles de fonctionnement concernant le protocole CAN.
- Noeud :
Sous-ensemble relié à un réseau de communication et capable de
communiquer sur le réseau selon un protocole de communication (ici le protocole
CAN).
- Valeurs du bus :
Le bus peut avoir l’une des deux valeurs logiques complémentaires définies,
non pas en 0 et 1 comme d’habitude, mais sous les formes dites de dominante et
récessive. Dans le cas d’une transmission simultanée de bits récessifs et dominants,
la valeur résultante du bus sera dominante (équivalence avec un OU câblé).
page 19
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
- Message :
Chaque information est véhiculée sur le bus à l’aide d’un message (trame de
bits) de format défini mais de longueur variable (et limitée). Dès que le bus est libre
(bus idle), n’importe quel noeud relié au réseau peut émettre un nouveau message.
- Routage des informations :
Des noeuds peuvent être ajoutés au réseau sans qu’il n’y ait rien à modifier
tant au niveau logiciel que matériel. Chaque message possède un identificateur
(identifier) qui n’indique pas la destination du message mais la signification des
données du message. Ainsi tous les noeuds reçoivent le message, et chacun est
capable de savoir grâce au système de filtrage de message si ce dernier lui est
destiné ou non. Chaque noeud peut également détecter des erreurs sur un message
qui ne lui est pas destiné et en informer les autres noeuds.
- Trame de données, trame de requête :
Une trame de données (data frame) est une trame qui transporte, comme son
nom l’indique, des données. Une trame de requête est émise par un noeud désirant
recevoir une trame de données (l’identificateur est le même pour les deux trames
dans ce cas).
- Débit bit :
Le débit bit peut varier entre différents systèmes, mais il doit être fixe et
uniforme au sein d’un même système.
- Priorités :
Les identificateurs de chaque message permettent de définir quel message
est prioritaire sur tel autre.
- Demande d’une trame de données :
Un noeud peut demander à un autre nœud d’envoyer une trame de données,
et pour cela il envoie lui-même une trame de requête. La trame de données
correspondant à la trame de requête initiale possède le même identificateur.
- Fonctionnement multimaître :
Lorsque le bus est libre, chaque noeud peut décider d’envoyer un message.
Seul le message de plus haute priorité prend possession du bus.
- Arbitrage :
Le problème de l’arbitrage résulte du fonctionnement multimaître. Si deux
noeuds ou plus tentent d’émettre un message sur un bus libre il faut régler les
conflits d’accès. On effectue alors un arbitrage bit à bit (non destructif) tout au long
du contenu de l’identificateur. Ce mécanisme garantit qu’il n’y aura ni perte de temps,
ni perte d’informations. Dans le cas de deux identificateurs identiques, la trame de
données gagne le bus. Lorsqu’un bit récessif est envoyé et qu’un bit dominant est
observé sur le bus, l’unité considérée perd l’arbitrage, doit se taire et ne plus envoyer
aucun bit. L'arbitrage est qualifié de CSMA/CA (Carrier Sense Multiple Access -
Collision Avoidance).
- Sécurité de transmission :
Dans le but d’obtenir la plus grande sécurité lors de transferts sur le bus, des
dispositifs de signalisation, de détection d’erreurs, et d’autotests ont été implémentés
sur chaque noeud d’un réseau CAN. On dispose ainsi d’un monitoring bus
(vérification du bit émis sur le bus), d’un CRC (Cyclic Redundancy Check), d’une
procédure de contrôle de l’architecture du message, d’une méthode de Bit-Stuffing.
On détecte alors toutes les erreurs globales, toutes les erreurs locales au niveau des
émetteurs, jusqu’à 5 erreurs aléatoires réparties dans un message. La probabilité
totale résiduelle de messages entachés d’erreurs est inférieure à 4.7*10-11.
page 20
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 21
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 22
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 23
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Exemple d’arbitrage
page 24
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Il y a deux Bits de réserves : Les deux premiers bits (émis dominants en trame
2.0A) sont en réserve d'usages ultérieurs et permettent d'assurer des compatibilités
futures ascendantes (notamment celles de la trame dite étendue CAN 2.0B). Les
contrôleurs CAN doivent être aptes à traiter toutes combinaisons de tous les bits du
champ de commande.
4 bits DLC : Les 4 derniers bits du champ de commande (champ DLC - Data
Length Code) indiquent le nombre d'octets qui seront contenus dans le champ de
données.
page 25
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 26
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Contrairement au cas précédent, dans le cas d'une remote frame, le bit RTR
est récessif. C'est donc ce bit qui différencie une data frame d'une remote frame.
Exemple :
Comparaison de 2 trames avec le même identificateur, l’une de données
l’autre de requête : la trame de donnée est prioritaire sur la trame de requête.
page 27
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Comme l'indique la figure, elle peut se produire à la fin d'un end of frame ou
d'un error delimiter ou encore d'un autre overload delimiter en lieu et place du début
de l'interframe.
Voici un exemple de 2 zones d’inter trame l’une sans trame d’erreur l’autre à la suite
d’une trame d’erreur (inter trame « erreur »)
page 28
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 29
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
B. La liaison RS485 :
1) Introduction :
La norme RS485 définie par l’EIA, Electronic Industries Association, a été
publiée en Avril 1983. Ce standard précise les caractéristiques électriques des
émetteurs et des récepteurs pour une utilisation dans les systèmes multipoints en
mode symétrique.
La transmission se fait sur une ligne électrique, pratiquement une paire torsadée, par
des variations de tension en mode différentiel.
2) Le Bus RS485 :
Un des principaux problèmes des liaisons séries est l'absence d'immunité pour
le bruit sur les lignes de signal. L'émetteur et le récepteur comparent les tensions par
rapport à une masse commune en ligne (exemple RS232). Un changement dans le
niveau du potentiel de terre peut avoir des effets désastreux. Le bruit limite à la fois
la distance maximale et la vitesse de communication. Avec l’RS485 il n'y a pas une
masse commune comme signal de référence. La transmission est différentielle Le
récepteur compare la différence de tension entre les deux lignes, au lieu d’un niveau
de tension absolue sur une ligne de signal.
Le support de transmission est ici différentiel. Deux fils correspondant à des niveaux
complémentaires sont donc utiles pour chaque signal ce qui limite l'influence des
bruits extérieurs et des masses. Des circuits trois états permettent des liaisons
multipoints.
page 30
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
3) Le protocole :
Un protocole consiste en la définition de trames d’échange. Plusieurs protocoles
en été définies. Le protocole le plus connu est le protocole Modbus (marque déposée
par MODICON) et Profibus (Siemens) qui sont deux protocoles standards de
dialogue basé sur une structure hiérarchisée entre un maître et plusieurs esclaves.
Mikroelectronika propose aussi un protocole non standard pour communiquer des
microcontrôleurs de type PIC, DsPIC, AVR et Intel. Néanmoins l’utilisateur est libre de
définir son propre protocole, nous allons voir à la fin de ce chapitre un exemple de
réseau RS485 entre plusieurs microcontrôleurs de la famille PIC de Microchip.
page 31
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Le protocole Modbus est très utilisé pour les communications des automates
programmables industriels et des variateurs de vitesse des moteurs électriques.
3.2 Adressage
Les abonnés du bus sont identifiés par des adresses attribuées par l’utilisateur.
L’adresse de chaque abonné est indépendante de son emplacement physique.
Les adresses vont de 1 à 64 pour le protocole Modbus et de 1 à 255 en général et ne
doivent pas obligatoirement être attribuées de manière séquentielle.
Deux abonnés ne peuvent avoir la même adresse.
3.4 Echange maître vers 1 esclave
Le maître interroge un esclave de numéro unique sur le réseau et attend de la part
de cet esclave une réponse.
page 32
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 33
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
La réponse
Si une erreur apparaît, le code fonction est modifié pour indiquer que la réponse est
une réponse d’erreur.
Les données contiennent alors un code (code d’exception) permettant de connaître
le type d’erreur.
Le champ de contrôle permet au maître de confirmer que le message est valide.
Profibus (Process Field Bus) est le nom d'un type de bus de terrain inventé par
Siemens et devenu peu à peu une norme de communication dans le monde de
l'industrie. Il s'appuie sur une liaison RS485
Câble
Paire torsadée blindée, soigneusement isolée par une feuille conductrice et une
tresse. Avec 2 conducteurs nommés A et B.
• Fil vert : A, transporte le signal RxD/TxD-N
• Fil rouge : B, transporte le signal RxD/TxD+N
Terminaison de ligne
page 34
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 35
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Exemple :
Norme
Les divers types de télégrammes, identifiés par leur SD et les fonctions possibles
pour chaque type, identifiées par FC.
• Exemple
– Ecriture des sorties : SD = 68h, FC = 6h, pas de SSAP ni DSAP et DU : contient
les valeurs des sorties.
Adressage
• Plage d’adresses de 0 à 127
– 0 : en général utilisée par les outils de diagnostic.
– 1 à 125 : adresses librement utilisables pour les maîtres et esclaves.
– 126 : réservée pour les équipements dont l’adresse est définie par le bus.
– 127 : adresse de diffusion (message reçu par tous les esclaves)
• Fonctionnement maître esclave
– Le maître envoie une requête à un esclave.
– L’esclave renvoie une réponse en retour.
– Ainsi, pas de risque de collision.
– Polling successif des différents esclaves
– Fonctionnement cyclique
– Le temps de cycle dépend du nombre d’esclaves et de la taille des données
échangées
page 36
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 37
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
page 38
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
Programme du maitre :
////////////////////////////////////////////////////////////////////////////////////
//******************* http://www.technologuepro.com/ ***************************//
// ISET Nabeul Le 07/12/2010 --------+------- //
// Carte de test de la liaison RS485 programme maitre //
// By ABIDI Hatem //
////////////////////////////////////////////////////////////////////////////////////
program RSBUMASTER;
var dat : array[3] of byte; // Message buffer
begin
Lcd_Config(PORTB,6,5,4,3,PORTB,0,1,2); // Initialize LCD
Usart_init(9600); // Initialize USART module
RS485Master_Init(PORTC, 2); // Initialize MCU as Master
dat[0] := 'A'; // Message 'AII'
dat[1] := 'I';
dat[2] := 'I';
Lcd_out(1,1,'Press START');
while true do
begin
if PORTC.0 = 1 then
begin
Lcd_out(1,1,'Message sent:');
Lcd_out(2,1,'AII');
RS485Master_Send(dat, 3, 170); // send message
delay_ms(1000);
end;
end;
end.
Programme de l’esclave :
////////////////////////////////////////////////////////////////////////////////////
//******************* http://www.technologuepro.com/ ***************************//
// ISET Nabeul Le 07/12/2010 --------+------- //
// Carte de test de la liaison RS485 programme esclave //
// By ABIDI Hatem //
////////////////////////////////////////////////////////////////////////////////////
Program RSBUSLAVE;
var dat : array[8] of byte; // Message buffer
i, j : byte;
procedure interrupt;
begin
RS485Slave_Receive(dat);
ClearBit(PIE2, TXIE);
end;
page 39
COURS LES SYSTEMES EMBARQUES CHAPITRE 2
begin
Lcd_Config(PORTB,6,5,4,3,PORTB,0,1,2);
Usart_init(9600); // Initialize USART module
RS485Slave_Init(PORTC, 2, 170); // Initialize MCU as Slave, address 160
SetBit(PIE1, RCIE); // Enable interrupt on byte received
SetBit(INTCON, PEIE); // via USART (RS485)
ClearBit(PIE2, TXIE);
SetBit(INTCON, GIE);
PORTB := 0;
dat[4] := 0; // Clear "message received" flag
dat[5] := 0; // Clear error flag
Lcd_out(1,1,'Standby');
while true do
begin
// If there is an error,
if dat[5] = TRUE then Lcd_out(1,1,'error');
// If message received:
if dat[4] = TRUE then
begin
Lcd_out(1,1,'Message receved:');
dat[4] := 0; // Clear message received flag
j := dat[3]; // Number of data bytes received
for i := 1 to j do
BEGIN
lcd_chr(2,i,dat[i - 1]);
END;
end;
end;
end.
Note :
page 40