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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> SPI sam7 можно ли ввести паузу между CS ?
cebotor
сообщение Apr 16 2007, 13:44
Сообщение #1


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

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



есть SAM7A3 есть чип , которым нужно управлять по SPI.
для работы с этим чипом требуется часто и непериодично дергать чип селектом.

Вопрос:
Можно ли в SAM7 ввести задержку между пропаданием чип селекта и выставлением его заново?

По датащиту вроде ни один бит для этого не предназначен. Ничего не пойму - неужели атмеловцы вобще не рассчитывают на то что устройству может потребоваться перерыв между чип селектами ?

Или я чего то не понимаю?


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
ivstech
сообщение Apr 17 2007, 13:39
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



На AT91SAM7S можно задавать такую задержку

Сообщение отредактировал ivstech - Apr 17 2007, 13:39
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 17 2007, 16:13
Сообщение #3


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

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



В регистре SPI_MR есть поле DLYBCS - dalay between chip select.
Go to the top of the page
 
+Quote Post
cebotor
сообщение Apr 17 2007, 17:10
Сообщение #4


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

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(ivstech @ Apr 17 2007, 14:39) *
На AT91SAM7S можно задавать такую задержку

каким регистром если не секрет ?

Цитата(sergeeff @ Apr 17 2007, 17:13) *
В регистре SPI_MR есть поле DLYBCS - dalay between chip select.

в датащите написано :

•DLYBCS: Delay Between Chip Selects
This field defines the delay from NPCS inactive to the activation of another NPCS. The DLYBCS time guarantees non-overlapping
chip selects and solves bus contentions in case of peripherals having long data float times.
If DLYBCS is less than or equal to six, six MCK periods will be inserted by default.
Otherwise, the following equation determines the delay:

Delay Between Chip Selects= DLYBCS/MCK

не означает ли это что это пауза между чип селектом и длугим чип селектом (на другой ноге NPCS) ?

я попробовал выставить эту паузу :

AT91C_BASE_SPI0->SPI_MR = 0xff070019; // пауза - 0xff
а при записи я делую так

spi_to_send->SPI_CSR[3] = 0x01000801; // снимать чип селект после передачи
spi_to_send->SPI_TDR = data;
spi_to_send->SPI_CR|= AT91C_SPI_LASTXFER; // это и есть последняя посылка

и не смотря на биты CSAAT(снят ) и LASTXFER(выставлен) - при последовательной передаче нескольких байт чип селект между ними не пропадает ...

почему бы это ?


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 17 2007, 21:30
Сообщение #5


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

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



Если не дождаться окончания передачи данных по SPI, а сразу послать следующий байт, то CS не снимается.
Go to the top of the page
 
+Quote Post
cebotor
сообщение Apr 18 2007, 09:47
Сообщение #6


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

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(sergeeff @ Apr 17 2007, 22:30) *
Если не дождаться окончания передачи данных по SPI, а сразу послать следующий байт, то CS не снимается.

а как можно дождаться ? я дожидаюсь по биту TXEMPTY в статусе.
вот:

while((spi_to_send->SPI_SR & AT91C_SPI_TXEMPTY) == 0); // Wait for the transmission to complete
spi_to_send->SPI_CSR[3] = 0x01000801; //rise cs after last transfer
spi_to_send->SPI_TDR = data;
spi_to_send->SPI_CR|= AT91C_SPI_LASTXFER;

чип селект все равно не снимается sad.gif


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Apr 18 2007, 11:25
Сообщение #7


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

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



while(!(*AT91C_SPI_SR & AT91C_SPI_TDRE)); // wait for transmit data register is not empty
*AT91C_SPI_TDR = (WORD)(dwData & 0xFFFF);
while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF)); // wait for received data
Go to the top of the page
 
+Quote Post
cebotor
сообщение Apr 18 2007, 12:15
Сообщение #8


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

Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809



Цитата(sergeeff @ Apr 18 2007, 12:25) *
while(!(*AT91C_SPI_SR & AT91C_SPI_TDRE)); // wait for transmit data register is not empty
*AT91C_SPI_TDR = (WORD)(dwData & 0xFFFF);
while(!(*AT91C_SPI_SR & AT91C_SPI_RDRF)); // wait for received data

все - разобрался, дело было не в этом а в граблях ревизии атмела..
у меня были примеры от иара где в SPI_MR выставлялся бит делителя на 32 - fdiv.
SPI_MR = ...........9; // 9 - мастер моде и fdiv
так вот к моменту последнего датащита этот fdiv атмел изъял из описания.
Самое смешное , что если его выставить - частота действительно падает в 32 раза , но начинает глючить (пауза DLYBCS точно не отрабатывается, там наверное и еще чтото ).


