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

 
 
 
Reply to this topicStart new topic
> SPI на AT91sam7x
LoLo
сообщение Apr 29 2011, 08:40
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Использую аппаратный SPI.
Вот какая проблема:
Как сделать чтобы CS можно было устанавливать в 1 или в 0 в зависимости от количества байт, т.е.
Иногда нада послать всего 1 байт , а иногда 3 байта, чтобы СS между ними не менялся.

CS=0 байт СS=1
CS=0 байт байт байт СS=1

У меня получается такая картина:
CS=0 байт CS=1 CS=0 байт CS=1 CS=0 байт СS=1

Как-то это можно сделать используя биты CSAAT и LASTXFER, но как чего-то не пойму.

Go to the top of the page
 
+Quote Post
fantex
сообщение Apr 29 2011, 10:18
Сообщение #2


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480



LASTXFER=0, CSAAT=0, DLYBCT установить в соответствии с требуемой задержкой между передачами байт.
Если работа с SPI через PDC, то задержка не требуется. А если через прерывание, то скорее всего надо задавать значение задержки.
Go to the top of the page
 
+Quote Post
LoLo
сообщение Apr 29 2011, 10:59
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Цитата(fantex @ Apr 29 2011, 14:18) *
LASTXFER=0, CSAAT=0, DLYBCT установить в соответствии с требуемой задержкой между передачами байт.
Если работа с SPI через PDC, то задержка не требуется. А если через прерывание, то скорее всего надо задавать значение задержки.


А как сделать такую вещь:
CS=0 байт CS=1 CS=0 байт байт байт CS=1
Это шлется подряд.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 29 2011, 11:32
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Управляйте CS через PIO.
Go to the top of the page
 
+Quote Post
LoLo
сообщение Apr 29 2011, 12:09
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Цитата(aaarrr @ Apr 29 2011, 15:32) *
Управляйте CS через PIO.


Пробывал так. Почему-то зависает SPI.

Цитата(aaarrr @ Apr 29 2011, 15:32) *
Управляйте CS через PIO.


вот процедуры посылки и приема байта.
void SPI_Write(AT91S_SPI *spi, unsigned int npcs, unsigned short data)
{
while ((spi->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
spi->SPI_TDR = data | SPI_PCS(npcs);//| AT91C_SPI_LASTXFER;
while ((spi->SPI_SR & AT91C_SPI_TDRE) == 0);
}

unsigned short SPI_Read(AT91S_SPI *spi)
{
while ((spi->SPI_SR & AT91C_SPI_RDRF) == 0);
return spi->SPI_RDR & 0xFFFF;
}
Соответственно еще cs управляю.
Go to the top of the page
 
+Quote Post
fantex
сообщение Apr 29 2011, 12:11
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 54
Регистрация: 4-11-05
Пользователь №: 10 480



Лучше скажите с какой железкой идет обмен по SPI. Здесь люди умные, подскажут как лучше организовать обмен данными.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 29 2011, 12:18
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(LoLo @ Apr 29 2011, 16:09) *
Пробывал так. Почему-то зависает SPI.

Не должен. Где зависает?
Go to the top of the page
 
+Quote Post
LoLo
сообщение Apr 29 2011, 12:21
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Цитата(fantex @ Apr 29 2011, 16:11) *
Лучше скажите с какой железкой идет обмен по SPI. Здесь люди умные, подскажут как лучше организовать обмен данными.



Память FM25256B

Цитата(aaarrr @ Apr 29 2011, 16:18) *
Не должен. Где зависает?


Не могу сказать где. В симуляторе проходит. А в железе-виснет.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Apr 29 2011, 15:00
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(LoLo @ Apr 29 2011, 16:21) *
Не могу сказать где. В симуляторе проходит. А в железе-виснет.

Надо разобраться. Свое железо не должно быть черным ящиком.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Apr 29 2011, 18:36
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Цитата(aaarrr @ Apr 29 2011, 15:18) *
Не должен. Где зависает?

У коллеги, скорее всего, не выставлен бит MODFDIS - без него в ошибки сваливается при управлении чипселктами в рукопашную. А готовность, кажется, при этом не появляется.
Цитата(LoLo @ Apr 29 2011, 11:40) *
Использую аппаратный SPI.
Вот какая проблема:

Привели бы код инициализации - быстрее бы всё решилось.
Цитата(LoLo @ Apr 29 2011, 15:21) *
Память FM25256B

Пятивольтовая?

Сообщение отредактировал Genadi Zawidowski - Apr 29 2011, 18:40
Go to the top of the page
 
+Quote Post
LoLo
сообщение May 11 2011, 04:43
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 22-12-08
Пользователь №: 42 664



Цитата(Genadi Zawidowski @ Apr 29 2011, 22:36) *
У коллеги, скорее всего, не выставлен бит MODFDIS - без него в ошибки сваливается при управлении чипселктами в рукопашную. А готовность, кажется, при этом не появляется.

Привели бы код инициализации - быстрее бы всё решилось.

Пятивольтовая?


Вот собственно и вся инициализация :
PIO_Configure(pinsSPI0, PIO_LISTSIZE(pinsSPI0));
SPI_Configure(AT91C_BASE_SPI0,AT91C_ID_SPI0,AT91C_SPI_MSTR);
SPI_ConfigureNPCS(AT91C_BASE_SPI0,0,AT91C_SPI_SCBR);
SPI_Enable(AT91C_BASE_SPI0);
PIO_Configure(&CS, 1);
PIO_Configure(&HOLD, 1);
PIO_Set(&HOLD);

Микросхема пятивольтовая, но питаю от 3.3 В.
Программный SPI работает, поэтому думаю и аппаратный должен тоже работать.
TWI аппаратный с глюками но работает при питании переферрии от 3.3 В. Т.е. и SPI должен тоже работать.
Go to the top of the page
 
+Quote Post

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

 


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


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