L3G4200 and STM32F103C8T6

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Аватара пользователя
Дима_Медвед
Открыл глаза
Сообщения: 73
Зарегистрирован: Сб авг 23, 2014 21:49:24

L3G4200 and STM32F103C8T6

Сообщение Дима_Медвед »

Всем доброго времени суток!
Недавно начал разбираться з гироскопом L3G4200 и столкнулся с следующей проблемой: регистри читаються как 0хFF.
Пишу в CooCox с использованием SPL.
Заголовочний файл

Код: Выделить всё

#include <stm32f10x.h>
#include "stm32f10x_spi.h"
#include "stm32f10x_gpio.h"

#define L3G4200_GYRO_SPI_SET SPI2  //Вибрати SPI

#define L3G4200_GYRO_SPI_GPIO GPIOB                    //SPI GPIO
#define L3G4200_GYRO_GPIO GPIOB                        //Hardware GPIO
#define L3G4200_GYRO_SPI_CLOCK_SET RCC_APB1Periph_SPI2 //Тактування SPI
#define L3G4200_GYRO_GPIO_SPI_SET RCC_APB2Periph_GPIOB //Таткування для порта SPI
#define L3G4200_GYRO_GPIO_SET RCC_APB2Periph_GPIOB     //Тактування для порта hardware

#define L3G4200_GYRO_CS GPIO_Pin_0            //Chip select
#define L3G4200_GYRO_MISO GPIO_Pin_14         //Miso  (SDO)
#define L3G4200_GYRO_MOSI GPIO_Pin_15         //Mosi  (SDA/SDI)
#define L3G4200_GYRO_SCK GPIO_Pin_13          //Clock (SCL/SPC)
#define L3G4200_GYRO_DATA_READY GPIO_Pin_1    //Data ready/FIFO interrupt
#define L3G4200_GYRO_INT GPIO_Pin_10          //Programmable interrupt

#define L3G4200_GYRO_CS_HIGH GPIO_SetBits(L3G4200_GYRO_GPIO, L3G4200_GYRO_CS)
#define L3G4200_GYRO_CS_LOW  GPIO_ResetBits(L3G4200_GYRO_GPIO, L3G4200_GYRO_CS)

#define L3G4200_GYRO_REG_WHO_I_AM      0x0F
#define L3G4200_GYRO_REG_CTRL_REG1     0x20
#define L3G4200_GYRO_REG_CTRL_REG2     0x21
#define L3G4200_GYRO_REG_CTRL_REG3     0x22
#define L3G4200_GYRO_REG_CTRL_REG4     0x23
#define L3G4200_GYRO_REG_CTRL_REG5     0x24
#define L3G4200_GYRO_REG_REFERENCE     0x25
#define L3G4200_GYRO_REG_OUT_TEMP      0x26
#define L3G4200_GYRO_REG_STATUS        0x27
#define L3G4200_GYRO_REG_OUT_X_L       0x28
#define L3G4200_GYRO_REG_OUT_X_H       0x29
#define L3G4200_GYRO_REG_OUT_Y_L       0x2A
#define L3G4200_GYRO_REG_OUT_Y_H       0x2B
#define L3G4200_GYRO_REG_OUT_Z_L       0x2C
#define L3G4200_GYRO_REG_OUT_Z_H       0x2D
#define L3G4200_GYRO_REG_FIFO_CTRL     0x2E
#define L3G4200_GYRO_REG_FIFO_SRC      0x2F
#define L3G4200_GYRO_REG_INT1_CFG      0x30
#define L3G4200_GYRO_REG_INT1_SRC      0x31
#define L3G4200_GYRO_REG_INT1_TSH_XH   0x32
#define L3G4200_GYRO_REG_INT1_TSH_XL   0x33
#define L3G4200_GYRO_REG_INT1_TSH_YH   0x34
#define L3G4200_GYRO_REG_INT1_TSH_YL   0x35
#define L3G4200_GYRO_REG_INT1_TSH_ZH   0x36
#define L3G4200_GYRO_REG_INT1_TSH_ZL   0x37
#define L3G4200_GYRO_REG_INT1_DURATION 0x38


class L3G4200_Driver {
public:
   void L3G4200_Gyro_SPI_Init (void);
   void L3G4200_Gyro_Init (void);
   int L3G4200_Gyro_Read_Register (uint16_t Register);
   void L3G4200_Gyro_Write_Register (char Register, char Value); //Записати регістр L3G4200

private:
   int Send_Data;
   char Get_Data;
};

Исходний код

Код: Выделить всё

#include "L3G4200.h"

