|
Как передать 7 бит по SPI ? |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 24)
|
Jul 9 2015, 07:24
|

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

|
Цитата(Lmx2315 @ Jul 9 2015, 10:22)  ..самодельным SPI в софтовой реализации. Вот только как реализовать его? Есть примерчик рабочий?
|
|
|
|
|
Jul 9 2015, 07:32
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Цитата(uzzzer @ Jul 9 2015, 11:24)  Вот только как реализовать его? Есть примерчик рабочий? рабочего примерчика для 7-ми бит нет, наверное это будет что то вроде такого: Цитата void spisend (char d) {
int i=0;
PORTA &= ~0b00000010; // CS = 0 delay(1); for (i=0;i<7;i++) { if ((d&0x01)==0x01) PORTA |= 0b00000100; else PORTA &= ~0b00000100; //данные MOSI delay(1); PORTA |= 0b00001000; // CLK delay(1); PORTA &= ~0b00001000; delay(1); d=d>>1; } PORTA |= 0b00000010; // CS = 1 }
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Jul 9 2015, 07:55
|

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

|
Цитата(Obam @ Jul 9 2015, 10:40)  Я правильно понял "четыре регистра соедененных каскадом,получается 7+7+7+7 битовый регистр."? Если правильно, то "разложить" 28 бит в 4 байта и заслать четырьмя посылками. К примеру, MSB-first: четыре старших бита нули, а остальные 28 нужные биты подряд. Вы все правильно поняли  Вот в этом у меня и вопрос, как это сделать правильно? Я уже поднимал подобный вопрос в теме: http://electronix.ru/forum/index.php?showtopic=127773С регистром 595 проблем нет, все шлется, индикаторы подсвечиваются и т.д. А вот с семибитными регистрами проблема.
|
|
|
|
|
Jul 9 2015, 08:03
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
d[0]=d[0] | (d[1] << 7); d[1]=(d[1] >> 2) | (d[2] << 6); d[2]=(d[2] >> 3) | (d[3] << 5); d[3]=(d[3] >> 4); Вот как-то так
Сообщение отредактировал Obam - Jul 9 2015, 08:03
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Jul 9 2015, 08:08
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Цитата(uzzzer @ Jul 9 2015, 11:55)  Я уже поднимал подобный вопрос в теме: http://electronix.ru/forum/index.php?showtopic=127773С регистром 595 проблем нет, все шлется, индикаторы подсвечиваются и т.д. А вот с семибитными регистрами проблема. ..компонуйте ваши биты в 32-битную переменную, через сдвиги. А потом её отправляйте в 4-ре регистра. a = 01111111 b = 01111110 c = 01111100 d = 01111000 x = (a)+(b<<7)+(c<<14)+(d<<21) spi(x) отправлять старшим битом вперёд.
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
Jul 9 2015, 09:30
|

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

|
Цитата(Lmx2315 @ Jul 9 2015, 11:08)  ..компонуйте ваши биты в 32-битную переменную, через сдвиги. А потом её отправляйте в 4-ре регистра. a = 01111111 b = 01111110 c = 01111100 d = 01111000
x = (a)+(b<<7)+(c<<14)+(d<<21)
spi(x)
отправлять старшим битом вперёд. Немного не понятна суть метода.. получается, что a,b,c,d - это переменные, которые загоняются по очереди в регистры, тогда почему число x = (a)+(b<<7)+(c<<14)+(d<<21) в итоге получаетя 39 разрядов ?
|
|
|
|
|
Jul 9 2015, 09:45
|

отэц
    
Группа: Свой
Сообщений: 1 729
Регистрация: 18-09-05
Из: Москва
Пользователь №: 8 684

|
Цитата(uzzzer @ Jul 9 2015, 13:30)  Немного не понятна суть метода.. получается, что a,b,c,d - это переменные, которые загоняются по очереди в регистры, тогда почему число x = (a)+(b<<7)+(c<<14)+(d<<21) в итоге получаетя 39 разрядов ? a,b,c,d - это ваши данные которые хотите разместить в 7-ми битных регистрах (т.е. это 32 битные переменные в микрокотроллере), заполняете младшие 7-мь бит этих переменных. Вы заносите в каждую переменную ваши данные а потом складываете переменные по формуле для х - тоже 32 битная переменная, потому в ней не может оказаться больше 32 бит  . Отправляете в SPI (x) .
--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0 SHA-256
|
|
|
|
|
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
|
|
|