diff --git a/Drivers/Inc/Lib_Com_Periph_2022.lib b/Drivers/Inc/Lib_Com_Periph_2022.lib
new file mode 100644
index 0000000..ce805ab
Binary files /dev/null and b/Drivers/Inc/Lib_Com_Periph_2022.lib differ
diff --git a/Drivers/Inc/MyI2C.h b/Drivers/Inc/MyI2C.h
new file mode 100644
index 0000000..289c9ed
--- /dev/null
+++ b/Drivers/Inc/MyI2C.h
@@ -0,0 +1,229 @@
+#ifndef _I2C_
+#define _I2C_
+
+#include "stm32f10x.h"
+
+/*************************************************************************************
+===================== By Periph team INSA GEI 2022 ===========================
+*************************************************************************************/
+
+/*
+*************************************************************************************
+===================== I2C les IO STM32F103 =================================
+*************************************************************************************
+
+Les IO sont pris en charge par la lib, pas besoin de faire les configurations Alt OD.
+
+**I2C1**
+SCL PB6
+SDA PB7
+
+**I2C2**
+SCL PB10
+SDA PB11
+
+
+*************************************************************************************
+==================== Fondamentaux I2C ==========================================
+*************************************************************************************
+- Bus synchrone Low speed (<100kHz) ou high speed (=400kHz), Ici Low speed 100kHz.
+- Transfert octet par octet, poids fort en premier, avec aquittement pour chaque octet
+- Deux lignes SDA et SCL (horloge) en open drain, repos '1'
+- bit "normal" = SDA stable lors du pulse SCL (ie durant l'état haut de SCL, SDA est stable)
+- bit Start/Stop/Restart = SDA non stable lorsque SCL vaut '1' (violation règle précédente)
+ * Start : front descendant de SDA lorsque SCL vaut '1'
+ * Stop : front montant de SDA lorsque SCL = '1'
+ * Restart = Start en cours de trame (typiquement pour changer Write/read).
+- uC en Mode Master uniquement (c'est notre choix) : c'est le uC qui est maître de l'horloge SCL.
+- Le Slave a une @ 7 bits. On ajoute un bit LSB qui est /WR (donc 0 pour écriture, 1 pour lecture)
+- Une adresse s'écrit donc |a6 a5 a4 a3 a2 a1 a0 /WR| ce qui donne 8 bits. Elle indique une future
+lecture ou écriture.
+On parle d'@ 7 bits en regroupant |a6 a5 a4 a3 a2 a1 a0|
+On parle d'@ 8 bits en regroupant |a6 a5 a4 a3 a2 a1 a0 /WR| (donc une @ écriture, une @ lecture)
+NB : préférer le concept @7bits...c'est plus clair.
+
+- On peut lire ou écrire une ou plusieurs données à la suite. C'est lors de l'envoie de l'adresse Slave
+par le Master que le sens à venir pour les datas est indiqué.
+- En écriture,
+ * les Ack sont faits par le slave après chaque octet envoyé par le master (Ack = mise à 0 le bit 9).
+- En lecture,
+ * dès que le l@ slave est transmise (/RW = 1), et le Ack réalisé, le slave positionne le bit 7
+ du prochain octet à lire sur SDA par anticipation ,
+ * le master enchaîne ses pulses (9), lors du pulse 9 (le dernier) c'est le master qui acquite.
+ * Après chaque acquitement, le Slave amorce le prochain octet en positionnant son bit 7 sur SDA
+ * Après le dernier octet, le Master génère un stop.
+ * Pour pouvoir générer le stop, le Master doit piloter SDA, or ce n'est pas possible puisque
+ le Slave positionne le futur bit 7 ... Pour régler ce problème :
+ lors du dernier transfert, le Master N'acquitte PAS (NACK). Ainsi le Slave ne
+ propose plus le bit 7 du prochain octet sur SDA et libère SDA. Le Master peut alors clôturer la
+ communication avec un Stop.
+
+
+
+
+======= Echange typique avec un Slave ================================================================
+- Une lecture ou écriture se fait vers un Slave et à partir d'une adresse mémoire donnée (pointeur interne).
+Ce pointeur est automatiquement incrémenté dans le slave lors des accès écriture ou lecture.
+
+- Ecriture de N octets , trame complète (@ = adresse slave, pt = valeur de chargement du pointeur interne)
+|Start Cond |@6|@5|@4|@3|@2|@1|@0| Wr =0 |Slave ACK|
+|pt7|pt6|pt5|pt4|pt3|pt2|pt1|pt0|Slave ACK|
+|d7|d6|d5|d4|d3|d2|d1|d0|Slave ACK| (data 1)
+.....
+|d7|d6|d5|d4|d3|d2|d1|d0|Salve ACK|Stop Cond| (data N)
+
+- Lecture de N octets à partir d'une adresse de pointeur donnée
+|Start Cond |@6|@5|@4|@3|@2|@1|@0| Wr =0 |Slave ACK|
+|pt7|pt6|pt5|pt4|pt3|pt2|pt1|pt0|Slave ACK|
+|ReStart Cond |@6|@5|@4|@3|@2|@1|@0| Wr =1 |Slave ACK| (NB: restart nécessaire pour changer écriture / lecture)
+|d7|d6|d5|d4|d3|d2|d1|d0|Master ACK| (data 1)
+.....
+|d7|d6|d5|d4|d3|d2|d1|d0|Master ACK| (data N-1)
+|d7|d6|d5|d4|d3|d2|d1|d0|Master NACK|Stop Cond| (data N)
+
+
+
+
+
+*************************************************************************************
+==================== La lib I2C ==========================================
+*************************************************************************************
+
+3 fonctions essentielles :
+MyI2C_Init
+MyI2C_PutString
+MyI2C_GetString
+
+1 fonction spéciale : MyI2C_Get_Error
+
+Les fonctions Put/Get string fonctionnent sur le principe classique décrit précédemment
+(Slave@, Pter @, Data...).
+La fonction init prend parmi ses paramètres le nom d'une fct callback d'erreur.
+En fait, le driver gère en IT les erreurs possibles I2C. La fonction MyI2C_Get_Error permet de
+recevoir un code erreur.
+Il est conseillé d'utiliser ce callback. Si on tombe dedans, c'est qu'une erreur s'est produite.
+Si le code erreur est "inconnu", souvent c'est qu'il y a un soucis à l'adressage slave:
+Vérifier alors la connectique physique SDA/SCL ainsi que l'alimentation du slave ou tout simplement
+l'@ slave !
+
+
+==========================================================================================*/
+
+
+
+
+
+/*=========================================================================================
+ GESTION ERREURS
+========================================================================================= */
+typedef enum
+{
+ OK,
+ BusError, //
+ AckFail, // Pas,d'ack
+ TimeOut, // SCL est resté plus de 25ms à l'état bas
+ UnknownError // IT erreur déclenchée mais pas de flag explicite ...
+} MyI2C_Err_Enum;
+
+
+
+
+/**
+ * @brief Retourne les erreurs I2C
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @retval Type d'erreur rencontrée , voir MyI2C_Err_Enum
+ */
+
+MyI2C_Err_Enum MyI2C_Get_Error(I2C_TypeDef * I2Cx);
+
+
+
+/*=========================================================================================
+ INITIALISATION I2C
+========================================================================================= */
+
+
+/**
+ * @brief Initialise l'interface I2C (1 ou 2)
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param char IT_Prio_I2CErr 0 à 15 (utilisé en cas d'erreur, IT courte et non bloquante
+ * @param *ITErr_function : callback à utiliser pour sortir d'un plantage transmission
+ * @retval None
+ * @Example MyI2C_Init(I2C1, 2,My_CallbackErr);
+
+
+
+ */
+void MyI2C_Init(I2C_TypeDef * I2Cx, char IT_Prio_I2CErr, void (*ITErr_function) (void));
+
+
+
+/*=========================================================================================
+ EMISSION I2C : PutString
+========================================================================================= */
+
+
+// Structure de données pour l'émission ou la réception I2C :
+typedef struct
+{
+ char SlaveAdress7bits; // l'adresse I2C du slave device
+ char * Ptr_Data; // l'adresse du début de tableau char à recevoir/émettre (tableau en RAM uC)
+ char Nb_Data; // le nbre d'octets à envoyer / recevoir
+}
+MyI2C_RecSendData_Typedef;
+
+
+
+/**
+ * @brief|Start Cond |@6|@5|@4|@3|@2|@1|@0| Wr =0 |Slave ACK|
+ |pt7|pt6|pt5|pt4|pt3|pt2|pt1|pt0|Slave ACK|
+ |d7|d6|d5|d4|d3|d2|d1|d0|Slave ACK| (data 1)
+ .....
+ |d7|d6|d5|d4|d3|d2|d1|d0|Salve ACK|Stop Cond| (data N)
+
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param PteurAdress = adresse de démarrage écriture à l'interieur du slave I2C
+ * @param DataToSend, adresse de la structure qui contient les informations à transmettre
+ voir définition MyI2C_RecSendData_Typedef
+ * @retval None
+ * @Example MyI2C_PutString(I2C1,0xAA, &MyI2C_SendTimeData);
+ * Ecrit dans le slave câblé sur I2C1 à partir de l'@ mémoire interne Slave 0xAA
+
+ */
+void MyI2C_PutString(I2C_TypeDef * I2Cx, char PteurAdress, MyI2C_RecSendData_Typedef * DataToSend);
+
+
+
+
+
+
+
+
+
+
+/*=========================================================================================
+ Réception I2C : GetString
+========================================================================================= */
+
+/**
+ * @brief |Start Cond |@6|@5|@4|@3|@2|@1|@0| Wr =0 |Slave ACK|
+ |pt7|pt6|pt5|pt4|pt3|pt2|pt1|pt0|Slave ACK|
+ |ReStart Cond |@6|@5|@4|@3|@2|@1|@0| Wr =1 |Slave ACK|
+ |d7|d6|d5|d4|d3|d2|d1|d0|Master ACK| (data 1)
+ .....
+ |d7|d6|d5|d4|d3|d2|d1|d0|Master NACK|Stop Cond| (data N)
+
+ * @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
+ * @param PteurAdress = adresse de démarrage lecture à l'interieur du slave I2C
+ * @param DataToSend, adresse de la structure qui contient les informations nécessaires à la
+ réception des données voir définition MyI2C_RecSendData_Typedef
+ * @retval None
+ * @Example MyI2C_GetString(I2C1,0xAA, &MyI2C_RecevievedTimeData);
+ Lit dans le slave câblé sur I2C1 à partir de l'@ mémoire interne Slave 0xAA
+ */
+void MyI2C_GetString(I2C_TypeDef * I2Cx, char PteurAdress, MyI2C_RecSendData_Typedef * DataToReceive);
+
+
+
+
+#endif
diff --git a/Drivers/Inc/MySPI.h b/Drivers/Inc/MySPI.h
new file mode 100644
index 0000000..217d125
--- /dev/null
+++ b/Drivers/Inc/MySPI.h
@@ -0,0 +1,141 @@
+
+#ifndef INC_MYSPI_H_
+#define INC_MYSPI_H_
+
+#include "stm32f10x.h"
+
+#define DATAX0 0x32
+#define DATAX1 0x33
+#define DATAY0 0x34
+#define DATAY1 0x35
+#define DATAZ0 0x36
+#define DATAZ1 0x37
+#define DATA_FORMAT 0x31
+#define BW_RATE 0x2C
+#define POWER_CTL 0x2D
+#define READ 0xC0
+#define WRITE 0x40
+
+/*************************************************************************************
+===================== By Periph team INSA GEI 2022 ===========================
+*************************************************************************************/
+
+/*
+*************************************************************************************
+===================== I2C les IO STM32F103 =================================
+*************************************************************************************
+Les IO sont pris en charge par la lib, pas besoin de faire les configurations
+
+
+Sur la Nucléo , le SPI1 est perturbé par la LED2 (PA5), mais doit pouvoir subir les front SCK qd même (LED clignote vite..)
+le SPI2 n'est pas utilisable car pin non connectées par défaut (sauf à modifier les SB). En fait la Nucléo fait un choix entre SPI1
+et SPI2 par soudage jumper (SB).
+
+-> Utiliser SPI1 avec la carte Nucléo
+
+ * **IO SPI 1**
+ SPI1_NSS PA4
+ SPI1_SCK PA5
+ SPI1_MISO PA6
+ SPI1_MOSI PA7
+
+ **IO SPI 2**
+ SPI2_NSS PB12
+ SPI2_SCK PB13
+ SPI2_MISO PB14
+ SPI2_MOSI PB15
+
+
+
+
+
+*************************************************************************************
+==================== Fondamentaux SPI ==========================================
+*************************************************************************************
+- Bus Synchrone, 4 fils (même si on peut l'utiliser en 3 fils)
+- Transfert à l'octet
+- Protocole entre un Master (contrôle SCK) et un Slave
+- SCK permet de synchroniser les bits de chaque octet. Il se configure par :
+ * son niveau de repos : ici niveau '1'
+ * le front actif de synchronisation pour chaque bit : ici front montant (front up durant bit stable)
+- /CS ou /NSS active le slave sur l'état bas
+- MOSI : Master Out Slave In (donc data circulant du Master vers le Slave, donc écriture dans le Slave)
+- MISO : Master In Slave Out (donc data circulant du Slave vers le Master, donc lecture du Slave)
+
+Bien que la lib propose une fonction d'écriture et de lecture :
+ * une écriture s'accompagne obligatoirement d'une lecture (bidon)
+ * une lecture s'accompagne obligatoirement d'une écriture (bidon)
+La gestion /CS = /NSS se fait "à la main". On peut alors lire toute une série d'octets
+en laissant /CS à l'état bas pendant toute la durée de circulation des octets.
+
+
+*************************************************************************************
+==================== La lib SPI ==========================================
+*************************************************************************************
+
+fonctions essentielles :
+
+MySPI_Init
+MySPI_Send
+MySPI_Read
+MySPI_Set_NSS
+MySPI_Clear_NSS
+
+
+==========================================================================================*/
+
+
+
+
+/*=========================================================================================
+ INITIALISATION SPI
+========================================================================================= */
+
+/**
+ * @brief Configure le SPI spécifié : FSCK = 281kHz, Repos SCK = '1', Front actif = up
+ Gestion /CS logicielle à part, configure les 4 IO
+ - SCK, MOSI : Out Alt push pull
+ - MISO : floating input
+ - /NSS (/CS) : Out push pull
+ * @param SPI_TypeDef * SPI : SPI1 ou SPI2
+ */
+void MySPI_Init(SPI_TypeDef * SPI);
+
+
+
+/**
+ * @brief Envoie un octet (/CS non géré, à faire logiciellement)
+ Plus en détail, émission de l'octet souhaité sur MOSI
+ Lecture en même temps d'un octet poubelle sur MISO (non exploité)
+ * @param : char ByteToSend : l'octet à envoyer
+ */
+void MySPI_Send(char ByteToSend);
+
+
+/**
+ * @brief Reçoit un octet (/CS non géré, à faire logiciellement)
+ Plus en détail, émission d'un octet bidon sur MOSI (0x00)
+ pour élaborer les 8 fronts sur SCK et donc piloter le slave en lecture
+ qui répond sur MISO
+ * @param : none
+ * @retval : l'octet lu.
+ */
+char MySPI_Read(void);
+
+
+
+/**
+ * @brief Positionne /CS = /NSS à '1'. A utiliser pour borner les octets à transmettre/recevoir
+ * @param : none
+ */
+void MySPI_Set_NSS(void);
+
+
+
+/**
+ * @brief Positionne /CS = /NSS à '0'. A utiliser pour borner les octets à transmettre/recevoir
+ * @param :none
+ */
+void MySPI_Clear_NSS(void);
+
+#endif
diff --git a/Drivers/Inc/Rouli.h b/Drivers/Inc/Rouli.h
new file mode 100644
index 0000000..629a765
--- /dev/null
+++ b/Drivers/Inc/Rouli.h
@@ -0,0 +1,4 @@
+#include "stm32f10x.h"
+
+
+char roulis (void);
diff --git a/Projet_DevDrivers/Rouli.c b/Projet_DevDrivers/Rouli.c
new file mode 100644
index 0000000..b1760a8
--- /dev/null
+++ b/Projet_DevDrivers/Rouli.c
@@ -0,0 +1,30 @@
+#include "stm32f10x.h"
+#include "GPIO.h"
+#include "TIMER.h"
+#include "MySPI.h"
+
+ char accelerometre = 0 ;
+/* Dans cette partie nous allons traiter le roulis du voiluier */
+char roulis (void)
+{
+
+
+
+ MySPI_Clear_NSS();
+/* Init de l'accelerometre avec SPI */
+ MySPI_Send(WRITE|DATA_FORMAT); /* Ecriture dans le data Format */
+ MySPI_Send(0x8B); /* Envoi des paramètres */
+ MySPI_Send(WRITE|BW_RATE); /* Ecriture dans le BW rate */
+ MySPI_Send(0x0A); /* Envoi des paramètres */
+ MySPI_Send(WRITE|POWER_CTL); /* Ecriture dans le POWER_CTL */
+ MySPI_Send(0x08); /* Envoi des paramètre */
+ MySPI_Send(READ|DATAX0);
+
+
+
+ accelerometre = MySPI_Read () ;
+
+
+ return accelerometre ;
+
+}
diff --git a/Projet_DevDrivers/Sources/Principal.c b/Projet_DevDrivers/Sources/Principal.c
index 1cd5850..938fcaf 100644
--- a/Projet_DevDrivers/Sources/Principal.c
+++ b/Projet_DevDrivers/Sources/Principal.c
@@ -1,7 +1,9 @@
#include "stm32f10x.h"
#include "GPIO.h"
#include "TIMER.h"
-
+#include "MyI2C.h"
+#include "MySPI.h"
+#include "Rouli.h"
void Mafonction_IT (void);
@@ -10,6 +12,7 @@ MyGPIO_Struct_TypeDef PC13;
MyTimer_Struct_TypeDef timer2;
//PA5 LED
//PC13 Bouton
+char accel;
int main ( void )
{
@@ -24,8 +27,10 @@ int main ( void )
MyTimer_ActiveIT(timer2.Timer,1, &Mafonction_IT);
MyTimer_Base_Start(timer2.Timer);
+ MySPI_Init(SPI1);
while(1)
{
+ accel = roulis();
}
}
diff --git a/Projet_DevDrivers/TP1.uvoptx b/Projet_DevDrivers/TP1.uvoptx
index 0dd3136..6bde06e 100644
--- a/Projet_DevDrivers/TP1.uvoptx
+++ b/Projet_DevDrivers/TP1.uvoptx
@@ -75,7 +75,7 @@
1
0
- 1
+ 0
18
@@ -125,7 +125,7 @@
0
DLGDARM
- (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=733,260,1154,687,0)(121=-1,-1,-1,-1,0)(122=1345,565,1766,992,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=1189,292,1783,1043,1)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)
+ (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(111=-1,-1,-1,-1,0)(1011=-1,-1,-1,-1,0)(180=-1,-1,-1,-1,0)(120=733,260,1154,687,0)(121=-1,-1,-1,-1,0)(122=1345,565,1766,992,0)(123=-1,-1,-1,-1,0)(140=-1,-1,-1,-1,0)(240=-1,-1,-1,-1,0)(190=-1,-1,-1,-1,0)(200=-1,-1,-1,-1,0)(170=-1,-1,-1,-1,0)(130=-1,-1,-1,-1,0)(131=1302,9,1896,760,1)(132=-1,-1,-1,-1,0)(133=-1,-1,-1,-1,0)(160=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(210=-1,-1,-1,-1,0)(211=-1,-1,-1,-1,0)(220=-1,-1,-1,-1,0)(221=-1,-1,-1,-1,0)(230=-1,-1,-1,-1,0)(234=-1,-1,-1,-1,0)(231=-1,-1,-1,-1,0)(232=-1,-1,-1,-1,0)(233=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(151=-1,-1,-1,-1,0)
0
@@ -159,7 +159,7 @@
0
0
0
- 1
+ 0
0
0
0
@@ -262,7 +262,7 @@
1
0
- 0
+ 1
18
@@ -356,7 +356,7 @@
0
0
0
- 1
+ 0
0
0
0
@@ -422,7 +422,7 @@
1
3
1
- 1
+ 0
0
0
..\Drivers\Src\TIMER.c
@@ -442,6 +442,30 @@
0
0
+
+ 1
+ 5
+ 4
+ 0
+ 0
+ 0
+ ..\Drivers\Inc\Lib_Com_Periph_2022.lib
+ Lib_Com_Periph_2022.lib
+ 0
+ 0
+
+
+ 1
+ 6
+ 1
+ 0
+ 0
+ 0
+ .\Rouli.c
+ Rouli.c
+ 0
+ 0
+
diff --git a/Projet_DevDrivers/TP1.uvprojx b/Projet_DevDrivers/TP1.uvprojx
index c873f2d..8e3b0d6 100644
--- a/Projet_DevDrivers/TP1.uvprojx
+++ b/Projet_DevDrivers/TP1.uvprojx
@@ -403,6 +403,16 @@
1
.\Sources\Bordage.c
+
+ Lib_Com_Periph_2022.lib
+ 4
+ ..\Drivers\Inc\Lib_Com_Periph_2022.lib
+
+
+ Rouli.c
+ 1
+ .\Rouli.c
+
@@ -810,6 +820,16 @@
1
.\Sources\Bordage.c
+
+ Lib_Com_Periph_2022.lib
+ 4
+ ..\Drivers\Inc\Lib_Com_Periph_2022.lib
+
+
+ Rouli.c
+ 1
+ .\Rouli.c
+