void L3G4200_Driver::L3G4200_Gyro_SPI_Init (void) {
   //Ввімкнути тактування
   RCC_APB2PeriphClockCmd(L3G4200_GYRO_GPIO_SPI_SET, ENABLE);
   RCC_APB2PeriphClockCmd(L3G4200_GYRO_GPIO_SET, ENABLE);
   //Ініціалізація SPI ліній
   GPIO_InitTypeDef L3G4200_GPIO_SET;
   L3G4200_GPIO_SET.GPIO_Mode = GPIO_Mode_AF_PP;
   L3G4200_GPIO_SET.GPIO_Speed = GPIO_Speed_50MHz;
   L3G4200_GPIO_SET.GPIO_Pin = L3G4200_GYRO_MISO | L3G4200_GYRO_MOSI | L3G4200_GYRO_SCK;
   GPIO_Init(L3G4200_GYRO_SPI_GPIO, &L3G4200_GPIO_SET);
   //CS
   L3G4200_GPIO_SET.GPIO_Mode = GPIO_Mode_Out_PP;
   L3G4200_GPIO_SET.GPIO_Speed = GPIO_Speed_50MHz;
   L3G4200_GPIO_SET.GPIO_Pin = L3G4200_GYRO_CS;
   GPIO_Init(L3G4200_GYRO_SPI_GPIO, &L3G4200_GPIO_SET);
   //Ініціалізація решти ліній
   L3G4200_GPIO_SET.GPIO_Mode = GPIO_Mode_IN_FLOATING;
   L3G4200_GPIO_SET.GPIO_Speed = GPIO_Speed_50MHz;
   L3G4200_GPIO_SET.GPIO_Pin = L3G4200_GYRO_INT | L3G4200_GYRO_DATA_READY;
   GPIO_Init(L3G4200_GYRO_GPIO, &L3G4200_GPIO_SET);
//Ініціалізація SPI
   //Ввімкнути тактування SPI
    RCC_APB1PeriphClockCmd(L3G4200_GYRO_SPI_CLOCK_SET, ENABLE);
    SPI_InitTypeDef L3G4200_SPI_SET;
    L3G4200_SPI_SET.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    L3G4200_SPI_SET.SPI_Mode = SPI_Mode_Master;
    L3G4200_SPI_SET.SPI_DataSize = SPI_DataSize_8b;
    L3G4200_SPI_SET.SPI_CPOL = SPI_CPOL_High;
    L3G4200_SPI_SET.SPI_CPHA = SPI_CPHA_2Edge;
    L3G4200_SPI_SET.SPI_NSS = SPI_NSS_Soft;
    L3G4200_SPI_SET.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;
    L3G4200_SPI_SET.SPI_FirstBit = SPI_FirstBit_MSB;
    L3G4200_SPI_SET.SPI_CRCPolynomial = 7;
   SPI_Init(L3G4200_GYRO_SPI_SET, &L3G4200_SPI_SET);
    SPI_Cmd(L3G4200_GYRO_SPI_SET, ENABLE);
   SPI_NSSInternalSoftwareConfig(L3G4200_GYRO_SPI_SET, SPI_NSSInternalSoft_Set);
}

void L3G4200_Driver::L3G4200_Gyro_Init (void) {

}

void L3G4200_Driver::L3G4200_Gyro_Write_Register (char Register, char Value) {
    L3G4200_GYRO_CS_LOW;
    SPI_I2S_SendData(L3G4200_GYRO_SPI_SET, (Register &= 0b01111111));
    while(SPI_I2S_GetFlagStatus(L3G4200_GYRO_SPI_SET, SPI_I2S_FLAG_BSY) == SET);
    SPI_I2S_SendData(L3G4200_GYRO_SPI_SET, Value);
    while(SPI_I2S_GetFlagStatus(L3G4200_GYRO_SPI_SET, SPI_I2S_FLAG_BSY) == SET);
    L3G4200_GYRO_CS_LOW;
}

int L3G4200_Driver::L3G4200_Gyro_Read_Register (uint16_t Register) {
   int Data = 0;
   L3G4200_GYRO_CS_LOW;
   SPI_I2S_SendData(L3G4200_GYRO_SPI_SET, (Register |= 0x80));
    while(SPI_I2S_GetFlagStatus(L3G4200_GYRO_SPI_SET, SPI_I2S_FLAG_BSY) == SET);

   SPI_I2S_SendData(L3G4200_GYRO_SPI_SET, 0x00);
    while(SPI_I2S_GetFlagStatus(L3G4200_GYRO_SPI_SET, SPI_I2S_FLAG_BSY) == SET);

    if (SPI_I2S_GetFlagStatus(L3G4200_GYRO_SPI_SET, SPI_I2S_FLAG_RXNE) == SET) {
       Data = SPI_I2S_ReceiveData(L3G4200_GYRO_SPI_SET);
    }

    L3G4200_GYRO_CS_HIGH;
   return Data;
}
Ответить

Вернуться в «Периферия»