mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-06 07:53:43 +08:00
SCP1000 I2C fixes
This commit is contained in:
@@ -79,7 +79,9 @@
|
||||
</section>
|
||||
|
||||
<section name="BAT">
|
||||
<define name="MILLIAMP_PER_PERCENT" value="0.86"/>
|
||||
<!--define name="MILLIAMP_AT_FULL_THROTTLE" value="10000."/-->
|
||||
<define name="ADC_CHANNEL_CURRENT" value="ADC_6"/>
|
||||
<define name="MilliAmpereOfAdc(adc)" value="(88*adc)"/>
|
||||
<define name="CATASTROPHIC_BAT_LEVEL" value="9.3" unit="V"/>
|
||||
<!-- 0.0247311828 -->
|
||||
<!-- 0.02432905 -->
|
||||
@@ -176,9 +178,25 @@
|
||||
<define name="DEVICE_ADDRESS" value="...."/>
|
||||
</section>
|
||||
|
||||
<section name="SIMU">
|
||||
<define name="YAW_RESPONSE_FACTOR" value="0.5"/>
|
||||
</section>
|
||||
<section name="MICROMAG">
|
||||
|
||||
<define name="MM_SS_PIN" value="20"/>
|
||||
<define name="MM_SS_IODIR" value="IO0DIR"/>
|
||||
<define name="MM_SS_IOSET" value="IO0SET"/>
|
||||
<define name="MM_SS_IOCLR" value="IO0CLR"/>
|
||||
|
||||
<define name="MM_RESET_PIN" value="29"/>
|
||||
<define name="MM_RESET_IODIR" value="IO0DIR"/>
|
||||
<define name="MM_RESET_IOSET" value="IO0SET"/>
|
||||
<define name="MM_RESET_IOCLR" value="IO0CLR"/>
|
||||
|
||||
<define name="MM_DRDY_PINSEL" value="PINSEL1"/>
|
||||
<define name="MM_DRDY_PINSEL_BIT" value="0"/>
|
||||
<define name="MM_DRDY_PINSEL_VAL" value="1"/>
|
||||
<define name="MM_DRDY_EINT" value="0"/>
|
||||
<define name="MM_DRDY_VIC_IT" value="VIC_EINT0"/>
|
||||
|
||||
</section>
|
||||
|
||||
<makefile>
|
||||
CONFIG = \"tiny_2_1.h\"
|
||||
@@ -205,11 +223,10 @@ ap.srcs += downlink.c $(SRC_ARCH)/uart_hw.c datalink.c xbee.c
|
||||
#ap.CFLAGS += -DDOWNLINK -DUSE_UART1 -DDOWNLINK_TRANSPORT=PprzTransport -DDOWNLINK_FBW_DEVICE=Uart1 -DDOWNLINK_AP_DEVICE=Uart1 -DPPRZ_UART=Uart1 -DDATALINK=PPRZ -DUART1_BAUD=B9600
|
||||
#ap.srcs += downlink.c $(SRC_ARCH)/uart_hw.c datalink.c pprz_transport.c
|
||||
|
||||
|
||||
ap.CFLAGS += -DINTER_MCU
|
||||
ap.srcs += inter_mcu.c
|
||||
|
||||
ap.CFLAGS += -DADC -DUSE_ADC_0 -DUSE_ADC_1 -DUSE_ADC_2
|
||||
ap.CFLAGS += -DADC -DUSE_ADC_0 -DUSE_ADC_1 -DUSE_ADC_2 -DUSE_ADC_6
|
||||
ap.srcs += $(SRC_ARCH)/adc_hw.c
|
||||
|
||||
ap.CFLAGS += -DGPS -DUBX -DUSE_UART0 -DGPS_LINK=Uart0 -DUART0_BAUD=B38400 -DGPS_USE_LATLONG
|
||||
@@ -225,14 +242,16 @@ ap.srcs += nav.c fw_h_ctl.c fw_v_ctl.c
|
||||
ap.srcs += nav_line.c
|
||||
ap.srcs += nav_survey_rectangle.c
|
||||
|
||||
|
||||
ap.CFLAGS += -DMICROMAG_DRDY_VIC_SLOT=12 -DSSP_VIC_SLOT=11 -DUSE_MICROMAG_FW
|
||||
ap.srcs += micromag_fw.c $(SRC_ARCH)/micromag_fw_hw.c
|
||||
|
||||
ap.srcs += humid_sht.c
|
||||
ap.CFLAGS += -DUSE_HUMID_SHT -DDAT_PIN=3 -DSCK_PIN=2
|
||||
ap.CFLAGS += -DUSE_HUMID_SHT -DDAT_PIN=30 -DSCK_PIN=4
|
||||
|
||||
ap.srcs += baro_scp.c
|
||||
ap.CFLAGS += -DUSE_BARO_SCP
|
||||
ap.srcs += i2c.c arm7/i2c_hw.c baro_scp_i2c.c
|
||||
ap.CFLAGS += -DUSE_I2C0 -DUSE_BARO_SCP
|
||||
|
||||
ap.srcs += joystick.c
|
||||
ap.CFLAGS += -DUSE_JOYSTICK
|
||||
|
||||
# Config for SITL simulation
|
||||
include $(PAPARAZZI_SRC)/conf/autopilot/sitl.makefile
|
||||
|
||||
@@ -35,23 +35,18 @@
|
||||
|
||||
<airframe name="Logger">
|
||||
|
||||
<section name="MICROMAG">
|
||||
<section name="MAX11040">
|
||||
|
||||
<define name="MM_SS_PIN" value="20"/>
|
||||
<define name="MM_SS_IODIR" value="IO0DIR"/>
|
||||
<define name="MM_SS_IOSET" value="IO0SET"/>
|
||||
<define name="MM_SS_IOCLR" value="IO0CLR"/>
|
||||
<define name="MAXM_SS_PIN" value="20"/>
|
||||
<define name="MAXM_SS_IODIR" value="IO0DIR"/>
|
||||
<define name="MAXM_SS_IOSET" value="IO0SET"/>
|
||||
<define name="MAXM_SS_IOCLR" value="IO0CLR"/>
|
||||
|
||||
<define name="MM_RESET_PIN" value="29"/>
|
||||
<define name="MM_RESET_IODIR" value="IO0DIR"/>
|
||||
<define name="MM_RESET_IOSET" value="IO0SET"/>
|
||||
<define name="MM_RESET_IOCLR" value="IO0CLR"/>
|
||||
|
||||
<define name="MM_DRDY_PINSEL" value="PINSEL1"/>
|
||||
<define name="MM_DRDY_PINSEL_BIT" value="0"/>
|
||||
<define name="MM_DRDY_PINSEL_VAL" value="1"/>
|
||||
<define name="MM_DRDY_EINT" value="0"/>
|
||||
<define name="MM_DRDY_VIC_IT" value="VIC_EINT0"/>
|
||||
<define name="MAXM_DRDY_PINSEL" value="PINSEL1"/>
|
||||
<define name="MAXM_DRDY_PINSEL_BIT" value="0"/>
|
||||
<define name="MAXM_DRDY_PINSEL_VAL" value="1"/>
|
||||
<define name="MAXM_DRDY_EINT" value="0"/>
|
||||
<define name="MAXM_DRDY_VIC_IT" value="VIC_EINT0"/>
|
||||
|
||||
</section>
|
||||
|
||||
@@ -64,7 +59,7 @@ include $(PAPARAZZI_SRC)/conf/autopilot/tiny.makefile
|
||||
FLASH_MODE=IAP
|
||||
|
||||
ap.CFLAGS += -DBOARD_CONFIG=$(CONFIG) -DLED -DLOGGER
|
||||
ap.srcs = sys_time.c $(SRC_ARCH)/sys_time_hw.c $(SRC_ARCH)/armVIC.c main_logger_adc.c
|
||||
ap.srcs = sys_time.c $(SRC_ARCH)/sys_time_hw.c $(SRC_ARCH)/armVIC.c main_logger.c
|
||||
|
||||
#choose one
|
||||
ap.CFLAGS += -DLOG_XBEE
|
||||
@@ -75,6 +70,9 @@ ap.CFLAGS += -DUSE_UART0 -DUART0_BAUD=B57600 -DUSE_UART0_RX_ONLY
|
||||
ap.CFLAGS += -DUSE_UART1 -DUART1_BAUD=B57600 -DUSE_UART1_RX_ONLY
|
||||
ap.srcs += $(SRC_ARCH)/uart_hw.c
|
||||
|
||||
#set SPI interface for SD card (0 or 1)
|
||||
ap.CFLAGS += -DHW_ENDPOINT_LPC2000_SPINUM=0
|
||||
|
||||
#efsl
|
||||
ap.CFLAGS += -I $(SRC_ARCH)/efsl/inc -I $(SRC_ARCH)/efsl/conf
|
||||
|
||||
@@ -98,7 +96,7 @@ ap.srcs += $(SRC_ARCH)/usb_msc_hw.c
|
||||
ap.srcs += $(SRC_ARCH)/lpcusb/usbhw_lpc.c $(SRC_ARCH)/lpcusb/usbcontrol.c $(SRC_ARCH)/lpcusb/usbstdreq.c $(SRC_ARCH)/lpcusb/usbinit.c
|
||||
ap.srcs += $(SRC_ARCH)/lpcusb/examples/msc_bot.c $(SRC_ARCH)/lpcusb/examples/msc_scsi.c $(SRC_ARCH)/lpcusb/examples/blockdev_sd.c $(SRC_ARCH)/lpcusb/examples/lpc2000_spi0.c
|
||||
|
||||
ap.CFLAGS += -DMICROMAG_DRDY_VIC_SLOT=9 -DSSP_VIC_SLOT=11 -DUSE_MAX11040
|
||||
ap.CFLAGS += -DMAX11040_DRDY_VIC_SLOT=12 -DSSP_VIC_SLOT=11 -DUSE_MAX11040
|
||||
ap.srcs += max11040.c $(SRC_ARCH)/max11040_hw.c
|
||||
|
||||
</makefile>
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
|
||||
#define HW_ENDPOINT_LPC2000_SD
|
||||
/* defines the interface for LPC213x (0=SPI0 1=SPI1) */
|
||||
// #define HW_ENDPOINT_LPC2000_SPINUM (0)
|
||||
#define HW_ENDPOINT_LPC2000_SPINUM (1)
|
||||
//#define HW_ENDPOINT_LPC2000_SPINUM (0)
|
||||
//#define HW_ENDPOINT_LPC2000_SPINUM (1)
|
||||
|
||||
/*#define HW_ENDPOINT_DSP_TI6713_SD*/
|
||||
|
||||
|
||||
+6
-205
@@ -8,6 +8,7 @@
|
||||
|
||||
#include "baro_scp_i2c.h"
|
||||
|
||||
#include "sys_time.h"
|
||||
#include "i2c.h"
|
||||
#include "led.h"
|
||||
|
||||
@@ -30,13 +31,15 @@ static void baro_scp_start_high_res_measurement(void) {
|
||||
}
|
||||
|
||||
void baro_scp_init( void ) {
|
||||
baro_scp_status = BARO_SCP_IDLE;
|
||||
baro_scp_status = BARO_SCP_UNINIT;
|
||||
baro_scp_i2c_done = FALSE;
|
||||
baro_scp_start_high_res_measurement();
|
||||
}
|
||||
|
||||
void baro_scp_periodic( void ) {
|
||||
if (baro_scp_i2c_done) {
|
||||
if (baro_scp_status == BARO_SCP_UNINIT && cpu_time_sec > 1) {
|
||||
baro_scp_start_high_res_measurement();
|
||||
baro_scp_status = BARO_SCP_IDLE;
|
||||
} else if (baro_scp_i2c_done) {
|
||||
if (baro_scp_status == BARO_SCP_IDLE) {
|
||||
|
||||
/* initial measurement */
|
||||
@@ -96,205 +99,3 @@ void baro_scp_periodic( void ) {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//////////
|
||||
#if 0
|
||||
|
||||
|
||||
#include "std.h"
|
||||
#include "init_hw.h"
|
||||
#include "sys_time.h"
|
||||
#include "led.h"
|
||||
#include "interrupt_hw.h"
|
||||
|
||||
#include "uart.h"
|
||||
#include "messages.h"
|
||||
#include "downlink.h"
|
||||
|
||||
#include "spi_hw.h"
|
||||
|
||||
#include "baro_scp.h"
|
||||
|
||||
#define STA_UNINIT 0
|
||||
#define STA_INITIALISING 1
|
||||
#define STA_IDLE 2
|
||||
|
||||
uint8_t baro_scp_status;
|
||||
uint32_t baro_scp_pressure;
|
||||
uint16_t baro_scp_temperature;
|
||||
bool_t baro_scp_available;
|
||||
|
||||
static void baro_scp_start_high_res_measurement(void);
|
||||
static void baro_scp_read(void);
|
||||
static void EXTINT_ISR(void) __attribute__((naked));
|
||||
static void SPI1_ISR(void) __attribute__((naked));
|
||||
|
||||
void baro_scp_periodic(void) {
|
||||
if (baro_scp_status == STA_UNINIT && cpu_time_sec > 1) {
|
||||
baro_scp_start_high_res_measurement();
|
||||
baro_scp_status = STA_INITIALISING;
|
||||
}
|
||||
}
|
||||
|
||||
/* ssp input clock 468.75kHz, clock that divided by SCR+1 */
|
||||
#define SSP_CLOCK 468750
|
||||
|
||||
/* SSPCR0 settings */
|
||||
#define SSP_DDS 0x07 << 0 /* data size : 8 bits */
|
||||
#define SSP_FRF 0x00 << 4 /* frame format : SPI */
|
||||
#define SSP_CPOL 0x00 << 6 /* clock polarity : data captured on first clock transition */
|
||||
#define SSP_CPHA 0x00 << 7 /* clock phase : SCK idles low */
|
||||
#define SSP_SCR 0x0F << 8 /* serial clock rate : divide by 16 */
|
||||
|
||||
/* SSPCR1 settings */
|
||||
#define SSP_LBM 0x00 << 0 /* loopback mode : disabled */
|
||||
#define SSP_SSE 0x00 << 1 /* SSP enable : disabled */
|
||||
#define SSP_MS 0x00 << 2 /* master slave mode : master */
|
||||
#define SSP_SOD 0x00 << 3 /* slave output disable : don't care when master */
|
||||
|
||||
#define SS_PIN 20
|
||||
#define SS_IODIR IO0DIR
|
||||
#define SS_IOSET IO0SET
|
||||
#define SS_IOCLR IO0CLR
|
||||
|
||||
#define ScpSelect() SetBit(SS_IOCLR,SS_PIN)
|
||||
#define ScpUnselect() SetBit(SS_IOSET,SS_PIN)
|
||||
|
||||
void baro_scp_init( void ) {
|
||||
/* setup pins for SSP (SCK, MISO, MOSI) */
|
||||
PINSEL1 |= 2 << 2 | 2 << 4 | 2 << 6;
|
||||
|
||||
/* setup SSP */
|
||||
SSPCR0 = SSP_DDS | SSP_FRF | SSP_CPOL | SSP_CPHA | SSP_SCR;
|
||||
SSPCR1 = SSP_LBM | SSP_MS | SSP_SOD;
|
||||
/* set prescaler for SSP clock */
|
||||
SSPCPSR = PCLK/SSP_CLOCK;
|
||||
|
||||
/* initialize interrupt vector */
|
||||
VICIntSelect &= ~VIC_BIT(VIC_SPI1); // SPI1 selected as IRQ
|
||||
VICIntEnable = VIC_BIT(VIC_SPI1); // SPI1 interrupt enabled
|
||||
VICVectCntl7 = VIC_ENABLE | VIC_SPI1;
|
||||
VICVectAddr7 = (uint32_t)SPI1_ISR; // address of the ISR
|
||||
|
||||
/* configure SS pin */
|
||||
SetBit(SS_IODIR, SS_PIN); /* pin is output */
|
||||
ScpUnselect(); /* pin idles high */
|
||||
|
||||
/* configure DRDY pin */
|
||||
/* connected pin to EXINT */
|
||||
SPI1_DRDY_PINSEL |= SPI1_DRDY_PINSEL_VAL << SPI1_DRDY_PINSEL_BIT;
|
||||
SetBit(EXTMODE, SPI1_DRDY_EINT); /* EINT is edge trigered */
|
||||
SetBit(EXTPOLAR,SPI1_DRDY_EINT); /* EINT is trigered on rising edge */
|
||||
SetBit(EXTINT,SPI1_DRDY_EINT); /* clear pending EINT */
|
||||
|
||||
/* initialize interrupt vector */
|
||||
VICIntSelect &= ~VIC_BIT( SPI1_DRDY_VIC_IT ); /* select EINT as IRQ source */
|
||||
VICIntEnable = VIC_BIT( SPI1_DRDY_VIC_IT ); /* enable it */
|
||||
VICVectCntl11 = VIC_ENABLE | SPI1_DRDY_VIC_IT;
|
||||
VICVectAddr11 = (uint32_t)EXTINT_ISR; // address of the ISR
|
||||
|
||||
baro_scp_status = STA_UNINIT;
|
||||
}
|
||||
|
||||
void SPI1_ISR(void) {
|
||||
ISR_ENTRY();
|
||||
|
||||
if (baro_scp_status == STA_INITIALISING) {
|
||||
uint8_t foo1 = SSPDR;
|
||||
uint8_t foo2 = SSPDR;
|
||||
baro_scp_status = STA_IDLE;
|
||||
foo1=foo2;
|
||||
}
|
||||
else if (baro_scp_status == STA_IDLE) {
|
||||
|
||||
uint8_t foo0 = SSPDR;
|
||||
baro_scp_temperature = SSPDR<<8;
|
||||
baro_scp_temperature += SSPDR;
|
||||
if (baro_scp_temperature & 0x2000) {
|
||||
baro_scp_temperature |= 0xC000;
|
||||
}
|
||||
baro_scp_temperature *= 5;
|
||||
|
||||
uint8_t foo1 = SSPDR;
|
||||
uint32_t datard8 = SSPDR<<16;
|
||||
uint8_t foo2 = SSPDR;
|
||||
baro_scp_pressure = SSPDR<<8;
|
||||
baro_scp_pressure += SSPDR;
|
||||
baro_scp_pressure += datard8;
|
||||
baro_scp_pressure *= 25;
|
||||
baro_scp_available = TRUE;
|
||||
foo1=foo2;
|
||||
foo0=foo2;
|
||||
}
|
||||
|
||||
ScpUnselect();
|
||||
SpiClearRti();
|
||||
SpiDisable();
|
||||
|
||||
VICVectAddr = 0x00000000; /* clear this interrupt from the VIC */
|
||||
ISR_EXIT();
|
||||
}
|
||||
|
||||
void EXTINT_ISR(void) {
|
||||
ISR_ENTRY();
|
||||
baro_scp_read();
|
||||
|
||||
SetBit(EXTINT,SPI1_DRDY_EINT); /* clear EINT2 */
|
||||
VICVectAddr = 0x00000000; /* clear this interrupt from the VIC */
|
||||
ISR_EXIT();
|
||||
}
|
||||
|
||||
/* write 0x0A to 0x03 */
|
||||
static void baro_scp_start_high_res_measurement(void) {
|
||||
uint8_t cmd = 0x03<<2|0x02;
|
||||
uint8_t data = 0x0A;
|
||||
ScpSelect();
|
||||
SSPDR = cmd;
|
||||
SSPDR = data;
|
||||
SpiEnableRti();
|
||||
SpiEnable();
|
||||
}
|
||||
|
||||
/* read 0x21 (TEMP), 0x1F (MSB) and 0x20 (LSB) */
|
||||
static void baro_scp_read(void) {
|
||||
uint8_t cmd0 = 0x21 << 2;
|
||||
uint8_t cmd1 = 0x1F << 2;
|
||||
uint8_t cmd2 = 0x20 << 2;
|
||||
ScpSelect();
|
||||
SSPDR = cmd0;
|
||||
SSPDR = 0;
|
||||
SSPDR = 0;
|
||||
SSPDR = cmd1;
|
||||
SSPDR = 0;
|
||||
SSPDR = cmd2;
|
||||
SSPDR = 0;
|
||||
SSPDR = 0;
|
||||
SpiEnable();
|
||||
}
|
||||
|
||||
#endif
|
||||
//////////
|
||||
|
||||
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
|
||||
#include "std.h"
|
||||
|
||||
#define BARO_SCP_IDLE 0
|
||||
#define BARO_SCP_RD_TEMP 1
|
||||
#define BARO_SCP_RD_PRESS_0 2
|
||||
#define BARO_SCP_RD_PRESS_1 3
|
||||
#define BARO_SCP_UNINIT 0
|
||||
#define BARO_SCP_IDLE 1
|
||||
#define BARO_SCP_RD_TEMP 2
|
||||
#define BARO_SCP_RD_PRESS_0 3
|
||||
#define BARO_SCP_RD_PRESS_1 4
|
||||
|
||||
extern uint8_t baro_scp_status;
|
||||
extern uint32_t baro_scp_pressure;
|
||||
|
||||
@@ -24,6 +24,7 @@ void i2c0_init(void) {
|
||||
|
||||
|
||||
void i2c0_receive(uint8_t slave_addr, uint16_t len, volatile bool_t* finished) {
|
||||
i2c0_trx = 0;
|
||||
i2c0_len_r = len;
|
||||
i2c0_slave_addr = slave_addr | I2C_RECEIVE;
|
||||
i2c0_finished = finished;
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
#endif
|
||||
|
||||
/* BUTTON that stops logging (BUTTON = P0.7, INT1 = P0.14) */
|
||||
#define STOP_KEY 7
|
||||
#define STOP_KEY 14
|
||||
|
||||
/* USB Vbus (= P0.23) */
|
||||
#define VBUS_PIN 23
|
||||
@@ -380,22 +380,29 @@ int do_log(void)
|
||||
{
|
||||
|
||||
#ifdef USE_MAX11040
|
||||
if (max11040_data == MAXM_DATA_AVAILABLE) {
|
||||
if (max11040_data == MAX11040_DATA_AVAILABLE) {
|
||||
// LED_TOGGLE(3);
|
||||
int i;
|
||||
|
||||
log_buffer[LOG_DATA_OFFSET+0] = 42; // sender_id;
|
||||
log_buffer[LOG_DATA_OFFSET+1] = 59; // message_id;
|
||||
log_buffer[LOG_DATA_OFFSET+0] = 100; // sender_id;
|
||||
log_buffer[LOG_DATA_OFFSET+1] = 61; // message_id;
|
||||
|
||||
for (i=0; i<16; i++) {
|
||||
// log_buffer[LOG_DATA_OFFSET + i + 0] = (max11040_values[i] << 24) & 0xFF;
|
||||
log_buffer[LOG_DATA_OFFSET+2 + i*4 + 0] = (max11040_values[i] ) & 0xFF;
|
||||
log_buffer[LOG_DATA_OFFSET+2 + i*4 + 1] = (max11040_values[i] >> 8 ) & 0xFF;
|
||||
log_buffer[LOG_DATA_OFFSET+2 + i*4 + 2] = (max11040_values[i] >> 16) & 0xFF;
|
||||
log_buffer[LOG_DATA_OFFSET+2 + i*4 + 3] = (max11040_values[i] >> 24) & 0xFF;
|
||||
|
||||
#if 0
|
||||
log_buffer[LOG_DATA_OFFSET+2 + i*4 + 0] = i*4;
|
||||
log_buffer[LOG_DATA_OFFSET+2 + i*4 + 1] = i*4+1;
|
||||
log_buffer[LOG_DATA_OFFSET+2 + i*4 + 2] = i*4+2;
|
||||
log_buffer[LOG_DATA_OFFSET+2 + i*4 + 3] = i*4+3;
|
||||
#endif
|
||||
|
||||
}
|
||||
log_payload(2 + 16 * 4, LOG_SOURCE_UART0, max11040_timestamp);
|
||||
max11040_data = MAXM_IDLE;
|
||||
max11040_data = MAX11040_IDLE;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user