--------------------
если еррата пуста - это не хорошо а плохо
Go to the top of the page
 
+Quote Post
yura-w
сообщение Jan 25 2008, 09:26
Сообщение #9


Местный
***

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



Цитата(cebotor @ Apr 18 2007, 15:15) *
пауза DLYBCS точно не отрабатывается, там наверное и еще чтото ).


подскажите, пожалуста, в чем причина:

на at91sam7x (на 50МГц) настроил DLYBCS = 0, длительность СS =1 мкс.
получаю время от входа в ф-ию передачи по spi до формрования CS ~ 1,2 мкс!!
(такое же время от снятия CS до выхода из ф-ии)

передаю так:
unsigned int SPI0_Send(unsigned int data, unsigned char pcs, unsigned char lastxfer)
{
lastxfer = (unsigned char)lastxfer & (unsigned char)0x1; // get lo 1 bit
// whait for tx register empty & create register content
while(!(SPI0->SPI_SR & AT91C_SPI_TDRE)){};
SPI0->SPI_TDR = (data & 0xffff) | lastxfer << 24 | pcs << 16 ;
// wait for rx register full
while(!(SPI0->SPI_SR & AT91C_SPI_RDRF)){};//do while nonzero
return(0xffff & SPI0->SPI_RDR);
}
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 25 2008, 12:48
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(yura-w @ Jan 25 2008, 16:26) *
подскажите, пожалуста, в чем причина:
Почитай вот здесь http://electronix.ru/forum/index.php?showtopic=35141&hl=

Я для себя уяснил одно - не парится с аппаратным дрыганием CS а делать выбор чипа программно


--------------------
Go to the top of the page
 
+Quote Post
yura-w
сообщение Jan 25 2008, 13:12
Сообщение #11


Местный
***

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



Цитата(prottoss @ Jan 25 2008, 15:48) *
Почитай вот здесь http://electronix.ru/forum/index.php?showtopic=35141&hl=
Я для себя уяснил одно - не парится с аппаратным дрыганием CS а делать выбор чипа программно

спасибо, буду разбираться,
в лоб попробовал программно дергать, выигрыш в скорости не увидел
Go to the top of the page
 
+Quote Post
xelax
сообщение Jan 25 2008, 13:25
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 370
Регистрация: 7-11-06
Пользователь №: 22 035



Цитата(yura-w @ Jan 25 2008, 16:12) *
спасибо, буду разбираться,
в лоб попробовал программно дергать, выигрыш в скорости не увидел


Не в скорости выигрышь, а в работоспособности. smile.gif
Если посмотреть errata на spi, то сами разработчики контроллера рекомендуют в некоторых случаях использовать CS в PIO режиме как Workarround проблемы.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 25 2008, 13:36
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Кстати, раз уж снова заговорили об SPI на SAM7. Вот счас появилась задачка подключить два устройства по SPI - одно DataFlash AT45DB161 - работает на 12 МГц, второе - SIPO регистры (в общих чертах) с максимальной тактовой частотой 10 кГц. Вот пока думаю, с какой стороны подъехать:-)

Я так понимаю, что надо при инициализации SPI модуля нужно загрузить требуемые делители частот в массив SPI_CSR[] а потом, перед выборкой чипа, переключать на нужный делитель через SPI Mode Register SPI_MR. Я правильно рассуждаю?


--------------------
Go to the top of the page
 
+Quote Post
yura-w
сообщение Jan 25 2008, 13:50
Сообщение #14


Местный
***

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



Цитата(prottoss @ Jan 25 2008, 16:36) *
а потом, перед выборкой чипа, переключать на нужный делитель через SPI Mode Register SPI_MR. Я правильно рассуждаю?

чип выбирается прямо в регистре передаваемых данных: SPI_TDR


Цитата(xelax @ Jan 25 2008, 16:25) *
-Не в скорости выигрышь
-Если посмотреть errata на spi

-а мне надо в скорости
-пока не нашел, продолжу на след неделе, может дадите ссылку?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Jan 25 2008, 14:17
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(yura-w @ Jan 25 2008, 20:50) *
чип выбирается прямо в регистре передаваемых данных: SPI_TDR
Нет, пока не обнулить соответсвующий линии CS бит в поле PCS регистра SPI_MR - толку нет. А вот если перед выборкой чипа загрузить поле PCS регистра SPI_MR нужным значением, а после передачи в это поле записать все единички. Таким образом на один интерфейс SPI имеем четыре разные частоты ну и девайсов, скока ноХ хватит smile.gif Уже проверил smile.gif


--------------------
Go to the top of the page
 
+Quote Post

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

 


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


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