Séparation des fonctions du gyroscope

This commit is contained in:
Samuel 2022-09-23 22:09:40 +02:00
parent 8433c1b6c7
commit f1221027cc
4 changed files with 104 additions and 92 deletions

View File

@ -6,6 +6,7 @@ set(CMAKE_CXX_STANDARD 17)
pico_sdk_init() pico_sdk_init()
add_executable(test add_executable(test
test.c test.c
gyro.c
) )
pico_enable_stdio_usb(test 1) pico_enable_stdio_usb(test 1)
pico_enable_stdio_uart(test 1) pico_enable_stdio_uart(test 1)

97
gyro.c Normal file
View File

@ -0,0 +1,97 @@
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/gpio.h"
#include "hardware/spi.h"
const uint PIN_CS = 1;
static inline void cs_select();
static inline void cs_deselect();
int gyro_init_check();
int gyro_read_register_blocking(uint8_t registrer, uint8_t *tampon, uint8_t nb_a_lire);
void Gyro_Init(void){
//
gpio_set_function(16, GPIO_FUNC_SPI); // SDI
gpio_set_function(18, GPIO_FUNC_SPI); // SCK
gpio_set_function(19, GPIO_FUNC_SPI); // SDO
gpio_set_function(PIN_CS, GPIO_OUT); // CSn
gpio_init(PIN_CS);
gpio_set_dir(PIN_CS, GPIO_OUT);
cs_deselect();
spi_init(spi0, 100 * 1000); // SPI init @ 100 kHZ
//Ça doit être les valeurs par défaut, mais ça marche !
spi_set_format(spi0, 8, SPI_CPHA_1, SPI_CPOL_1, SPI_MSB_FIRST);
// Test de la présence du gyroscope :
if(gyro_init_check()){
puts("Gyroscope non trouve");
}else{
puts("Gyroscope trouve");
}
}
int gyro_init_check(){
// Renvoi 0 si l'initialisation s'est bien passée
// Renvoi 1 si le gyroscope n'a pas répondu
uint8_t tampon[2]="";
gyro_read_register_blocking(0x0F, tampon, 1);
if(tampon[0] == 0xd7){
return 0;
}
return 1;
}
int gyro_read_register_blocking(uint8_t registrer, uint8_t *tampon, uint8_t nb_a_lire){
uint8_t reg = registrer | 0xC0 ;
int nb_recu;
cs_select();
spi_write_blocking(spi0, &reg, 1);
sleep_ms(10);
nb_recu = spi_read_blocking(spi0, 0, tampon, nb_a_lire);
cs_deselect();
}
void Gyro_Read(void){
uint8_t tampon[10]="";
uint8_t reg[2] = {0x0F | 0x80 | 0x40, '\0'};
int nb_recu;
// Lire l'adresse d'identification
// WHO_AM_I : 0x0F
cs_select();
puts("Envoi");
spi_write_blocking(spi0, reg, 1);
// Doit répondre : 0b1101 0111
puts(reg);
puts("Lecture");
sleep_ms(10);
nb_recu = spi_read_blocking(spi0, 0x55, tampon, 1);
tampon[nb_recu]='\0';
puts(tampon);
cs_deselect();
}
static inline void cs_select() {
asm volatile("nop \n nop \n nop");
gpio_put(PIN_CS, 0); // Active low
asm volatile("nop \n nop \n nop");
}
static inline void cs_deselect() {
asm volatile("nop \n nop \n nop");
gpio_put(PIN_CS, 1);
asm volatile("nop \n nop \n nop");
}

2
gyro.h Normal file
View File

@ -0,0 +1,2 @@
void Gyro_Init(void);
void Gyro_Read(void);

96
test.c
View File

