roboforum.ru

Технический форум по робототехнике.

SPI отправка и получение данных с регистров ведомого устр.

Раздел создан специально для людей которым интересна робототехника, но в силу разных причин они не знают с чего начать.
Задавайте ваши вопросы, какими бы простыми они не казались, постоянные посетители форума постараются ответить на них по мере своих сил.
Робот своими руками. Самодельный робот.

SPI отправка и получение данных с регистров ведомого устр.

Сообщение 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 раз(а).
Аватара пользователя
eugmai86
 
Сообщения: 22
Зарегистрирован: 10 фев 2011, 22:35

Re: SPI отправка и получение данных с регистров ведомого уст

Сообщение dccharacter » 10 апр 2011, 20:29

в даташите протокол всегда прописан. прикрепите даташит.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: SPI отправка и получение данных с регистров ведомого уст

Сообщение 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
Аватара пользователя
eugmai86
 
Сообщения: 22
Зарегистрирован: 10 фев 2011, 22:35

Re: SPI отправка и получение данных с регистров ведомого уст

Сообщение dccharacter » 10 апр 2011, 22:25

если 16 регистр это 0x16, то да. если 16 регистр - это 16, то нет :-)))
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: SPI отправка и получение данных с регистров ведомого уст

Сообщение eugmai86 » 12 апр 2011, 15:41

ок спасибо буду пробовать
Аватара пользователя
eugmai86
 
Сообщения: 22
Зарегистрирован: 10 фев 2011, 22:35

Re: SPI отправка и получение данных с регистров ведомого уст

Сообщение 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
}*/
Аватара пользователя
eugmai86
 
Сообщения: 22
Зарегистрирован: 10 фев 2011, 22:35

Re: SPI отправка и получение данных с регистров ведомого уст

Сообщение 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)
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: SPI отправка и получение данных с регистров ведомого уст

Сообщение eugmai86 » 23 апр 2011, 16:18

понял, спасибо. буду пробовать
Аватара пользователя
eugmai86
 
Сообщения: 22
Зарегистрирован: 10 фев 2011, 22:35


Вернуться в Новичкам или основы основ роботостроения.

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18