Технический форум по робототехнике.
eugmai86 » 10 апр 2011, 20:11
Доброго времени суток, есть проблема чтения и записи регистров модуля акселерометра работающего через SPI. Подскажите как на Си читать и писать в регистры данного модуля. Например нужно отправить с меги 16 значение 0b00000101 в регистр $16. SPI разобрался как конфигурировать, проблема за малым. Спасибо
- Вложения
-
- MMA7455L Акселерометр.pdf
- (519.11 КиБ) Скачиваний: 0
-
- mega16.pdf
- (7.14 МиБ) Скачиваний: 0
Последний раз редактировалось
eugmai86 10 апр 2011, 20:52, всего редактировалось 2 раз(а).
dccharacter » 10 апр 2011, 20:29
в даташите протокол всегда прописан. прикрепите даташит.
eugmai86 » 10 апр 2011, 22:06
В ДШ написано:
SPI Write Operation
In order to write to one of the 8-bit registers, an 8-bit write command must be sent to the MMA7455L. The write command consists
of an MSB (0=read, 1=write) to indicate writing to the MMA7455L register, followed by a 6-bit address and 1 don’t care bit.
The command should then be followed the 8-bit data transfer. See Figure 13 for the timing diagram for an 8-bit data write.
Значит ли это чтоб записать данные в регистр нужно
SPI_MasterTransmit(0b10101100); //записываю в 16 регистр мма7455
SPI_MasterTransmit(0b00000101); // значение 0b00000101
dccharacter » 10 апр 2011, 22:25
если 16 регистр это 0x16, то да. если 16 регистр - это 16, то нет
))
eugmai86 » 12 апр 2011, 15:41
ок спасибо буду пробовать
eugmai86 » 17 апр 2011, 22:26
Уже неделю пытаюсь добиться работы акселерометра. Но все никак. Подозрение вызывает потребляемый ток 1.7 mA По ДШ 490 мкА максимум. Питаю акселерометр от L78L33. МК от 5В. Согласование уровней МК - Датчик сделал на мосфетах по AN97055. Черт его знает, что не так.
Вот ф-ция отправки и получения
void SPI_MasterTransmit(char cReg, char cData)
{
unsigned char x;
CS=0; //прижимаем CS к земле, давая понять что передача пошла
SPDR=(((cReg&0x3F)<<1)|0x80); /* Start transmission */
while(!(SPSR&(1<<SPIF)));/* Wait for transmission complete */
x = SPDR;//dummy read
SPDR = cData;
while(!(SPSR&(1<<SPIF)));/* Wait for transmission complete */
x = SPDR;//dummy read
CS=1;
}
unsigned char SPI_MasterReceive(char cReg)
{
unsigned char x;
CS=0;// прижимаем CS к земле, давая понять что передача пошла
SPDR=((cReg&0x3F)<<1); // write in the register address with the read comman
while(!(SPSR&(1<<SPIF))); /* Wait for reception complete */
x=SPDR;//dummy read
CS=1;
return x; /* Return data register */
}
Кому не лень, гляньте код, и еще насколько я понял из ДШ SPI должен быть "вариант 0" для МК Мега16
я пользую такую настройку
SPCR=0b01010011;
/*{
7: SPIE: SPI Interrupt Enable
6: SPE: SPI Enable
5: DORD: Data Order
4: MSTR: Master/Slave Select
3: CPOL: Clock Polarity
2: CPHA: Clock Phase
1,0: Bits 1, 0 – SPR1, SPR0: SPI Clock Rate Select 1 and 0
}*/
boez » 18 апр 2011, 11:59
Receive неправильный.
У тебя данные вообще не принимаются в твоем коде - команду послал и все, CS=1 и выход.
- Код: Выделить всё • Развернуть
SPDR=((cReg&0x3F)<<1); // write in the register address with the read comman
while(!(SPSR&(1<<SPIF))); /* Wait for reception complete */
x=SPDR;//dummy read
А надо после команды послать еще один пустой байт, чтобы дать девайсу возможность тебе ответить, смотри картинки на стр 18. У тебя ж 4-проводное подключение?
- Код: Выделить всё • Развернуть
SPDR=((cReg&0x3F)<<1); // write in the register address with the read comman
while(!(SPSR&(1<<SPIF))); /* Wait for transmission complete */
x=SPDR;//dummy read
SPDR=0xff; // Dummy write
while(!(SPSR&(1<<SPIF))); /* Wait for reception complete */
x=SPDR;//Real read
Настройка SPCR на глаз вроде правильная (Master, DORD=0: MSB first, Mode 0, CLK/64)
eugmai86 » 23 апр 2011, 16:18
понял, спасибо. буду пробовать