|
发表于 2009-4-25 00:59:09
|
显示全部楼层
#ifndef _ADIS16100_H_
#define _ADIS16100_H_
#include <avr/io.h>
#include <avr/interrupt.h>
#include "global.h"
#include "spi.h"
// Chip select pin
#define ADI_CS_PORT PORTB
#define ADI_CS_DDR DDRB
#define ADI_CS_PIN 2
#define ADI_CS_LOW() cbi(ADI_CS_PORT,ADI_CS_PIN)
#define ADI_CS_HIGH() sbi(ADI_CS_PORT,ADI_CS_PIN)
struct ADIS16100_Packet {
unsigned int DC03 :4;
unsigned int Code :1;
unsigned int Zero5 :1;
unsigned int DC67 :2;
unsigned int One89 :2;
unsigned int Addr :2;
unsigned int DC1213 :2;
unsigned int Zero14 :1;
unsigned int Write :1;
};
union U16_DATA {
struct ADIS16100_Packet packet;
u16 u16_data;
};
void ADIS16100_Init();
void ADIS16100_StructInit( struct ADIS16100_Packet * packet );
u16 ADIS16100_ReadGyro( struct ADIS16100_Packet * packet );
u16 ADIS16100_SendCommand( u16 cmd );
#endif//_ADIS16100_H_
/********************************************************************************/
#include "ADIS16100.h"
#include "spi.h"
void ADIS16100_Init()
{
spiInit();
// release chip select
sbi(ADI_CS_DDR, ADI_CS_PIN);
sbi(ADI_CS_PORT,ADI_CS_PIN);
//sbi(ADI_EN_DDR, ADI_EN_PIN);
//cbi(ADI_EN_PORT,ADI_EN_PIN);
}
void ADIS16100_StructInit( struct ADIS16100_Packet * packet )
{
packet->Write = 1;
packet->Zero14 = 0;
packet->Addr = 0;
packet->One89 = 3;
packet->Zero5 = 0;
packet->Code = 0;
}
u16 ADIS16100_ReadGyro( struct ADIS16100_Packet * packet )
{
union U16_DATA data;
u16 result;
packet->Write = 1;
packet->Addr = 0;
data.packet = *packet;
ADIS16100_SendCommand( data.u16_data );
packet->Write = 0;
result = ADIS16100_SendCommand( data.u16_data );
if( result & 0x0800 ){
result |= 0xF000;
}
return result;
}
u16 ADIS16100_SendCommand( u16 cmd )
{
u16 result;
ADI_CS_LOW();
result = spiTransferWord(cmd);
ADI_CS_HIGH();
return result;
}
/********************************************************************************/
#ifndef GLOBAL_H
#define GLOBAL_H
// global AVRLIB defines
//#include "avrlibdefs.h"
// global AVRLIB types definitions
//#include "avrlibtypes.h"
// project/system dependent defines
// CPU clock speed
//#define F_CPU 16000000 // 16MHz processor
//#define F_CPU 14745000 // 14.745MHz processor
//#define F_CPU 8000000 // 8MHz processor
//#define F_CPU 7372800 // 7.37MHz processor
//#define F_CPU 4000000 // 4MHz processor
//#define F_CPU 3686400 // 3.69MHz processor
#define CYCLES_PER_US ((F_CPU+500000)/1000000) // cpu cycles per microsecond
typedef unsigned char u08;
typedef unsigned int u16;
typedef unsigned long int u32;
#define FALSE 0
#define TRUE 1
#define outp(DATA,PORT) (PORT = (DATA))
#define inp(PORT) (PORT)
#define sbi(REG,PIN) (REG|=(_BV(PIN)))
#define cbi(REG,PIN) (REG&=~(_BV(PIN)))
#endif
/********************************************************************************/
ADIS16100_Init();
ADIS16100_StructInit(&packet);
while(1) {
u16 gyro_result;
gyro_result = ADIS16100_ReadGyro(&packet);
printf("GYRO = %d\n", gyro_result);
_delay_ms(20.0);
} |
|