Пытаюсь запустить супер акселерометр-магнитометр LSM303DLH в связке с PIC18F2550. Обмен по i2c. Судя по картинке с осциллографа инициализация проходит нормально, а с вот чтением данных облом.
Привожу код (компилятор ccs):
Код
#define __USB_PIC_PERIF__ 1
#include <18F2550.h>
#device ADC=10
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=20000000)
#use i2c(Master, SDA=PIN_B0, SCL=PIN_B1)
#define USB_HID_DEVICE TRUE
#define USB_EP1_TX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_TX_SIZE 64
#define USB_EP1_RX_ENABLE USB_ENABLE_INTERRUPT
#define USB_EP1_RX_SIZE 64
#include <pic18_usb.h>
#include <desc.h>
#include <usb.c>
#include <LSM303.c>
void main() {
int8 in_data[8];
int8 out_data[8];
int16 mm1, mm2, mm3, mm4;
unsigned char ACC_Data[6];
SETUP_ADC_PORTS(AN0);
SETUP_ADC(ADC_CLOCK_DIV_64);
SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_1);
SETUP_TIMER_1(T1_DISABLED);
SETUP_TIMER_2(T2_DISABLED, 127, 1);
SETUP_TIMER_3(T3_INTERNAL | T3_DIV_BY_8);
SETUP_CCP1(CCP_OFF);
SETUP_CCP2(CCP_OFF);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
usb_init();
output_high(PIN_B0);
output_high(PIN_B1);
delay_us(100);
while (TRUE) {
usb_task();
if (usb_enumerated()) {
if (usb_kbhit(1)) {
usb_get_packet(1, in_data, 64);
out_data[0] = 0;
set_adc_channel(0);
delay_us(30);
mm1=READ_ADC();
out_data[1] = mm1;
out_data[2] = mm1>>8;
LSM303Init();
i2c_start();
i2c_write(MAG_ADDRESS); // write mag
i2c_write(OUT_X_H_M); // Select register OUT_X_L_M
i2c_start(); // repeated start
i2c_write(0x3D); // read mag
/*
For magnetic sensor, the default (factory) 7-bit slave address is 0011110b
(0x3C) for write operations, or 00111101b (0x3D) for read operations.
*/
ACC_Data[0] = i2c_read();//read OUT_X_H_M (MSB)
ACC_Data[1] = i2c_read();//read OUT_X_L_M (LSB)
ACC_Data[2] = i2c_read();//read OUT_Y_H_M (MSB)
ACC_Data[3] = i2c_read();//read OUT_Y_L_M (LSB)
ACC_Data[4] = i2c_read();//read OUT_Z_H_M (MSB)
ACC_Data[5] = i2c_read(0);//read OUT_Z_L_M (LSB) NACK
i2c_stop();
out_data[3] = ACC_Data[1];
delay_us(30);
out_data[4] = ACC_Data[2];
delay_us(30);
out_data[5] = ACC_Data[3];
delay_us(30);
out_data[6] = ACC_Data[4];
delay_us(30);
out_data[7] = ACC_Data[5];
usb_put_packet(1, out_data, 64, USB_DTS_TOGGLE);
}
}
}
}
Код инициализации:
Код
#ifndef LSM303
#define LSM303
//////////////////////////////////////
#define ACC_ADDRESS (0x30)
#define MAG_ADDRESS (0x3C)
#define CTRL_REG1_A (0x20)
#define CTRL_REG2_A (0x21)
#define CTRL_REG3_A (0x22)
#define CTRL_REG4_A (0x23)
#define CTRL_REG5_A (0x24)
#define HP_FILTER_RESET_A (0x25)
#define REFERENCE_A (0x26)
#define STATUS_REG_A (0x27)
#define OUT_X_L_A (0x28)
#define OUT_X_H_A (0x29)
#define OUT_Y_L_A (0x2A)
#define OUT_Y_H_A (0x2B)
#define OUT_Z_L_A (0x2C)
#define OUT_Z_H_A (0x2D)
#define INT1_CFG_A (0x30)
#define INT1_SOURCE_A (0x31)
#define INT1_THS_A (0x32)
#define INT1_DURATION_A (0x33)
#define INT2_CFG_A (0x34)
#define INT2_SOURCE_A (0x35)
#define INT2_THS_A (0x36)
#define INT2_DURATION_A (0x37)
#define CRA_REG_M (0x00)
#define CRB_REG_M (0x01)
#define MR_REG_M (0x02)
#define OUT_X_H_M (0x03)
#define OUT_X_L_M (0x04)
#define OUT_Y_H_M (0x05)
#define OUT_Y_L_M (0x06)
#define OUT_Z_H_M (0x07)
#define OUT_Z_L_M (0x08)
#define SR_REG_M (0x09)
#define IRA_REG_M (0x0A)
#define IRB_REG_M (0x0B)
#define IRC_REG_M (0x0C)
//////////////////////////////////////
void LSM303Init()
{
i2c_start();
i2c_write(ACC_ADDRESS);
i2c_write(CTRL_REG1_A);
i2c_write(0x27);
i2c_stop();
i2c_start();
i2c_write(MAG_ADDRESS);
i2c_write(MR_REG_M);
i2c_write(0x00);
i2c_stop();
}
#endif
ACC_Data[0]..[5] на выходе получаются со значениями 255. В чем может быть косяк? Распаяно все вроде правильно,с пиком косяков нет, т.к. параллельно для проверки запущен АЦП и передача данных по HID на комп. Схемку для датчика брал
здесь.
Заранее спасибо.
ps:
ссылка на докиподробнее о датчикеисходник для avr'a