Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI отправка и получение данных с регистров ведомого устр.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
eugmai86
Доброго времени суток, есть проблема чтения и записи регистров модуля акселерометра работающего через SPI. Подскажите как на Си читать и писать в регистры данного модуля. Например нужно отправить с меги 16 значение 0b00000101 в регистр $16. SPI разобрался как конфигурировать, проблема за малым. СпасибоНажмите для просмотра прикрепленного файла
Палыч
На странице 18 всё написано/нарисовано (рис 13): передаем в первом байте адрес и направление передачи (1=write); второй байт - данные.
rezident
Не нужно забывать, что SPI не просто передает или принимает, а производит обмен данными. Поэтому, чтобы что-то прочитать ведущий SPI должен что-то (dummy byte(s)) передать ведомому (акселерометру в данном случае).
eugmai86
т.е. для записи в регистр ММА7455 можно так:
SPI_MasterTransmit(0b11011000); //записываю в 16 регистр мма7455
SPI_MasterTransmit(0b00000101); // значение 0b00000101
где SPI_MasterTransmit ф-ция записи в регистр
???
Палыч
Цитата(eugmai86 @ Apr 10 2011, 21:56) *
т.е. для записи в регистр ММА7455 можно так:
SPI_MasterTransmit(0b11011000); //записываю в 16 регистр мма7455
...........
Вы забыли, что нужно управлять ещё сигналом CS. И адрес у Вас как-то странно задан: должно быть
SPI_MasterTransmit(0b10100000); //записываю в 16 регистр мма7455
eugmai86
ясно, спасибо, буду пробовать
eugmai86
Уже неделю пытаюсь добиться работы акселерометра. Но все никак. Подозрение вызывает потребляемый ток 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
}*/
rezident
В функции SPI_MasterReceive у вас присутствует алгоритмическая ошибка, на возможность которой я указал еще в посте №3. Для того, чтобы что-то прочитать мастер должен что-либо передать. Причем запись и чтение идет одновременно, но информация которую должен получать мастер сдвинута по времени как минимум на один байт. Вы первой транзакцией в функции SPI_MasterReceive передаете адрес регистра, но по окончании передачи в регистре приемника SPI вовсе не искомое значение регистра, а некий мусор. Для получения значения нужно, не отпуская CS, произвести еще одну запись, передав dummy-байт. Только после завершения передачи этого второго незначащего байта в регистре приемника SPI будет значение регистра, адрес которого вы передали первым байтом. Все это хорошо видно на времянке Figure11. SPI Timing Diagram for 8-Bit Register Read (4 Wire Mode) из даташит.
eugmai86
unsigned char SPI_MasterReceive(char cReg)
{
unsigned char x;
CS=0;// прижимаем CS к земле, давая понять что передача пошла
//x = SPDR;//dummy read
//while(!(SPSR & (1<<SPIF))); /* Wait for reception complete */
SPDR=((cReg&0x3F)<<1); // write in the register address with the read comman
while(!(SPSR&(1<<SPIF))); /* Wait for reception complete */
SPDR=0x00;//DUMMY BYTE
while(!(SPSR & (1<<SPIF)));
x=SPDR;
CS=1;
return x; /* Return data register */

Както так?
rezident
Цитата(eugmai86 @ Apr 18 2011, 00:41) *
Както так?
Названия регистров и назначение отдельных битов AVR я знаю плохо, но алгоритмически - да, примерно так.
eugmai86
Прошиваю) Пишу в $16 регистр 0b00000101 (включаю акселерометр в measurement mode), считываю регистр $16 а там 255.
Слесарь
Мож мой сырой код чем-то поможет

Код
void spi_io_w( char byte_h, char byte_l )
{
    write_byte( byte_h );
    write_byte( byte_l );
}

void write_byte( char dat )
{
    char n;
    for( n = 0; n < 8; n++ )
    {
        SCK_PIN = 1;
        DelayUs( 20 );
        if ( dat & 0x80 ) /* most sign bit first */
        {
            SDO_PIN = 1;
        }
        else
        {
            SDO_PIN = 0;
        }
        dat = ( dat << 1 ) | SDI_PIN;
        DelayUs( 100 );
        SCK_PIN = 0;
        DelayUs( 120 );
    }
}

