[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[paparazzi-commits] [6190] Move MAX11040 ADC into a module
From: |
Martin Mueller |
Subject: |
[paparazzi-commits] [6190] Move MAX11040 ADC into a module |
Date: |
Wed, 20 Oct 2010 21:20:46 +0000 |
Revision: 6190
http://svn.sv.gnu.org/viewvc/?view=rev&root=paparazzi&revision=6190
Author: mmm
Date: 2010-10-20 21:20:45 +0000 (Wed, 20 Oct 2010)
Log Message:
-----------
Move MAX11040 ADC into a module
Modified Paths:
--------------
paparazzi3/trunk/conf/airframes/mm/extra/probe_t.xml
paparazzi3/trunk/sw/airborne/main_ap.c
Added Paths:
-----------
paparazzi3/trunk/conf/modules/max11040.xml
paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/
paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/max11040_hw.c
paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/max11040_hw.h
paparazzi3/trunk/sw/airborne/modules/adcs/
paparazzi3/trunk/sw/airborne/modules/adcs/max11040.c
paparazzi3/trunk/sw/airborne/modules/adcs/max11040.h
Removed Paths:
-------------
paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.c
paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.h
paparazzi3/trunk/sw/airborne/max11040.c
paparazzi3/trunk/sw/airborne/max11040.h
Modified: paparazzi3/trunk/conf/airframes/mm/extra/probe_t.xml
===================================================================
--- paparazzi3/trunk/conf/airframes/mm/extra/probe_t.xml 2010-10-20
19:05:40 UTC (rev 6189)
+++ paparazzi3/trunk/conf/airframes/mm/extra/probe_t.xml 2010-10-20
21:20:45 UTC (rev 6190)
@@ -1,7 +1,41 @@
<!DOCTYPE airframe SYSTEM "../../airframe.dtd">
-<airframe name="Pressure test">
+<airframe name="MAX11040 ADC test">
+ <firmware name="fixedwing">
+ <target name="ap" board="tiny_2.11">
+ <define name="AGR_CLIMB"/>
+ <define name="LOITER_TRIM"/>
+ <define name="ALT_KALMAN"/>
+ <define name="WIND_INFO"/>
+ <define name="WIND_INFO_RET"/>
+ <define name="MAX11040_DRDY_VIC_SLOT" value="12"/>
+ <define name="SSP_VIC_SLOT" value="11"/>
+ <define name="USE_MAX11040"/>
+ <define name="MAX11040_DEBUG"/>
+ </target>
+ <subsystem name="telemetry" type="xbee_api">
+ <param name="MODEM_BAUD" value="B57600"/>
+ </subsystem>
+ <subsystem name="control"/>
+ <subsystem name="attitude" type="infrared"/>
+ <subsystem name="gps" type="ublox_lea5h">
+ <param name="GPS_BAUD" value="B38400"/>
+ </subsystem>
+ <subsystem name="navigation"/>
+ </firmware>
+
+ <firmware name="setup">
+ <target name="tunnel" board="tiny_2.11"/>
+ <target name="usb_tunnel_0" board="tiny_2.11"/>
+ <target name="usb_tunnel_1" board="tiny_2.11"/>
+ </firmware>
+
+ <!-- modules -->
+ <modules>
+ <load name="max11040.xml"/>
+ </modules>
+
<!-- commands section -->
<servos>
<servo name="MOTOR" no="0" min="1000" neutral="1000" max="2000"/>
@@ -184,66 +218,5 @@
<define name="MAXM_DRDY_VIC_IT" value="VIC_EINT0"/>
</section>
-
- <makefile>
-CONFIG = \"tiny_2_1.h\"
-
-include $(PAPARAZZI_SRC)/conf/autopilot/tiny.makefile
-
-FLASH_MODE=IAP
-
-ap.CFLAGS += -DFBW -DAP -DBOARD_CONFIG=$(CONFIG) -DLED -DTIME_LED=1
-ap.srcs = sys_time.c $(SRC_ARCH)/sys_time_hw.c $(SRC_ARCH)/armVIC.c main_fbw.c
main_ap.c main.c
-
-ap.srcs += commands.c
-
-ap.CFLAGS += -DACTUATORS=\"servos_4017_hw.h\" -DSERVOS_4017
-ap.srcs += $(SRC_ARCH)/servos_4017_hw.c actuators.c
-
-ap.CFLAGS += -DRADIO_CONTROL
-ap.srcs += radio_control.c $(SRC_ARCH)/ppm_hw.c
-
-ap.CFLAGS += -DDOWNLINK -DUSE_UART1 -DDOWNLINK_TRANSPORT=XBeeTransport
-DXBEE_UART=Uart1 -DDATALINK=XBEE -DUART1_BAUD=B57600
-ap.srcs += downlink.c $(SRC_ARCH)/uart_hw.c datalink.c xbee.c
-
-#TRANSPARENT
-#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.srcs += $(SRC_ARCH)/adc_hw.c
-
-ap.CFLAGS += -DGPS -DUBX -DUSE_UART0 -DGPS_LINK=Uart0 -DUART0_BAUD=B38400
-DGPS_USE_LATLONG
-# -DGPS_LED=2
-ap.srcs += gps_ubx.c gps.c latlong.c
-
-ap.CFLAGS += -DINFRARED -DALT_KALMAN -DWIND_INFO -DWIND_INFO_RET
-ap.srcs += infrared.c estimator.c
-
-ap.CFLAGS += -DNAV -DAGR_CLIMB -DLOITER_TRIM
-ap.srcs += nav.c fw_h_ctl.c fw_v_ctl.c
-
-ap.srcs += nav_line.c
-ap.srcs += nav_survey_rectangle.c
-
-# MAX11040 adc
-ap.CFLAGS += -DMAX11040_DRDY_VIC_SLOT=12 -DSSP_VIC_SLOT=11 -DUSE_MAX11040
-ap.srcs += max11040.c $(SRC_ARCH)/max11040_hw.c
-
-ap.srcs += snav.c
-
-# Config for SITL simulation
-include $(PAPARAZZI_SRC)/conf/autopilot/sitl.makefile
-sim.CFLAGS += -DBOARD_CONFIG=\"tiny.h\" -DAGR_CLIMB -DLOITER_TRIM -DALT_KALMAN
-sim.srcs += nav_line.c nav_survey_rectangle.c
-
-sim.srcs += joystick.c
-sim.CFLAGS += -DUSE_JOYSTICK
-
-
- </makefile>
</airframe>
+
Added: paparazzi3/trunk/conf/modules/max11040.xml
===================================================================
--- paparazzi3/trunk/conf/modules/max11040.xml (rev 0)
+++ paparazzi3/trunk/conf/modules/max11040.xml 2010-10-20 21:20:45 UTC (rev
6190)
@@ -0,0 +1,14 @@
+<!DOCTYPE module SYSTEM "module.dtd">
+
+<module name="max11040" dir="adcs">
+ <header>
+ <file name="max11040.h"/>
+ </header>
+ <init fun="max11040_init()"/>
+ <periodic fun="max11040_periodic()" freq="4"/>
+ <makefile>
+ <file_hw name="max11040_hw.c"/>
+ <file name="max11040.c"/>
+ </makefile>
+</module>
+
Deleted: paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.c
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.c 2010-10-20
19:05:40 UTC (rev 6189)
+++ paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.c 2010-10-20
21:20:45 UTC (rev 6190)
@@ -1,76 +0,0 @@
-
-/* MAX11040 connected on SPI1
-
- SS on P0.20 (SSEL)
- DRDY on P0.16 (EINT0)
-*/
-
-
-#include "led.h"
-#include "max11040.h"
-
-#ifdef LOGGER
-extern unsigned int getclock(void);
-#endif
-
-volatile uint8_t num_irqs = 0;
-
-static void EXTINT_ISR(void) __attribute__((naked));
-
-void max11040_hw_init( void ) {
-
- /* configure DRDY pin */
- /* connected pin to EXINT */
- MAXM_DRDY_PINSEL |= MAXM_DRDY_PINSEL_VAL << MAXM_DRDY_PINSEL_BIT;
- SetBit(EXTMODE, MAXM_DRDY_EINT); /* EINT is edge trigered */
- ClearBit(EXTPOLAR, MAXM_DRDY_EINT); /* EINT is trigered on falling edge */
- SetBit(EXTINT, MAXM_DRDY_EINT); /* clear pending EINT */
-
- /* initialize interrupt vector */
- VICIntSelect &= ~VIC_BIT( MAXM_DRDY_VIC_IT ); /*
select EINT as IRQ source */
- VICIntEnable = VIC_BIT( MAXM_DRDY_VIC_IT ); /*
enable it */
- _VIC_CNTL(MAX11040_DRDY_VIC_SLOT) = VIC_ENABLE | MAXM_DRDY_VIC_IT;
- _VIC_ADDR(MAX11040_DRDY_VIC_SLOT) = (uint32_t)EXTINT_ISR; /*
address of the ISR */
-}
-
-void EXTINT_ISR(void) {
- ISR_ENTRY();
-
- if (num_irqs++ == 5)
- {
- /* switch SSEL P0.20 to be used as GPIO */
- PINSEL1 &= ~(3 << 8);
- IO0DIR |= 1 << 20;
- max11040_status = MAX11040_DATA2;
- }
-
- if (max11040_status == MAX11040_DATA2) {
-
-//LED_TOGGLE(2);
-//LED_TOGGLE(3);
-
-#ifdef LOGGER
- max11040_timestamp[max11040_buf_in] = getclock();
-#endif
-
- MaxmSelect();
-
- /* read data */
- SSP_Send(0xF0);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
-
- max11040_count = 0;
- }
-
- /* clear EINT */
- SetBit(EXTINT, MAXM_DRDY_EINT);
-
- VICVectAddr = 0x00000000; /* clear this interrupt from the VIC */
- ISR_EXIT();
-}
-
Deleted: paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.h
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.h 2010-10-20
19:05:40 UTC (rev 6189)
+++ paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.h 2010-10-20
21:20:45 UTC (rev 6190)
@@ -1,61 +0,0 @@
-
-#ifndef MAX11040_HW_H
-#define MAX11040_HW_H
-
-
-#include "LPC21xx.h"
-#include "interrupt_hw.h"
-
-#include "ssp_hw.h"
-#include BOARD_CONFIG
-
-#include "airframe.h"
-
-#define MAXM_DIVISOR_128 2
-#define MAXM_DIVISOR_256 3
-#define MAXM_DIVISOR_512 4
-#define MAXM_DIVISOR_1024 5
-
-#define MAXM_DIVISOR MAXM_DIVISOR_512
-
-/* 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 0x01 << 7 /* clock phase : SCK idles low */
-#define SSP_SCR 0x00 << 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 SSPCR0_VAL (SSP_DDS | SSP_FRF | SSP_CPOL | SSP_CPHA | SSP_SCR )
-#define SSPCR1_VAL (SSP_LBM | SSP_SSE | SSP_MS | SSP_SOD )
-
-#define SSP_PINSEL1_SCK (2<<2)
-#define SSP_PINSEL1_MISO (2<<4)
-#define SSP_PINSEL1_MOSI (2<<6)
-#define SSP_PINSEL1_SSEL (2<<8)
-
-#define SSP_Enable() SetBit(SSPCR1, SSE);
-#define SSP_Disable() ClearBit(SSPCR1, SSE);
-#define SSP_EnableRxi() SetBit(SSPIMSC, RXIM)
-#define SSP_DisableRxi() ClearBit(SSPIMSC, RXIM)
-#define SSP_ClearRxi() SetBit(SSPICR, RXIM);
-#define SSP_EnableTxi() SetBit(SSPIMSC, TXIM)
-#define SSP_DisableTxi() ClearBit(SSPIMSC, TXIM)
-#define SSP_ClearTxi() SetBit(SSPICR, TXIM);
-#define SSP_EnableRti() SetBit(SSPIMSC, RTIM);
-#define SSP_DisableRti() ClearBit(SSPIMSC, RTIM);
-#define SSP_ClearRti() SetBit(SSPICR, RTIC);
-
-#define MaxmSelect() SetBit(MAXM_SS_IOCLR, MAXM_SS_PIN)
-#define MaxmUnselect() SetBit(MAXM_SS_IOSET, MAXM_SS_PIN)
-
-
-#endif /* MAX11040_HW_H */
Copied: paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/max11040_hw.c
(from rev 6189, paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/max11040_hw.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/max11040_hw.c
2010-10-20 21:20:45 UTC (rev 6190)
@@ -0,0 +1,315 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Martin Mueller
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/** \file max11040.c
+ * \brief Maxim MAX11040 ADC hw interface
+ *
+ * SS on P0.20 (SSEL)
+ * DRDY on P0.16 (EINT0)
+ */
+
+#include "armVIC.h"
+#include "max11040_hw.h"
+#include "modules/adcs/max11040.h"
+
+#ifdef LOGGER
+extern unsigned int getclock(void);
+#endif
+
+volatile uint8_t num_irqs = 0;
+
+static void SSP_ISR(void) __attribute__((naked));
+static void EXTINT_ISR(void) __attribute__((naked));
+
+
+static void SSP_ISR(void) {
+ int i;
+ ISR_ENTRY();
+
+ switch (max11040_status) {
+
+ case MAX11040_RESET:
+ {
+ /* read dummy control byte reply */
+ uint8_t foo __attribute__ ((unused));
+ foo = SSPDR;
+ foo = SSPDR;
+ /* write configuration register */
+ SSP_Send(0x60); /* wr conf */
+ SSP_Send(0x30); /* adc0: en24bit, xtalen, no faultdis */
+ for (i=1; i<MAXM_NB_ADCS; i++) {
+ SSP_Send(0x20); /* adcx: en24bit, no xtalen, no faultdis */
+ }
+ max11040_status = MAX11040_CONF;
+ SSP_ClearRti();
+ }
+ break;
+
+ case MAX11040_CONF:
+ {
+ /* read dummy control byte reply */
+ uint8_t foo __attribute__ ((unused));
+ foo = SSPDR;
+ for (i=0; i<MAXM_NB_ADCS; i++) {
+ foo = SSPDR;
+ }
+ /* write sampling instant register */
+ SSP_Send(0x40); /* wr instant */
+ for (i=0; i<MAXM_NB_ADCS; i++) {
+ SSP_Send(0); /* adcx: no delay */
+ SSP_Send(0);
+ SSP_Send(0);
+ SSP_Send(0);
+ }
+ max11040_status = MAX11040_INSTANT;
+ SSP_ClearRti();
+ }
+ break;
+
+ case MAX11040_INSTANT:
+ {
+ /* read dummy control byte reply */
+ uint8_t foo __attribute__ ((unused));
+ foo = SSPDR;
+ for (i=0; i<MAXM_NB_ADCS; i++) {
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ }
+ /* write data rate control register */
+ SSP_Send(0x50); /* wr rate */
+ SSP_Send(0x26); /* adc: 250.1 sps */
+ SSP_Send(0x00);
+ max11040_status = MAX11040_RATE;
+ SSP_ClearRti();
+ }
+ break;
+
+ case MAX11040_RATE:
+ {
+ uint8_t foo __attribute__ ((unused));
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ /* read data register */
+ SSP_Send(0xF0); /* rd data */
+ for (i=0; i<MAXM_NB_ADCS; i++) {
+ SSP_Send(0x00); /* adcx: data */
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ }
+ max11040_status = MAX11040_DATA;
+ SSP_ClearRti();
+ }
+ break;
+
+ case MAX11040_DATA:
+ {
+ uint8_t foo __attribute__ ((unused));
+ foo = SSPDR;
+ for (i=0; i<MAXM_NB_ADCS; i++) {
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ foo = SSPDR;
+ }
+
+ /* read data */
+ /* read data register */
+ SSP_Send(0xF0); /* rd data */
+ for (i=0; i<MAXM_NB_ADCS; i++) {
+ SSP_Send(0x00); /* adc0: data */
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ }
+
+ SSP_ClearRti();
+ }
+ break;
+
+ case MAX11040_DATA2:
+ {
+ uint8_t foo __attribute__ ((unused));
+
+ SSP_ClearRti();
+ SSP_ClearRxi();
+
+ if (max11040_count <= MAXM_NB_CHAN+2)
+ {
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ }
+
+ if (max11040_count == 0) foo = SSPDR;
+
+ max11040_values[max11040_buf_in][max11040_count] = SSPDR << 16;
+ max11040_values[max11040_buf_in][max11040_count] |= SSPDR << 8;
+ max11040_values[max11040_buf_in][max11040_count] |= SSPDR;
+ if (max11040_values[max11040_buf_in][max11040_count] & 0x800000)
+ max11040_values[max11040_buf_in][max11040_count] |= 0xFF000000;
+
+ max11040_count++;
+
+ max11040_values[max11040_buf_in][max11040_count] = SSPDR << 16;
+ max11040_values[max11040_buf_in][max11040_count] |= SSPDR << 8;
+ max11040_values[max11040_buf_in][max11040_count] |= SSPDR;
+ if (max11040_values[max11040_buf_in][max11040_count] & 0x800000)
+ max11040_values[max11040_buf_in][max11040_count] |= 0xFF000000;
+
+ max11040_count++;
+
+ if (max11040_count == MAXM_NB_CHAN)
+ {
+ MaxmUnselect();
+ max11040_data = MAX11040_DATA_AVAILABLE;
+ i = max11040_buf_in+1;
+ if (i >= MAX11040_BUF_SIZE) i=0;
+ if (i != max11040_buf_out) {
+ max11040_buf_in = i;
+ } else {
+ //throw error;
+ }
+ }
+ }
+ break;
+
+ }
+
+ VICVectAddr = 0x00000000; /* clear this interrupt from the VIC */
+ ISR_EXIT();
+}
+
+void EXTINT_ISR(void) {
+ ISR_ENTRY();
+
+ if (num_irqs++ == 5)
+ {
+ /* switch SSEL P0.20 to be used as GPIO */
+ PINSEL1 &= ~(3 << 8);
+ IO0DIR |= 1 << 20;
+ max11040_status = MAX11040_DATA2;
+ }
+
+ if (max11040_status == MAX11040_DATA2) {
+
+#ifdef LOGGER
+ max11040_timestamp[max11040_buf_in] = getclock();
+#endif
+
+ MaxmSelect();
+
+ /* read data */
+ SSP_Send(0xF0);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+ SSP_Send(0x00);
+
+ max11040_count = 0;
+ }
+
+ /* clear EINT */
+ SetBit(EXTINT, MAXM_DRDY_EINT);
+
+ VICVectAddr = 0x00000000; /* clear this interrupt from the VIC */
+ ISR_EXIT();
+}
+
+
+void max11040_hw_init( void ) {
+ int i;
+
+ /* *** configure SPI *** */
+ /* setup pins for SSP (SCK, MISO, MOSI, SSEL) */
+ PINSEL1 |= SSP_PINSEL1_SCK | SSP_PINSEL1_MISO | SSP_PINSEL1_MOSI |
SSP_PINSEL1_SSEL;
+
+ /* setup SSP */
+ SSPCR0 = SSPCR0_VAL;;
+ SSPCR1 = SSPCR1_VAL;
+ SSPCPSR = 0x02;
+
+ /* initialize interrupt vector */
+ VICIntSelect &= ~VIC_BIT( VIC_SPI1 ); /* SPI1 selected as IRQ */
+ VICIntEnable = VIC_BIT( VIC_SPI1 ); /* enable it */
+ _VIC_CNTL(SSP_VIC_SLOT) = VIC_ENABLE | VIC_SPI1;
+ _VIC_ADDR(SSP_VIC_SLOT) = (uint32_t)SSP_ISR; /* address of the ISR */
+
+
+ /* *** configure DRDY pin*** */
+ /* connected pin to EXINT */
+ MAXM_DRDY_PINSEL |= MAXM_DRDY_PINSEL_VAL << MAXM_DRDY_PINSEL_BIT;
+ SetBit(EXTMODE, MAXM_DRDY_EINT); /* EINT is edge trigered */
+ ClearBit(EXTPOLAR, MAXM_DRDY_EINT); /* EINT is trigered on falling edge */
+ SetBit(EXTINT, MAXM_DRDY_EINT); /* clear pending EINT */
+
+ /* initialize interrupt vector */
+ VICIntSelect &= ~VIC_BIT( MAXM_DRDY_VIC_IT ); /*
select EINT as IRQ source */
+ VICIntEnable = VIC_BIT( MAXM_DRDY_VIC_IT ); /*
enable it */
+ _VIC_CNTL(MAX11040_DRDY_VIC_SLOT) = VIC_ENABLE | MAXM_DRDY_VIC_IT;
+ _VIC_ADDR(MAX11040_DRDY_VIC_SLOT) = (uint32_t)EXTINT_ISR; /*
address of the ISR */
+
+
+ /* write configuration register */
+ SSP_Send(0x60); /* wr conf */
+ for (i=0; i<MAXM_NB_ADCS; i++) {
+ SSP_Send(0x40); /* adcx: reset */
+ }
+ SSP_Enable();
+ SSP_ClearRti();
+ SSP_EnableRti();
+}
+
Copied: paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/max11040_hw.h
(from rev 6189, paparazzi3/trunk/sw/airborne/arch/lpc21/max11040_hw.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/max11040_hw.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/arch/lpc21/modules/adcs/max11040_hw.h
2010-10-20 21:20:45 UTC (rev 6190)
@@ -0,0 +1,63 @@
+
+#ifndef MAX11040_HW_H
+#define MAX11040_HW_H
+
+
+#include "LPC21xx.h"
+#include "interrupt_hw.h"
+#include "ssp_hw.h"
+#include "airframe.h"
+#include BOARD_CONFIG
+
+
+#define MAXM_DIVISOR_128 2
+#define MAXM_DIVISOR_256 3
+#define MAXM_DIVISOR_512 4
+#define MAXM_DIVISOR_1024 5
+
+#define MAXM_DIVISOR MAXM_DIVISOR_512
+
+/* 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 0x01 << 7 /* clock phase : SCK idles low */
+#define SSP_SCR 0x00 << 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 SSPCR0_VAL (SSP_DDS | SSP_FRF | SSP_CPOL | SSP_CPHA | SSP_SCR )
+#define SSPCR1_VAL (SSP_LBM | SSP_SSE | SSP_MS | SSP_SOD )
+
+#define SSP_PINSEL1_SCK (2<<2)
+#define SSP_PINSEL1_MISO (2<<4)
+#define SSP_PINSEL1_MOSI (2<<6)
+#define SSP_PINSEL1_SSEL (2<<8)
+
+#define SSP_Enable() SetBit(SSPCR1, SSE);
+#define SSP_Disable() ClearBit(SSPCR1, SSE);
+#define SSP_EnableRxi() SetBit(SSPIMSC, RXIM)
+#define SSP_DisableRxi() ClearBit(SSPIMSC, RXIM)
+#define SSP_ClearRxi() SetBit(SSPICR, RXIM);
+#define SSP_EnableTxi() SetBit(SSPIMSC, TXIM)
+#define SSP_DisableTxi() ClearBit(SSPIMSC, TXIM)
+#define SSP_ClearTxi() SetBit(SSPICR, TXIM);
+#define SSP_EnableRti() SetBit(SSPIMSC, RTIM);
+#define SSP_DisableRti() ClearBit(SSPIMSC, RTIM);
+#define SSP_ClearRti() SetBit(SSPICR, RTIC);
+
+#define MaxmSelect() SetBit(MAXM_SS_IOCLR, MAXM_SS_PIN)
+#define MaxmUnselect() SetBit(MAXM_SS_IOSET, MAXM_SS_PIN)
+
+
+void max11040_hw_init( void );
+
+#endif /* MAX11040_HW_H */
+
Modified: paparazzi3/trunk/sw/airborne/main_ap.c
===================================================================
--- paparazzi3/trunk/sw/airborne/main_ap.c 2010-10-20 19:05:40 UTC (rev
6189)
+++ paparazzi3/trunk/sw/airborne/main_ap.c 2010-10-20 21:20:45 UTC (rev
6190)
@@ -91,10 +91,6 @@
#include "srf08.h"
#endif
-#ifdef USE_MAX11040
-#include "max11040.h"
-#endif
-
#ifdef TRAFFIC_INFO
#include "traffic_info.h"
#endif
@@ -501,45 +497,6 @@
break;
#endif
-#ifdef USE_MAX11040
- case 5:
- {
- float max11040_values_f[16];
- int i;
-
- if (max11040_data == MAX11040_DATA_AVAILABLE) {
- LED_TOGGLE(3);
- for (i=0; i<16; i++) {
- /* we assume that the buffer will be full always in this test mode
anyway */
- max11040_values_f[i] = (max11040_values[max11040_buf_in][i] * 2.2) /
8388608.0;
- }
-
- DOWNLINK_SEND_TURB_PRESSURE_VOLTAGE(
- DefaultChannel,
- &max11040_values_f[0],
- &max11040_values_f[1],
- &max11040_values_f[2],
- &max11040_values_f[3],
- &max11040_values_f[4],
- &max11040_values_f[5],
- &max11040_values_f[6],
- &max11040_values_f[7],
- &max11040_values_f[8],
- &max11040_values_f[9],
- &max11040_values_f[10],
- &max11040_values_f[11],
- &max11040_values_f[12],
- &max11040_values_f[13],
- &max11040_values_f[14],
- &max11040_values_f[15] );
- max11040_data = MAX11040_IDLE;
- }
- }
- break;
-
-#endif
-
-
#ifdef USE_ADC_GENERIC
case 6:
adc_generic_periodic();
@@ -718,11 +675,6 @@
micromag_init();
#endif
-#ifdef USE_MAX11040
- max11040_init_ssp();
- max11040_init();
-#endif
-
modules_init();
/** - start interrupt task */
Deleted: paparazzi3/trunk/sw/airborne/max11040.c
===================================================================
--- paparazzi3/trunk/sw/airborne/max11040.c 2010-10-20 19:05:40 UTC (rev
6189)
+++ paparazzi3/trunk/sw/airborne/max11040.c 2010-10-20 21:20:45 UTC (rev
6190)
@@ -1,241 +0,0 @@
-
-#include "max11040.h"
-
-volatile uint8_t max11040_status;
-volatile uint8_t max11040_data;
-volatile int32_t max11040_values[MAX11040_BUF_SIZE][MAXM_NB_CHAN] = {{0}};
-volatile uint32_t max11040_timestamp[MAX11040_BUF_SIZE] = {0};
-volatile uint8_t max11040_count = 0;
-volatile uint32_t max11040_buf_in = 0;
-volatile uint32_t max11040_buf_out = 0;
-
-static void SSP_ISR(void) __attribute__((naked));
-
-
-static void SSP_ISR(void) {
- int i;
- ISR_ENTRY();
-
- switch (max11040_status) {
-
- case MAX11040_RESET:
- {
- /* read dummy control byte reply */
- uint8_t foo __attribute__ ((unused));
- foo = SSPDR;
- foo = SSPDR;
- /* write configuration register */
- SSP_Send(0x60); /* wr conf */
- SSP_Send(0x30); /* adc0: en24bit, xtalen, no faultdis */
- for (i=1; i<MAXM_NB_ADCS; i++) {
- SSP_Send(0x20); /* adcx: en24bit, no xtalen, no faultdis */
- }
- max11040_status = MAX11040_CONF;
- SSP_ClearRti();
- }
- break;
-
- case MAX11040_CONF:
- {
- /* read dummy control byte reply */
- uint8_t foo __attribute__ ((unused));
- foo = SSPDR;
- for (i=0; i<MAXM_NB_ADCS; i++) {
- foo = SSPDR;
- }
- /* write sampling instant register */
- SSP_Send(0x40); /* wr instant */
- for (i=0; i<MAXM_NB_ADCS; i++) {
- SSP_Send(0); /* adcx: no delay */
- SSP_Send(0);
- SSP_Send(0);
- SSP_Send(0);
- }
- max11040_status = MAX11040_INSTANT;
- SSP_ClearRti();
- }
- break;
-
- case MAX11040_INSTANT:
- {
- /* read dummy control byte reply */
- uint8_t foo __attribute__ ((unused));
- foo = SSPDR;
- for (i=0; i<MAXM_NB_ADCS; i++) {
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- }
- /* write data rate control register */
- SSP_Send(0x50); /* wr rate */
- SSP_Send(0x26); /* adc: 250.1 sps */
- SSP_Send(0x00);
- max11040_status = MAX11040_RATE;
- SSP_ClearRti();
- }
- break;
-
- case MAX11040_RATE:
- {
- uint8_t foo __attribute__ ((unused));
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- /* read data register */
- SSP_Send(0xF0); /* rd data */
- for (i=0; i<MAXM_NB_ADCS; i++) {
- SSP_Send(0x00); /* adcx: data */
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- }
- max11040_status = MAX11040_DATA;
- SSP_ClearRti();
- }
- break;
-
- case MAX11040_DATA:
- {
- uint8_t foo __attribute__ ((unused));
- foo = SSPDR;
- for (i=0; i<MAXM_NB_ADCS; i++) {
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- foo = SSPDR;
- }
-
- /* read data */
- /* read data register */
- SSP_Send(0xF0); /* rd data */
- for (i=0; i<MAXM_NB_ADCS; i++) {
- SSP_Send(0x00); /* adc0: data */
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- }
-
- SSP_ClearRti();
- }
- break;
-
- case MAX11040_DATA2:
- {
- uint8_t foo __attribute__ ((unused));
-
- SSP_ClearRti();
- SSP_ClearRxi();
-
- if (max11040_count <= MAXM_NB_CHAN+2)
- {
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- SSP_Send(0x00);
- }
-
- if (max11040_count == 0) foo = SSPDR;
-
- max11040_values[max11040_buf_in][max11040_count] = SSPDR << 16;
- max11040_values[max11040_buf_in][max11040_count] |= SSPDR << 8;
- max11040_values[max11040_buf_in][max11040_count] |= SSPDR;
- if (max11040_values[max11040_buf_in][max11040_count] & 0x800000)
- max11040_values[max11040_buf_in][max11040_count] |= 0xFF000000;
-
- max11040_count++;
-
- max11040_values[max11040_buf_in][max11040_count] = SSPDR << 16;
- max11040_values[max11040_buf_in][max11040_count] |= SSPDR << 8;
- max11040_values[max11040_buf_in][max11040_count] |= SSPDR;
- if (max11040_values[max11040_buf_in][max11040_count] & 0x800000)
- max11040_values[max11040_buf_in][max11040_count] |= 0xFF000000;
-
- max11040_count++;
-
- if (max11040_count == MAXM_NB_CHAN)
- {
- MaxmUnselect();
- max11040_data = MAX11040_DATA_AVAILABLE;
- i = max11040_buf_in+1;
- if (i >= MAX11040_BUF_SIZE) i=0;
- if (i != max11040_buf_out) {
- max11040_buf_in = i;
- } else {
- //throw error;
- }
- }
- }
- break;
-
- }
-
- VICVectAddr = 0x00000000; /* clear this interrupt from the VIC */
- ISR_EXIT();
-}
-
-void max11040_init_ssp(void) {
-
- /* setup pins for SSP (SCK, MISO, MOSI, SSEL) */
- PINSEL1 |= SSP_PINSEL1_SCK | SSP_PINSEL1_MISO | SSP_PINSEL1_MOSI |
SSP_PINSEL1_SSEL;
-
- /* setup SSP */
- SSPCR0 = SSPCR0_VAL;;
- SSPCR1 = SSPCR1_VAL;
- SSPCPSR = 0x02;
-
- /* initialize interrupt vector */
- VICIntSelect &= ~VIC_BIT( VIC_SPI1 ); /* SPI1 selected as IRQ */
- VICIntEnable = VIC_BIT( VIC_SPI1 ); /* enable it */
- _VIC_CNTL(SSP_VIC_SLOT) = VIC_ENABLE | VIC_SPI1;
- _VIC_ADDR(SSP_VIC_SLOT) = (uint32_t)SSP_ISR; /* address of the ISR */
-}
-
-void max11040_init( void ) {
-
- int i;
- max11040_hw_init();
-
- max11040_status = MAX11040_RESET;
- max11040_data = MAX11040_RESET;
-
- /* write configuration register */
- SSP_Send(0x60); /* wr conf */
- for (i=0; i<MAXM_NB_ADCS; i++) {
- SSP_Send(0x40); /* adcx: reset */
- }
- SSP_Enable();
- SSP_ClearRti();
- SSP_EnableRti();
-}
-
-void max11040_reset() {
- max11040_status = MAX11040_IDLE;
-}
-
Deleted: paparazzi3/trunk/sw/airborne/max11040.h
===================================================================
--- paparazzi3/trunk/sw/airborne/max11040.h 2010-10-20 19:05:40 UTC (rev
6189)
+++ paparazzi3/trunk/sw/airborne/max11040.h 2010-10-20 21:20:45 UTC (rev
6190)
@@ -1,41 +0,0 @@
-#ifndef MAX11040_H
-#define MAX11040_H
-
-
-#include "std.h"
-#include "max11040_hw.h"
-
-#define MAXM_NB_CHAN 16
-#define MAXM_NB_ADCS ((MAXM_NB_CHAN+3)/4)
-#define MAX11040_BUF_SIZE 320
-
-extern void max11040_init_ssp(void);
-extern void max11040_init( void );
-
-extern void max11040_reset( void);
-extern void max11040_periodic( void );
-
-extern void max11040_hw_init( void );
-
-extern volatile uint8_t max11040_status;
-extern volatile uint8_t max11040_data;
-extern volatile int32_t max11040_values[MAX11040_BUF_SIZE][MAXM_NB_CHAN];
-extern volatile uint32_t max11040_timestamp[MAX11040_BUF_SIZE];
-extern volatile uint8_t max11040_count;
-extern volatile uint32_t max11040_buf_in;
-extern volatile uint32_t max11040_buf_out;
-
-
-#define MAX11040_RESET 0
-#define MAX11040_CONF 1
-#define MAX11040_INSTANT 2
-#define MAX11040_RATE 3
-#define MAX11040_DONE 4
-#define MAX11040_DATA 5
-#define MAX11040_DATA2 6
-
-#define MAX11040_IDLE 0
-#define MAX11040_DATA_AVAILABLE 1
-
-
-#endif /* MAX11040_H */
Copied: paparazzi3/trunk/sw/airborne/modules/adcs/max11040.c (from rev 6189,
paparazzi3/trunk/sw/airborne/max11040.c)
===================================================================
--- paparazzi3/trunk/sw/airborne/modules/adcs/max11040.c
(rev 0)
+++ paparazzi3/trunk/sw/airborne/modules/adcs/max11040.c 2010-10-20
21:20:45 UTC (rev 6190)
@@ -0,0 +1,90 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2010 Martin Mueller
+ *
+ * This file is part of paparazzi.
+ *
+ * paparazzi is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * paparazzi is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with paparazzi; see the file COPYING. If not, write to
+ * the Free Software Foundation, 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ *
+ */
+
+/** \file max11040.c
+ * \brief Maxim MAX11040 ADC interface
+ *
+ */
+
+#include "led.h"
+#include "uart.h"
+#include "messages.h"
+#include "downlink.h"
+#include "max11040.h"
+#include "modules/adcs/max11040_hw.h"
+
+volatile uint8_t max11040_status;
+volatile uint8_t max11040_data;
+volatile int32_t max11040_values[MAX11040_BUF_SIZE][MAXM_NB_CHAN] = {{0}};
+volatile uint32_t max11040_timestamp[MAX11040_BUF_SIZE] = {0};
+volatile uint8_t max11040_count;
+volatile uint32_t max11040_buf_in;
+volatile uint32_t max11040_buf_out;
+
+
+void max11040_init( void ) {
+ max11040_status = MAX11040_RESET;
+ max11040_data = MAX11040_RESET;
+ max11040_count = 0;
+ max11040_buf_in = 0;
+ max11040_buf_out = 0;
+
+ max11040_hw_init();
+}
+
+void max11040_periodic(void) {
+#ifdef MAX11040_DEBUG
+ float max11040_values_f[16];
+ int i;
+
+ if (max11040_data == MAX11040_DATA_AVAILABLE) {
+// LED_TOGGLE(3);
+ for (i=0; i<16; i++) {
+ /* we assume that the buffer will be full always in this test mode
anyway */
+ max11040_values_f[i] = (max11040_values[max11040_buf_in][i] * 2.2) /
8388608.0;
+ }
+
+ DOWNLINK_SEND_TURB_PRESSURE_VOLTAGE(
+ DefaultChannel,
+ &max11040_values_f[0],
+ &max11040_values_f[1],
+ &max11040_values_f[2],
+ &max11040_values_f[3],
+ &max11040_values_f[4],
+ &max11040_values_f[5],
+ &max11040_values_f[6],
+ &max11040_values_f[7],
+ &max11040_values_f[8],
+ &max11040_values_f[9],
+ &max11040_values_f[10],
+ &max11040_values_f[11],
+ &max11040_values_f[12],
+ &max11040_values_f[13],
+ &max11040_values_f[14],
+ &max11040_values_f[15] );
+ max11040_data = MAX11040_IDLE;
+ }
+#endif
+}
+
Copied: paparazzi3/trunk/sw/airborne/modules/adcs/max11040.h (from rev 6189,
paparazzi3/trunk/sw/airborne/max11040.h)
===================================================================
--- paparazzi3/trunk/sw/airborne/modules/adcs/max11040.h
(rev 0)
+++ paparazzi3/trunk/sw/airborne/modules/adcs/max11040.h 2010-10-20
21:20:45 UTC (rev 6190)
@@ -0,0 +1,36 @@
+#ifndef MAX11040_H
+#define MAX11040_H
+
+
+#include "std.h"
+
+#define MAXM_NB_CHAN 16
+#define MAXM_NB_ADCS ((MAXM_NB_CHAN+3)/4)
+#define MAX11040_BUF_SIZE 320
+
+extern volatile uint8_t max11040_status;
+extern volatile uint8_t max11040_data;
+extern volatile int32_t max11040_values[MAX11040_BUF_SIZE][MAXM_NB_CHAN];
+extern volatile uint32_t max11040_timestamp[MAX11040_BUF_SIZE];
+extern volatile uint8_t max11040_count;
+extern volatile uint32_t max11040_buf_in;
+extern volatile uint32_t max11040_buf_out;
+
+
+#define MAX11040_RESET 0
+#define MAX11040_CONF 1
+#define MAX11040_INSTANT 2
+#define MAX11040_RATE 3
+#define MAX11040_DONE 4
+#define MAX11040_DATA 5
+#define MAX11040_DATA2 6
+
+#define MAX11040_IDLE 0
+#define MAX11040_DATA_AVAILABLE 1
+
+void max11040_init( void );
+void max11040_periodic(void);
+
+
+#endif /* MAX11040_H */
+
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [paparazzi-commits] [6190] Move MAX11040 ADC into a module,
Martin Mueller <=