реклама на сайте
подробности

 
 
5 страниц V  < 1 2 3 4 > »   
Reply to this topicStart new topic
> SPI отправка и получение данных с регистров ведомого устр.
rezident
сообщение Apr 17 2011, 19:42
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Я уже что-то перестал понимать. cranky.gif Вы какой интерфейс для связи используете: SPI или I2C? Приведенная схема согласования уровней для I2C вообще-то.
Go to the top of the page
 
+Quote Post
eugmai86
сообщение Apr 17 2011, 19:49
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737



Да, для I2C, но чем она для SPI не подходит то. Просто добавил 1 каскад для CS.
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 17 2011, 20:04
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Тогда следующий вопрос для "партизана". Какой у вас режим SPI используется: 3-х проводный или 4-х проводный? В МК используются CS (SS?), SCK, MOSI, MISO или вы ограничились только первыми тремя?
Go to the top of the page
 
+Quote Post
Слесарь
сообщение Apr 17 2011, 20:08
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



А у него чип на шине наверное всегда выбран и он эту линию не использует
Go to the top of the page
 
+Quote Post
eugmai86
сообщение Apr 18 2011, 04:20
Сообщение #20


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737



4-х проводной SPI используется, SCK, MOSI, MISO и SS. SS настроен на выход как в ДШ, чтоб МК не "пугался" когда я его опускаю.
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 18 2011, 09:26
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



А преобразование уровней только для трех сигналов используется?
Go to the top of the page
 
+Quote Post
eugmai86
сообщение Apr 18 2011, 09:39
Сообщение #22


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737



да, преобразую только СS MISO, MOSI. SCK оставил без согласования
Go to the top of the page
 
+Quote Post
Слесарь
сообщение Apr 18 2011, 09:52
Сообщение #23


Гуру
******

Группа: Свой
Сообщений: 2 884
Регистрация: 7-11-09
Из: Ростовская обл.
Пользователь №: 53 484



А какие тайминги рекомендует производитель? Ведь наверняка в таймингах указано последовательность использования портов, с обизательным учетом SCK

Сообщение отредактировал Слесарь - Apr 18 2011, 09:52
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 18 2011, 09:55
Сообщение #24


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Цитата(eugmai86 @ Apr 18 2011, 13:39) *
да, преобразую только СS MISO, MOSI. SCK оставил без согласования

Лучше уж было отключить Pull резистор MK на SS ( CS) выходе . Подать через внешний резистор 3.3V на этот выход. А SCK - согласовать


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Apr 18 2011, 10:04
Сообщение #25


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Цитата(eugmai86 @ Apr 10 2011, 19:38) *
Доброго времени суток, есть проблема чтения и записи регистров модуля акселерометра работающего через SPI. Подскажите как на Си читать и писать в регистры данного модуля. Например нужно отправить с меги 16 значение 0b00000101 в регистр $16. SPI разобрался как конфигурировать, проблема за малым. Спасибо[attachment=55349:MMA7455L...________.pdf]


Успешно применяем данный акселерометр в проектах.
Код инициализации и управления довольно простой - не жалко привести полностью
Основные условия - 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);

}
/*********************************************************/


Сообщение отредактировал mempfis_ - Apr 18 2011, 10:06
Go to the top of the page
 
+Quote Post
eugmai86
сообщение Apr 18 2011, 11:10
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 29
Регистрация: 20-03-11
Пользователь №: 63 737



спасибо всем! буду пробовать.
Go to the top of the page
 
+Quote Post
Белка12
сообщение Jun 8 2011, 07:49
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 29-01-09
Пользователь №: 44 159



Цитата(rezident @ Apr 17 2011, 22:36) *
В функции SPI_MasterReceive у вас присутствует алгоритмическая ошибка, на возможность которой я указал еще в посте №3. Для того, чтобы что-то прочитать мастер должен что-либо передать. Причем запись и чтение идет одновременно, но информация которую должен получать мастер сдвинута по времени как минимум на один байт. Вы первой транзакцией в функции SPI_MasterReceive передаете адрес регистра, но по окончании передачи в регистре приемника SPI вовсе не искомое значение регистра, а некий мусор. Для получения значения нужно, не отпуская CS, произвести еще одну запись, передав dummy-байт. Только после завершения передачи этого второго незначащего байта в регистре приемника SPI будет значение регистра, адрес которого вы передали первым байтом. Все это хорошо видно на времянке Figure11. SPI Timing Diagram for 8-Bit Register Read (4 Wire Mode) из даташит.

У меня к Вам вопрос.

В случае только одной передачи, о чтении можно "забыть"?

Т.е. только посылать данные от master для другого устройства, в моем случае - дисплея?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 8 2011, 09:14
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Белка12 @ Jun 8 2011, 11:49) *
В случае только одной передачи, о чтении можно "забыть"?
Можно
Go to the top of the page
 
+Quote Post
Белка12
сообщение Jun 23 2011, 19:25
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 63
Регистрация: 29-01-09
Пользователь №: 44 159



Цитата(Палыч @ Jun 8 2011, 13:14) *
Можно


Никак не получается передача по SPI. Есть ведущий контроллер ADUC831 и ведомый графический OLED дисплей BL12864G (контроллер SSD1303).

Оба устройства имеют встроенные SPI….
Задаю конфигурацию SPI:

MOV SPICON,#03FH;

Т.е SPE=1 разрешение интерфейса SPI ; SPIM=1 режим ведущий; CPOL=1тактирование – SCLOCK - высокий уровень, CPHA=1 срабатывание по переднему фронту SCLOCK; SPR0=1, SPR1=1 Выбранная скорость передачи равна fcore/16.
Код
;-----------------------------------------
COMMAND:
        CLR     DC    ;DC=LOW SEND COMMAND
        CLR     CS
        NOP
        NOP
;--------------------------------------
SEND:   CLR    ISPI
    NOP
    MOV    SPIDAT,A; OUTPUT
    JNB    ISPI,$
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
   SETB    CS
    NOP
    NOP
    RET


Код
SENDDATA:
        SETB    DC
        CLR     CS
        NOP
        NOP
SEND1:  CLR    ISPI
    NOP
    MOV    SPIDAT,A; OUTPUT
    JNB    ISPI,$
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
    NOP
  SETB    CS; /ss
    NOP
    RET


Прерывания по SPI:

Код
SPIG:    CLR    WCOL
    CLR    ISPI        ;
    CLR    LED_RED
    LCALL   DELLM;    
  SETB    LED_RED
    LCALL    DELLM;    

    RETI


Да, вот еще...
Так ли важно, чтобы сигнал CS (SS), заканчивался с последним тактом SCLOKC, или он может быть длиннее и даже значительно длиннее?

Сообщение отредактировал Белка12 - Jun 23 2011, 19:26
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jun 24 2011, 08:48
Сообщение #30


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Белка12 @ Jun 23 2011, 23:25) *
Прерывания по SPI
У Вас, вроде бы, работа с SPI по готовности... Или как?

Цитата(Белка12 @ Jun 23 2011, 23:25) *
Так ли важно, чтобы сигнал CS (SS), заканчивался с последним тактом SCLOKC, или он может быть длиннее и даже значительно длиннее?
Может быть значительно длиннее.
Go to the top of the page
 
+Quote Post

5 страниц V  < 1 2 3 4 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016