void spi_io_24b( char * p_spi_byte_h, char * p_spi_byte_s, char * p_spi_byte_l )
{
    unsigned char byte_h = 0;
    unsigned char byte_s = 0;
    unsigned char byte_l = 0;
    char n;

    for( n = 0; n < 8; n++ )
    {
        SCK_PIN = 1;
        DelayUs( 20 );
        byte_h = ( byte_h << 1 ) | SDI_PIN;
        DelayUs( 100 );
        SCK_PIN = 0;
        DelayUs( 120 );
    }

    for( n = 0; n < 8; n++ )
    {
        SCK_PIN = 1;
        DelayUs( 20 );
        byte_s = ( byte_s << 1 ) | SDI_PIN;
        DelayUs( 100 );
        SCK_PIN = 0;
        DelayUs( 120 );
    }

    for( n=0; n < 8; n++ )
    {
        SCK_PIN = 1;
        DelayUs( 20 );
        byte_l = ( byte_l << 1 ) | SDI_PIN;
        DelayUs( 100 );
        SCK_PIN = 0;
        DelayUs( 120 );
    }

    *p_spi_byte_l = byte_l;
    *p_spi_byte_s = byte_s;
    *p_spi_byte_h = byte_h;
}
eugmai86
Боюсь что датчик вышел из строя, мне не нравится его ток 1.7 мА в режиме "выключен". В ДШ 2.5 - 10 мкА написано в таком режиме. Хотя странно, больше 3.3 я ему не давал, SPI по уровням с МК согласован...
rezident
Цитата(eugmai86 @ Apr 18 2011, 00:45) *
Пишу в $16 регистр 0b00000101
А вы уверены что именно в этот регистр? В даташите 16-тиричные адреса регистров указаны. А у вас какое-то странное преобразование адреса, переданного в функцию, происходит при записи его непосредственно в регистр передатчика SPI.
Код
SPDR=((cReg&0x3F)<<1);
Что это? Для чего?

Цитата(eugmai86 @ Apr 18 2011, 01:10) *
SPI по уровням с МК согласован...
Как именно согласовывали?
eugmai86
Чтоб датчик понял "write" MSB должен быть 1, дальше 6 бит адреса и один dont care bit.
Чтоб датчик понял "read" MSB должен быть 0, дальше 6 бит адреса и один dont care bit.
Беру cReg в hex дальше ((cReg&0b00111111)<<1)|0b10000000
Это преобразование взято из апноута по данному акселерометру (AN3468). При его использовании не надо вручную переставлять биты регистра который нужно записать/считать, а просто указать его в шестнадцатеричной форме.


Согласование уровней, апноут AN97055
Нажмите для просмотра прикрепленного файла
rezident
Я уже что-то перестал понимать. cranky.gif Вы какой интерфейс для связи используете: SPI или I2C? Приведенная схема согласования уровней для I2C вообще-то.
eugmai86
Да, для I2C, но чем она для SPI не подходит то. Просто добавил 1 каскад для CS.
rezident
Тогда следующий вопрос для "партизана". Какой у вас режим SPI используется: 3-х проводный или 4-х проводный? В МК используются CS (SS?), SCK, MOSI, MISO или вы ограничились только первыми тремя?
Слесарь
А у него чип на шине наверное всегда выбран и он эту линию не использует
eugmai86
4-х проводной SPI используется, SCK, MOSI, MISO и SS. SS настроен на выход как в ДШ, чтоб МК не "пугался" когда я его опускаю.
rezident
А преобразование уровней только для трех сигналов используется?
eugmai86
да, преобразую только СS MISO, MOSI. SCK оставил без согласования
Слесарь
А какие тайминги рекомендует производитель? Ведь наверняка в таймингах указано последовательность использования портов, с обизательным учетом SCK
ILYAUL
Цитата(eugmai86 @ Apr 18 2011, 13:39) *
да, преобразую только СS MISO, MOSI. SCK оставил без согласования

