Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI на AT91sam7x
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
LoLo
Использую аппаратный 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, но как чего-то не пойму.

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


А как сделать такую вещь:
CS=0 байт CS=1 CS=0 байт байт байт CS=1
Это шлется подряд.
aaarrr
Управляйте CS через PIO.
LoLo
Цитата(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 управляю.
fantex
Лучше скажите с какой железкой идет обмен по SPI. Здесь люди умные, подскажут как лучше организовать обмен данными.
aaarrr
Цитата(LoLo @ Apr 29 2011, 16:09) *
Пробывал так. Почему-то зависает SPI.

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



Память FM25256B

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


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

Надо разобраться. Свое железо не должно быть черным ящиком.
Genadi Zawidowski
Цитата(aaarrr @ Apr 29 2011, 15:18) *
Не должен. Где зависает?

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

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

Пятивольтовая?
LoLo
Цитата(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 должен тоже работать.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.