#include "iostm8l152c6.h"
#include "Gyros.h"
unsigned int EIR=0,status=0,a=0,b=0;
unsigned int x[3],y[3],z[3];
void IO_init() //初始化IO口
{
PB_DDR |= MASK_PB_DDR_DDR5 | MASK_PB_DDR_DDR6;
PB_CR1 |= MASK_PB_CR1_C15 | MASK_PB_CR1_C16;
PB_CR2 |= MASK_PB_CR2_C25 | MASK_PB_CR2_C26;
//PB5(CLK),PB6(MOSI)设置为快速推挽输出,PB7(MISO)为悬浮输入
PD_DDR |= MASK_PD_DDR_DDR7;
PD_CR1 |= MASK_PD_CR1_C17;
//PD(CS)为推挽输出
}
void SPI1_MOSI_init() //初始化SPI
{
CLK_CKDIVR = 0X03; //时钟8KHZ
CLK_PCKENR1 = 0X10; //开外部时钟门控
SPI1_CR2 |= MASK_SPI1_CR2_SSM; //设置为软件控制SNN
SPI1_CR2 |= MASK_SPI1_CR2_SSI; //设置为主模式
SPI1_CR1 |= MASK_SPI1_CR1_MSTR | MASK_SPI1_CR1_SPE; //开启主模式,SPI1使能
}
void L3G4200D_write(unsigned char a, unsigned char b)
{
while(!(SPI1_SR & 0X02));
SPI1_DR = a;
while(!(SPI1_SR & 0X02));
SPI1_DR = b;
}
long int L3G4200D_read(unsigned char m, unsigned char n)
{
while(!(SPI1_SR & 0X02));
SPI1_DR = m | 0X80; //read signal
while(!(SPI1_SR & 0X02));
SPI1_DR = n;
while(!(SPI1_SR & 0X01));
a = SPI1_DR;
while(!(SPI1_SR & 0X01));
b = SPI1_DR;
a = a | (b << 8);
return (a);
}
void L3G4200D_init() //初始化陀螺仪
{
L3G4200D_write(L3G4200D_CTRL_REG1,0x4f);
L3G4200D_write(L3G4200D_CTRL_REG2,0x20);
L3G4200D_write(L3G4200D_CTRL_REG5,0x10);
}
void L3G4200D_value_x() //读X的值
{
x[0] = L3G4200D_read(L3G4200D_OUT_X_L,0X00);
x[1] = L3G4200D_read(L3G4200D_OUT_X_H,0X00);
x[2] = x[0] | (x[1] << 8);
}
void L3G4200D_value_y() //读y的值
{
y[0] = L3G4200D_read(L3G4200D_OUT_Y_L,0X00);
y[1] = L3G4200D_read(L3G4200D_OUT_Y_H,0X00);
y[2] = y[0] | (y[1] << 8);
}
void L3G4200D_value_z() //读z的值
{
z[0] = L3G4200D_read(L3G4200D_OUT_Z_L,0X00);
z[1] = L3G4200D_read(L3G4200D_OUT_Z_H,0X00);
z[2] = z[0] | (z[1] << 8);
}
int main( void )
{
IO_init();
PD_ODR &= ~MASK_PD_ODR_ODR7; //CE=0;open
//PD_ODR |= MASK_PD_ODR_ODR7;
SPI1_MOSI_init();
L3G4200D_init();
EIR = L3G4200D_read(L3G4200D_WHO_AM_I,0X00);
status = L3G4200D_read(L3G4200D_STATUS_REG,0X00);
while(!(status & 0X08));
if(status & 0X01)
{
L3G4200D_value_x();
}
if(status & 0X02)
{
L3G4200D_value_y();
}
if(status & 0X04)
{
L3G4200D_value_z();
}
while(1)
{
}
}
感觉就没有读过gyros, CE使能和不使能读出来都是65535. |