SCP1000 I2C fixes

This commit is contained in:
Martin Mueller
2009-10-17 22:29:24 +00:00
parent 99df5132e7
commit aea4697d3c
7 changed files with 72 additions and 245 deletions
+30 -11
View File
@@ -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
+15 -17
View File
@@ -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>
+2 -2
View File
@@ -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
View File
@@ -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
//////////
+5 -4
View File
@@ -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;
+1
View File
@@ -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;
+13 -6
View File
@@ -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