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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как передать 7 бит по SPI ?
uzzzer
сообщение Jul 9 2015, 07:15
Сообщение #1


Частый гость
**

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



Добрый день!
Как передать по SPI семь бит данных в семибитный сдвиговый регистр?
Есть четыре регистра соедененных каскадом,получается 7+7+7+7 битовый регистр. Но когда передаешь семибитовые числа, то данные сдвигаются, так как присутствует в передачи "0" от SPDR, как сложить данные, что бы передача была корректной.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Jul 9 2015, 07:22
Сообщение #2


отэц
*****

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



..самодельным SPI в софтовой реализации.


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
uzzzer
сообщение Jul 9 2015, 07:24
Сообщение #3


Частый гость
**

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



Цитата(Lmx2315 @ Jul 9 2015, 10:22) *
..самодельным SPI в софтовой реализации.


Вот только как реализовать его? Есть примерчик рабочий?
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Jul 9 2015, 07:32
Сообщение #4


отэц
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 9 2015, 07:40
Сообщение #5


Знающий
****

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



Я правильно понял "четыре регистра соедененных каскадом,получается 7+7+7+7 битовый регистр."?
Если правильно, то "разложить" 28 бит в 4 байта и заслать четырьмя посылками. К примеру, MSB-first: четыре старших бита нули, а остальные 28 нужные биты подряд.


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
uzzzer
сообщение Jul 9 2015, 07:55
Сообщение #6


Частый гость
**

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



Цитата(Obam @ Jul 9 2015, 10:40) *
Я правильно понял "четыре регистра соедененных каскадом,получается 7+7+7+7 битовый регистр."?
Если правильно, то "разложить" 28 бит в 4 байта и заслать четырьмя посылками. К примеру, MSB-first: четыре старших бита нули, а остальные 28 нужные биты подряд.


Вы все правильно понялиsm.gif Вот в этом у меня и вопрос, как это сделать правильно?

Я уже поднимал подобный вопрос в теме:
http://electronix.ru/forum/index.php?showtopic=127773
С регистром 595 проблем нет, все шлется, индикаторы подсвечиваются и т.д. А вот с семибитными регистрами проблема.
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 9 2015, 08:03
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 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);
Вот как-то так sm.gif

Сообщение отредактировал Obam - Jul 9 2015, 08:03


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Jul 9 2015, 08:08
Сообщение #8


отэц
*****

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 9 2015, 08:57
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Lmx2315 @ Jul 9 2015, 11:08) *
x = (a)+(b<<7)+(c<<14)+(d<<21)
Только добавить приведение c и d к 32 битам перед сдвигом. AVR имеет 16-битный int.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
uzzzer
сообщение Jul 9 2015, 09:30
Сообщение #10


Частый гость
**

Группа: Свой
Сообщений: 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 разрядов ?
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 9 2015, 09:38
Сообщение #11


Знающий
****

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



uzzzer, см. http://electronix.ru/forum/index.php?showt...t&p=1350506
всё до тла разжёвано

Сообщение отредактировал Obam - Jul 9 2015, 09:39


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
uzzzer
сообщение Jul 9 2015, 09:40
Сообщение #12


Частый гость
**

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



Цитата(Obam @ Jul 9 2015, 12:38) *


???

Ссылка на эту темуsm.gif

Сообщение отредактировал uzzzer - Jul 9 2015, 09:41
Go to the top of the page
 
+Quote Post
Obam
сообщение Jul 9 2015, 09:44
Сообщение #13


Знающий
****

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



Разве не на 7-е сообщение?


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
Lmx2315
сообщение Jul 9 2015, 09:45
Сообщение #14


отэц
*****

Группа: Свой
Сообщений: 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 бит sm.gif .
Отправляете в SPI (x) .


--------------------
b4edbc0f854dda469460aa1aa a5ba2bd36cbe9d4bc8f92179f 8f3fec5d9da7f0
SHA-256
Go to the top of the page
 
+Quote Post
Lerk
сообщение Jul 9 2015, 10:08
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 339
Регистрация: 5-05-11
Пользователь №: 64 797



Вот картинка о том, что вам пытаются донести:
Прикрепленное изображение

Цветом выделены "железные" байты в SPI контроллере, жирной границей - фактические байты данных(8 бит на байт в верхней строке и 7 бит на байт в нижней). Такая посылка(нижняя) будет успешно записана в 28 разрядный сдвиговый регистр, т.к. ведущие 4 бита просто пропадут, а оставшиеся и есть значащие разряды посылки.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 7th July 2025 - 18:55
Рейтинг@Mail.ru


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