Перейти к содержанию
    

Как передать 7 бит по SPI ?

 

Вот почему MSB не нарисовать слева? Арабы мы что ли? И в десятичной и 16-ричной записи правый разряд младший…

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот почему MSB не нарисовать слева? Арабы мы что ли? И в десятичной и 16-ричной записи правый разряд младший…

 

потому что осциллограф.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не флуда ради, но на рисунке регистры, а не осциллограф, тем более если MSB-first то и развертка слева :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не флуда ради, но на рисунке регистры, а не осциллограф, тем более если MSB-first то и развертка слева :)

 

На рисунке указано, что LSB(МЗР)-first таки.

 

А в целом, меня не парит. Вообще странно на таком форуме видеть возмущение наличию разных стандартов записи: они были придуманы еще до нас.

 

А что касается осциллографа, то намек был на то, что я последнее время работаю с ним много и мне удобнее записывать данные 1-к-1. Если вам удобнее в голове постоянно делать преобразования bin2hex, hex2bin, reverse - ваше право :-) Я же остаюсь при своём.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот с семибитными регистрами проблема.
А что за регистры?

 

 

Вообще странно на таком форуме видеть возмущение наличию разных стандартов записи: они были придуманы еще до нас.

Что за стандарты?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На асме.

Такт по фронту.

 

; LCD names pinouts

.equ LCD = PORTB ; Порт

.equ clk = PB0 ; вывод тактов

.equ dat = PB1 ; вывод данных

 

 

send_7bits:               ;
push   loop            ; Save loop in STACK
ldi    loop,7          ; bit counter 
andi   tmp,0x7F        ; Чистим 7й ненужный бит
out_c:                 ; 
clc                    ; clearing carry flag 
ror    tmp             ; tmp =>> 1  ( LSB first )
brcc   d_zer           ; Branch if Carry flag eual zero!
sbi    lcd,dat         ; DATA -> 1
rjmp   d_one           ; 
d_zer:                 ; 
cbi    lcd,dat         ; DATA -> 0
d_one:                 ;  
sbi    lcd,clk         ; CLK  -> 1 
cbi    lcd,clk         ; CLK  -> 0 
dec    loop            ; bitcounter = -1
brne   out_c           ;  
pop    loop            ; Restore loop from STACK
ret                    ; reеurn 

 

Насколько я знаю, то регистр без CS (74HC164) запоминает последние такты.

К примеру их туда можно плюнуть и 1000, отобразятся только последние.

Если нужна скорость по аппаратному SPI, то выше уже показали как это сделать, собрать в слово свои 28 бит, Биты ([31...28] для MSB first), ([3...0] LSB first) очистить, и слать по очереди 4 байта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Биты ([31...28] для MSB first), ([3...0] LSB first) очистить, и слать

Зачем их очищать?

 

На асме.

Я бы так сделал:

send_7bits: push   loop
            ldi    loop,7        ; bit counter 
out_c:      cbi    lcd,dat    ; DATA -> 0
            sbrc   tmp,0
            sbi    lcd,dat    ; DATA -> 1
            ror    tmp        ; tmp =>>
            sbi    lcd,clk    ; CLK  -> 1 
            dec    loop          ; bitcounter = -1
            cbi    lcd,clk    ; CLK  -> 0 
            brne   out_c         ;  
            pop    loop          ; Restore loop from STACK
            ret                  ; return

 

Сохранение/восстановление SREG добавить при необходимости.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что за регистры?

 

Регистры в матричном индикаторе HDSP2001,даташит во вложениях.

 

 

Если нужна скорость по аппаратному SPI, то выше уже показали как это сделать, собрать в слово свои 28 бит, Биты ([31...28] для MSB first), ([3...0] LSB first) очистить, и слать по очереди 4 байта.

 

Сейчас буду пробывать сделать и так и так. Только меня смущает вот что: Какое максимальное число можно передать таким способом? Допустим я склею 28(32) бита, потом резать по 4? Правильно? А вот склееное число, если оно будет не 32 бита, а например 255 бит или больше?К стати как лучше разобрать склееное число по 8 бит?

HDSP_201X_datasheet.pdf

Изменено пользователем uzzzer

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не стоит. Попробуйте пробовать.

Попробовал. Все получилось. На данном этапе вполне устраивает. Реализовал програмный SPI.

 

void data_send(int qi, int *data, int n)
{ 
    int c;
for (int i=0;i<=n-1;i++)
{
    c=data[(qi-1)+5*i];
    for (int j=0;j<7;j++)
    {
        if ((c&0x40)==0x00) PORTA&=~_BV(DATA);
        else PORTA|=_BV(DATA);
        asm("nop");
        PORTA&=~_BV(SCL);
        asm("nop");
        PORTA|=_BV(SCL);
        asm("nop");
        c=(c<<1);
    }
    asm("nop");
    asm("nop");
}
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...