|
Как передать 7 бит по SPI ? |
|
|
|
Jul 9 2015, 10:27
|
Местный
  
Группа: Свой
Сообщений: 339
Регистрация: 5-05-11
Пользователь №: 64 797

|
Цитата(Obam @ Jul 9 2015, 13:19)  Вот почему MSB не нарисовать слева? Арабы мы что ли? И в десятичной и 16-ричной записи правый разряд младший… потому что осциллограф.
|
|
|
|
|
Jul 9 2015, 11:55
|
Местный
  
Группа: Свой
Сообщений: 339
Регистрация: 5-05-11
Пользователь №: 64 797

|
Цитата(Obam @ Jul 9 2015, 13:35)  Не флуда ради, но на рисунке регистры, а не осциллограф, тем более если MSB-first то и развертка слева  На рисунке указано, что LSB(МЗР)-first таки. А в целом, меня не парит. Вообще странно на таком форуме видеть возмущение наличию разных стандартов записи: они были придуманы еще до нас. А что касается осциллографа, то намек был на то, что я последнее время работаю с ним много и мне удобнее записывать данные 1-к-1. Если вам удобнее в голове постоянно делать преобразования bin2hex, hex2bin, reverse - ваше право :-) Я же остаюсь при своём.
|
|
|
|
|
Jul 9 2015, 17:12
|

Местный
  
Группа: Свой
Сообщений: 253
Регистрация: 28-12-07
Из: Украина г. Первомайск
Пользователь №: 33 716

|
На асме. Такт по фронту. ; LCD names pinouts .equ LCD = PORTB ; Порт .equ clk = PB0 ; вывод тактов .equ dat = PB1 ; вывод данных CODE 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 байта.
|
|
|
|
|
Jul 9 2015, 17:23
|

Гуру
     
Группа: Свой
Сообщений: 2 076
Регистрация: 10-09-08
Пользователь №: 40 106

|
Цитата(pavel-pervomaysk @ Jul 9 2015, 20:12)  Биты ([31...28] для MSB first), ([3...0] LSB first) очистить, и слать Зачем их очищать? Цитата(pavel-pervomaysk @ Jul 9 2015, 20:12)  На асме. Я бы так сделал: Код 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 добавить при необходимости.
|
|
|
|
|
Jul 10 2015, 02:55
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 7-10-10
Из: Москва
Пользователь №: 59 985

|
Цитата(zombi @ Jul 9 2015, 17:15)  А что за регистры? Регистры в матричном индикаторе HDSP2001,даташит во вложениях. Цитата(pavel-pervomaysk @ Jul 9 2015, 20:12)  Если нужна скорость по аппаратному SPI, то выше уже показали как это сделать, собрать в слово свои 28 бит, Биты ([31...28] для MSB first), ([3...0] LSB first) очистить, и слать по очереди 4 байта. Сейчас буду пробывать сделать и так и так. Только меня смущает вот что: Какое максимальное число можно передать таким способом? Допустим я склею 28(32) бита, потом резать по 4? Правильно? А вот склееное число, если оно будет не 32 бита, а например 255 бит или больше?К стати как лучше разобрать склееное число по 8 бит?
Сообщение отредактировал uzzzer - Jul 10 2015, 02:56
|
|
|
|
|
Jul 10 2015, 08:23
|

Частый гость
 
Группа: Свой
Сообщений: 78
Регистрация: 7-10-10
Из: Москва
Пользователь №: 59 985

|
Цитата(Сергей Борщ @ Jul 10 2015, 07:54)  Не стоит. Попробуйте пробовать. Попробовал. Все получилось. На данном этапе вполне устраивает. Реализовал програмный 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"); } }
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|