Лучше уж было отключить Pull резистор MK на SS ( CS) выходе . Подать через внешний резистор 3.3V на этот выход. А SCK - согласовать
mempfis_
Цитата(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);

}
/*********************************************************/
eugmai86
спасибо всем! буду пробовать.
Белка12
Цитата(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 для другого устройства, в моем случае - дисплея?
Палыч
Цитата(Белка12 @ Jun 8 2011, 11:49) *
В случае только одной передачи, о чтении можно "забыть"?
Можно
Белка12
Цитата(Палыч @ 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, 23:25) *
Прерывания по SPI
У Вас, вроде бы, работа с SPI по готовности... Или как?

Цитата(Белка12 @ Jun 23 2011, 23:25) *
Так ли важно, чтобы сигнал CS (SS), заканчивался с последним тактом SCLOKC, или он может быть длиннее и даже значительно длиннее?
Может быть значительно длиннее.
Белка12
Цитата(Палыч @ Jun 24 2011, 12:48) *
У Вас, вроде бы, работа с SPI по готовности... Или как?


По готовности выставляется бит ISPI в регистре режима SPICON и генерируется прерывание, вернее даже не по готовности, а устанавливается аппаратно, когда последний бит передается из SPIDAT. В прерывании я снимаю ISPI.

П.С. Вот и подумала, что можно и подавать высокий уровень на CS (SS) тоже в прерывании...Ведь передача окончена?

Цитата
Может быть значительно длиннее.

Спасибо.sm.gif
Просто из иллюстраций было как-то непонятно.
Палыч
Цитата(Белка12 @ Jun 24 2011, 13:41) *
В прерывании я снимаю ISPI.
Вы это и так делаете в процедурах передачи команд\данных
Белка12
Цитата(Палыч @ Jun 24 2011, 13:57) *
Вы это и так делаете в процедурах передачи команд\данных

Вообще-то флаг ISPI выставляется без моего участия, он выставляется самим контроллером аппаратно при передаче последнего передаваемого бита.
А снимаю я его только в подпрограмме работающей по прерыванию от SPI...

Или я Вас не так поняла?
Палыч
Цитата(Белка12 @ Jun 25 2011, 17:02) *
А снимаю я его только в подпрограмме работающей по прерыванию от SPI...

Тогда, вот это - что?
Код
SEND:   CLR    ISPI
Код
SEND1:  CLR    ISPI

Впрочем, это не повод, чтобы не рабатала передача... А, что "говорит" осциллограф?
Белка12
Цитата(Палыч @ Jun 25 2011, 18:16) *
Тогда, вот это - что?
Код
SEND:   CLR    ISPI
Код
SEND1:  CLR    ISPI


А, ну да, wub.gif
Это у меня «заклинило».

Это в начале, в общем, получается, в прерывании перестраховка...


Цитата
Впрочем, это не повод, чтобы не работала передача... А, что "говорит" осциллограф?


Осциллограф не очень может работать в мегагерцовом диапазоне, но то, что он показывает по SKL, выглядит как бы на очень большом промежутке времени, в его начале появляется синхросигнал из очень коротких импульсов~100 нс, (это, если синхронизироваться от CS), а вот по MOSI вообще ерунда идет…. Никак стабилизировать не удается, вообще-то надо попробовать синхронизировать по SKL или MOSI, наверное….



Рисовала от руки. "В провале" по MOSI вообще трудно что-то разобрать. А на высоком уровне после низкого уровня какой-то срыв сигнала.
Белка12
Палыч, что скажете?

Может, я написала не очень понятно?
Палыч
Цитата(Белка12 @ Jun 25 2011, 20:41) *
Осциллограф не очень может работать в мегагерцовом диапазоне
На время отладки понизьте частоту обмена (SCLK) раз этак в 10-20, а если и понадобится, то и в 100.
Белка12
Цитата(Палыч @ Jun 26 2011, 18:45) *
На время отладки понизьте частоту обмена (SCLK) раз этак в 10-20, а если и понадобится, то и в 100.


Я попробую. Но, к сожалению, частоту понизить можно только в 2, 4, 8, 16 раз. (Таковы возможности микросхемы ADuC831).


Цитата
Выбранная скорость передачи
fCORE/2
fCORE/4
fCORE/8
fCORE/16
( fCORE – частота ядра)
Белка12


Уменьшила частоту SLK, вот что получилось.
Наверное все ОК?
И дело не в передаче по SPI, а либо в исправности дисплея, либо в недочетах его инициализации.
Молчит, увы.crying.gif
Палыч
Цитата(Белка12 @ Jun 28 2011, 10:49) *
Уменьшила частоту SLK, вот что получилось. Наверное все ОК?
Настораживает число импульсов на линии SKL (я так понимаю, что это тактирующие импульсы SCLK) - почему их девять? Передаётся байт - восемь бит...
=AK=
Цитата(Палыч @ Jun 28 2011, 17:18) *
Настораживает число импульсов на линии SKL (я так понимаю, что это тактирующие импульсы SCLK) - почему их девять? Передаётся байт - восемь бит...


Похоже, что их все-таки 8, однако состояние этой линии по умолчанию не низкое, как должно быть, а высокое. Из-за этого дисплей вполне может сходить с ума.
Белка12
Цитата(Палыч @ Jun 28 2011, 11:48) *
Настораживает число импульсов на линии SKL (я так понимаю, что это тактирующие импульсы SCLK) - почему их девять? Передаётся байт - восемь бит...


Вообще-то их восемь. Это я один лишний "провал" нарисовала.
Уже исправила.

Цитата(=AK= @ Jun 28 2011, 15:46) *
Похоже, что их все-таки 8, однако состояние этой линии по умолчанию не низкое, как должно быть, а высокое. Из-за этого дисплей вполне может сходить с ума.


Так в даташите дисплея именно у интерфейса SPI высокое состояние, а низкое или высокое устанавливается битом CPOL =0/1.


Палыч
Только внимательно посмотрев на Ваши функции вывода заметил ошибку. По всей видимости, Вы выдаёте на дисплей некий байт данных и желаете его увидеть на экране.
Обратите внимание на рисунок 6: CS# опускается не на передачу одного байта данных/команды (как это сделано у Вас), а на группу байт.

При передаче данных необходимо:
1) установить низкий уровень на CS#;
2) передать один или несколько байт данных (при этом D/C - высокий уровень);
3) выдать команду NOP (D/C - низкий);
4) установить высокий уровень на CS#.

