diff --git a/Accelerometre.c b/Accelerometre.c new file mode 100644 index 0000000..ec748d9 --- /dev/null +++ b/Accelerometre.c @@ -0,0 +1,93 @@ +#include +#include +#include +#include +#include +#include + +//Pin GPIOA_9 et GPIOA_10 sont pris par USART + +/* +I2C SDA IN/OUT +I2C SCL OUT +*/ + + + //il faut recuperer le data qui sort + + /* + SPI1_NSS PA4 - Utilisé + NSS = 0 -> slave active + NSS = 1 -> slave inactive + + SPI1_SCK PA5 + SPI1_MISO PA6 + SPI1_MOSI PA7 + + TIM3 CH3 PB0 + +0x32 50 DATAX0 R 00000000 X-Axis Data 0 +0x33 51 DATAX1 R 00000000 X-Axis Data 1 +0x34 52 DATAY0 R 00000000 Y-Axis Data 0 +0x35 53 DATAY1 R 00000000 Y-Axis Data 1 +0x36 54 DATAZ0 R 00000000 Z-Axis Data 0 +0x37 55 DATAZ1 R 00000000 Z-Axis Data 1 + + */ + +void initAccelo(void){ + MySPI_Init(SPI1); //Active le SCK +} + + +// send bits, les bits inclus en char envoyés: RW MB Adress_bit5 @4 @3 @2 @1 @0 +//RW: R = 1 et W = 0 +//MB à 1 veut measurement et MB à 0 Standby +uint16_t * RecupAccelo(void){ //Renvoie 48 en forme des chars + static uint16_t Messias[3]; + + //On lit X0 + MySPI_Clear_NSS();//Mettre la broche PA4 à 0 + MySPI_Send(0b11110010); //Lecture de X0 et MB à 1 pour garder les valeurs + uint16_t X0 = MySPI_Read(); + MySPI_Set_NSS(); //Mettre la broche PA4 à 1 + + //On lit X1 + MySPI_Clear_NSS();//Mettre la broche PA4 à 0 + MySPI_Send(0b10110011); //Lecture de X1 + Messias[0] = X0 | (MySPI_Read() << 8); + MySPI_Set_NSS(); //Mettre la broche PA4 à 1 + + //On lit Y0 + MySPI_Clear_NSS();//Mettre la broche PA4 à 0 + MySPI_Send(0b10110100); //Lecture de Y0 + uint16_t Y0 = MySPI_Read(); + MySPI_Set_NSS(); //Mettre la broche PA4 à 1 + + //On lit Y1 + MySPI_Clear_NSS();//Mettre la broche PA4 à 0 + MySPI_Send(0b10110101); //Lecture de Y1 + Messias[1] = Y0 | (MySPI_Read() << 8); + MySPI_Set_NSS(); //Mettre la broche PA4 à 1 + + //On lit Z0 + MySPI_Clear_NSS();//Mettre la broche PA4 à 0 + MySPI_Send(0b10110110); //Lecture de Z0 + uint16_t Z0 = MySPI_Read(); + MySPI_Set_NSS(); //Mettre la broche PA4 à 1 + + //On lit Z1 + MySPI_Clear_NSS();//Mettre la broche PA4 à 0 + MySPI_Send(0b10110111); //Lecture de Z1 + Messias[2] = Z0 | (MySPI_Read() << 8); + MySPI_Set_NSS(); //Mettre la broche PA4 à 1 + + return Messias; +} + + + + + + + diff --git a/Accelerometre.h b/Accelerometre.h new file mode 100644 index 0000000..b4c9903 --- /dev/null +++ b/Accelerometre.h @@ -0,0 +1,2 @@ +void initAccelo(void); +void RecupAccelo(void); \ No newline at end of file diff --git a/MySPI.h b/MySPI.h new file mode 100644 index 0000000..560404c --- /dev/null +++ b/MySPI.h @@ -0,0 +1,129 @@ + +#ifndef INC_MYSPI_H_ +#define INC_MYSPI_H_ + +#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 + + +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