Цитата(eugmai86 @ Apr 10 2011, 19:38)

Доброго времени суток, есть проблема чтения и записи регистров модуля акселерометра работающего через SPI. Подскажите как на Си читать и писать в регистры данного модуля. Например нужно отправить с меги 16 значение 0b00000101 в регистр $16. SPI разобрался как конфигурировать, проблема за малым. Спасибо
Нажмите для просмотра прикрепленного файлаУспешно применяем данный акселерометр в проектах.
Код инициализации и управления довольно простой - не жалко привести полностью
Основные условия - MOSI, MISO, SCK, nCS должны быть согласовыны по уровням с управляющим процессором.
SELECT_SPI(pin) - думаю сами догадаетесь как организовать
SPIWriteChar(unsigned char), SPIReadChar() - в любой доке на атмегу есть 100% рабочий код отправки/приёма данных по SPI
Естественно перед работой SPI настраивается в режиме мастер а nCS как выход.
CODE
#ifndef mm745x_h
#define mm745x_h
/****************************************************************/
//адреса регистро акселерометра
enum {
XOUTL = 0x00, //10битные регистры результата по осям XYZ
XOUTH = 0x01,
YOUTL = 0x02,
YOUTH = 0x03,
ZOUTL = 0x04,
ZOUTH = 0x05,
XOUT8 = 0x06, //8битные регистры результата по осям XYZ
YOUT8 = 0x07,
ZOUT8 = 0x08,
STATUS = 0x09, //регистр статуса
DETSRC = 0x0a, //
TOUT = 0x0B,
I2CCAD = 0x0D, //регистр адреса I2C, старший бит запрещает I2C
XOFFL = 0x10, //10битные регистры сдвига по осям XYZ
XOFFH = 0x11,
YOFFL = 0x12,
YOFFH = 0x13,
ZOFFL = 0x14,
ZOFFH = 0x15,
MCTL = 0x16, //регистр рабочего режима
INTRST = 0x17, //регистр сброса прерываний
CTL1 = 0x18, //
CTL2 = 0x19, //
LDTH = 0x1A, //минимальный порог уровня
PDTH = 0x1B, //минимальный порог импульса
PW = 0x1C, //величина длительности
LT = 0x1D, //величина задержки
TW = 0x1E, //длительность окна для второго импульса
};
/****************************************************************/
/****************************************************************/
//константы регистра статуса (регистр STATUS)
enum{
DRDYStat = (1<<0), //статус данных
DOVRStat = (1<<1), //статус перезаписи данных
PERRStat = (1<<2), //ошибка чётности при тесте
};
/****************************************************************/
/****************************************************************/
//константы настройки интерфейса I2C (разрешение/запрещение, регистр I2CCAD)
enum{
I2CDIS = (1<<7), //запрещение интерфейса I2C установкой бита I2CDIS в 1
};
/****************************************************************/
/****************************************************************/
//константы настройки рабочего режима (регистр MCTL)
enum{
STDB = 0, //режимы работы
MES = 1,
LEVEL = 2,
PULSE = 3,
G8 = (0<<2), //настройка чувствительности
G4 = (1<<2),
G2 = (2<<2),
SPI4 = (0<<5), //режим работы spi
SPI3 = (1<<5),
DRDYPINON = (0<<6), //режим работы вывода DRDY
DRDYPINOFF = (1<<6),
};
/****************************************************************/
/****************************************************************/
//константы настройки рабочего режима (регистр INTRST)
enum{
CLRINT2 = (1<<1), //сброс INT2 - сначала записываем 1 потом 0
CLRINT1 = (1<<0), //сброс INT1 - сначала записываем 1 потом 0
};
/****************************************************************/
#endif //mm745x_h
/*********************************************************/
//запись значения в заданный адрес
void mm745xWrite(unsigned char reg, unsigned char data)
{
SELECT_SPI(nSS_MM745X);
SPIWriteChar( ((reg &0x3F)<<1)|0x80 );
SPIWriteChar(data);
DESELECT_SPI();
}
/*********************************************************/
/*********************************************************/
//чтение значения регистра
unsigned char mm745xRead(unsigned char reg)
{
unsigned char data;
SELECT_SPI(nSS_MM745X);
SPIWriteChar( (reg &0x3F)<<1 );
data = SPIReadChar();
DESELECT_SPI();
return(data);
}
/*********************************************************/
/*********************************************************/
mm745xInit(void)
{
//запрещаем работу шины I2C
mm745xWrite(I2CCAD, I2CDIS);
//настройка режима работы акселерометра
mm745xWrite(MCTL, SPI4|G2|MES);
//выполняем фиктивное чтение после инициализации
mm745xRead(XOUT8);
mm745xRead(YOUT8);
mm745xRead(ZOUT8);
}
/*********************************************************/