При передаче многобайтных команд CS# также должен "охватывать" их все.
Белка12
Цитата(Палыч @ Jun 28 2011, 18:40) *
Только внимательно посмотрев на Ваши функции вывода заметил ошибку. По всей видимости, Вы выдаёте на дисплей некий байт данных и желаете его увидеть на экране.
Обратите внимание на рисунок 6: CS# опускается не на передачу одного байта данных/команды (как это сделано у Вас), а на группу байт.


1. А где этот рисунок 6????????????? Вы имеете ввиду иллюстрацию из даташита?
2. Собственно, а какая разница, предавать по одному байту или группой?
На мой взгляд, важно только чтобы был обеспечен низкий уровень CS на время передачи. ИМХО, конечно.

Цитата
При передаче данных необходимо:
1) установить низкий уровень на CS#;
2) передать один или несколько байт данных (при этом D/C - высокий уровень);
3) выдать команду NOP (D/C - низкий);
4) установить высокий уровень на CS#.


А зачем здесь после передачи данных устанавливать D/C низкий?
Цитата
При передаче многобайтных команд CS# также должен "охватывать" их все.

Это ладно.

Я так понимаю, что после инициализации дисплея без всякой очистки и вывода данных, только после вывода одних команд инициализации, на экране должен появиться мусор, а не появляется.
Палыч
Цитата(Белка12 @ Jun 28 2011, 20:30) *
1. А где этот рисунок 6????????????? Вы имеете ввиду иллюстрацию из даташита?
Хорошо, будем называть этот документ так

Цитата(Белка12 @ Jun 28 2011, 20:30) *
2. Собственно, а какая разница, предавать по одному байту или группой?
На мой взгляд, важно только чтобы был обеспечен низкий уровень CS на время передачи. ИМХО, конечно....А зачем здесь после передачи данных устанавливать D/C низкий?
Отсылаю Вас всё к тому же рисунку и тексту перед ним.

Цитата(Белка12 @ Jun 28 2011, 20:30) *
Я так понимаю, что после инициализации дисплея без всякой очистки и вывода данных, только после вывода одних команд инициализации, на экране должен появиться мусор, а не появляется.
Мусор никому ничего не должен
=AK=
Цитата(Белка12 @ Jun 28 2011, 22:18) *
в даташите дисплея именно у интерфейса SPI высокое состояние, а низкое или высокое устанавливается битом CPOL =0/1.

Тады ладно. А то ведь полярность клока CPOL и фаза клока CPHA дают четыре возможных варианта, а какой из них используется в каждом конкретном случае надо смотреть в доке. Я по умолчанию ожидаю Mode 0 (CPOL=0, CPHA=0), но в вашем случае оказалось, что используется Mode 3 (CPOL=1, CPHA=1)



И вааще, Википедия рулит sm.gif
Белка12
Цитата(Палыч @ Jun 29 2011, 00:49) *
Мусор никому ничего не должен


Эт точно.

Дисплей оказался дохлым. crying.gif

Цитата(=AK= @ Jun 29 2011, 02:20) *
Тады ладно. А то ведь полярность клока CPOL и фаза клока CPHA дают четыре возможных варианта, а какой из них используется в каждом конкретном случае надо смотреть в доке. Я по умолчанию ожидаю Mode 0 (CPOL=0, CPHA=0), но в вашем случае оказалось, что используется Mode 3 (CPOL=1, CPHA=1)



И вааще, Википедия рулит sm.gif


Да, да и этот рисунок мне знаком. rolleyes.gif
demiurg_spb
Цитата(Белка12 @ Jun 29 2011, 20:08) *
Дисплей оказался дохлым. crying.gif
Может и нет.
У таких дисплеев, насколько я помню, можно перемычками или резисторами выбрать тип интерфейса
из двух или трёх возможных вариантов (8080 6800 SPI). Может у Вас SPI не активен, а Вы мучаетесь.
Белка12
Цитата(demiurg_spb @ Jun 29 2011, 22:31) *
Может и нет.
У таких дисплеев, насколько я помню, можно перемычками или резисторами выбрать тип интерфейса
из двух или трёх возможных вариантов (8080 6800 SPI). Может у Вас SPI не активен, а Вы мучаетесь.


Возможно вы правы, вот только в даташите об этом я ничего не нашла....
Палыч
Цитата(Белка12 @ Jun 30 2011, 20:08) *
в даташите об этом я ничего не нашла....

Раздел 6. См. pin BS0, BS1, BS2
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.