Недавно начал разбираться з гироскопом 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;
}