@ -1,31 +1,13 @@
#include <stdio.h> #include <stdio.h>
#include "pico/stdlib.h" #include "pico/stdlib.h"
#include "hardware/gpio.h" #include "hardware/gpio.h"
#include "hardware/spi.h"
#include "hardware/i2c.h" #include "hardware/i2c.h"
#include "pico/binary_info.h" #include "pico/binary_info.h"
#include "gyro.h"
const uint PIN_CS = 1;
const uint LED_PIN = 25; const uint LED_PIN = 25;
void init_gyro(void);
void read_gyro(void);
void read_gyro_i2c();
void init_gyro_i2c();
static inline void cs_select() {
asm volatile("nop \n nop \n nop");
gpio_put(PIN_CS, 0); // Active low
asm volatile("nop \n nop \n nop");
}
static inline void cs_deselect() {
asm volatile("nop \n nop \n nop");
gpio_put(PIN_CS, 1);
asm volatile("nop \n nop \n nop");
}
int main() { int main() {
bi_decl(bi_program_description("This is a test binary.")); bi_decl(bi_program_description("This is a test binary."));
bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED")); bi_decl(bi_1pin_with_name(LED_PIN, "On-board LED"));
@ -36,7 +18,8 @@ int main() {
gpio_set_dir(LED_PIN, GPIO_OUT); gpio_set_dir(LED_PIN, GPIO_OUT);
gpio_put(LED_PIN, 1); gpio_put(LED_PIN, 1);
init_gyro();
Gyro_Init();
while (1) { while (1) {
/*gpio_put(LED_PIN, 0); /*gpio_put(LED_PIN, 0);
@ -45,77 +28,6 @@ int main() {
puts("Bonjour"); puts("Bonjour");
sleep_ms(1000);*/ sleep_ms(1000);*/
sleep_ms(1000); sleep_ms(1000);
read_gyro(); Gyro_Read();
} }
} }
void init_gyro_i2c(){
gpio_set_function(0, GPIO_FUNC_I2C); // SDA
gpio_set_function(1, GPIO_FUNC_I2C); // SCL
i2c_init(i2c0, 40 * 1000);
}
void read_gyro_i2c(){
uint8_t tampon[10]="";
uint8_t reg = 0x0F;
int rep;
uint8_t adresse_7bits = 0b1101011;
// Envoi adresse registre à lire
rep = i2c_write_blocking(i2c0, adresse_7bits, &reg, 1, true );
if(rep == PICO_ERROR_GENERIC){
puts("Erreur I2C");
}else{
puts("envoi OK");
}
// Lecture identification
rep = i2c_read_blocking(i2c0, adresse_7bits, tampon, 1, false );
if(rep == PICO_ERROR_GENERIC){
puts("Erreur I2C");
}else{
puts("Reception OK");
puts(tampon);
}
}
void init_gyro(void){
//
gpio_set_function(16, GPIO_FUNC_SPI); // SDI
gpio_set_function(18, GPIO_FUNC_SPI); // SCK
gpio_set_function(19, GPIO_FUNC_SPI); // SDO
gpio_set_function(PIN_CS, GPIO_OUT); // CSn
gpio_init(PIN_CS);
gpio_set_dir(PIN_CS, GPIO_OUT);
cs_deselect();
spi_init(spi0, 100 * 1000); // SPI init @ 100 kHZ
//Ça doit être les valeurs par défaut, mais ça marche !
spi_set_format(spi0, 8, SPI_CPHA_1, SPI_CPOL_1, SPI_MSB_FIRST);
}
void read_gyro(void){
uint8_t tampon[10]="";
uint8_t reg[2] = {0x0F | 0x80 | 0x40, '\0'};
int nb_recu;
// Lire l'adresse d'identification
// WHO_AM_I : 0x0F
cs_select();
puts("Envoi");
spi_write_blocking(spi0, reg, 1);
// Doit répondre : 0b1101 0111
puts(reg);
puts("Lecture");
sleep_ms(10);
nb_recu = spi_read_blocking(spi0, 0x55, tampon, 1);
tampon[nb_recu]='\0';
puts(tampon);
cs_deselect();
}