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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> SAM9260 и SPI, хитрая передача данных
TigerSHARC
сообщение Feb 22 2011, 11:44
Сообщение #16


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



В том то и дело, что АЦП шлёт данные в течении 128 клоков, сразу 8 слов по 16 бит.

По временным диаграммам видно, что когда приходит CS (из "+" в "-") то АЦП шлёт 8 слов по 16 бит паралельно по одной линии в течении 128 клоков SCLK.
Затем, CS идёт из "-" в "+". Вот и вся передача одного преобразования. Вот я и думаю как мне вытаскивать эти данные по 16 бит.
Механизм какой-то нужен(


Вот так выглядит операция чтения, только вместо 64 надо 128 клоков сделать, чтобы читать данные с одной ноги (вместо DoutA, DoutB)
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Feb 22 2011, 11:49
Сообщение #17


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Я ж говорю - ну ё прочитайте хоть что-нибудь про SPI. Что за за упертость.
АЦП выступает слэйвом и НИЧЕГО НИКОГДА САМА не шлет.
Клоки идут от вас.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 22 2011, 12:14
Сообщение #18


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Спасибо!

Если я всё верно понял, то управляя клоком мы просто приостанавливаем передачу данных (не трогая CS) и читаем данные из регистра данных SPI. Затем клочить .... и так по 16 клоков.
Тогда выходит, что считав таким образом все данные мы убираем CS и АЦП готовит новую выборку...

Сообщение отредактировал TigerSHARC - Feb 22 2011, 12:14
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Feb 22 2011, 14:38
Сообщение #19


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Если вы учили в школе немецкий - скажите.
А догадки строить - это кошмар.
Клоком управляете не вы. Вы его определяете. Чувствуете разницу?

И еще до кучи. Обычно SPI предлагает собственный сигнал выборки (работающий автоматически).
За редкими исключениями эта возможность никогда не используется. Предопределенный вывод для CS обычно устанавливается в режим обычного IO.



--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 22 2011, 15:41
Сообщение #20


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Уж простите за лишний тупизм....

Но, если настроено, что прерывания от SPI возникают после передачи данных. Тогда, в прерывании мы читаем то что в приёном регитре SPI микроконтроллера.

Когда же возникают эти прерывания? после того как убрали CS со слейва (т.е. через 128 клоков когда передали данные). Или каждые 16 клоков?
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Feb 22 2011, 21:41
Сообщение #21


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Это не тупизм. Это дебилизм.
http://www.gaw.ru/html.cgi/txt/interface/spi/index.htm
Вы прочитайте свое сообщение.

1.
Цитата
Но, если настроено, что прерывания от SPI возникают после передачи данных


2.
Цитата
Когда же возникают эти прерывания?


Сравните пункт 1 и 2.

Сигнал CS (которым вы управляете) никакого отношения к SPI контроллеру вашего процессора не имеет.

Цитата
после того как убрали CS со слейва (т.е. через 128 клоков когда передали данные). Или каждые 16 клоков?

А вот эта фраза говорит о том, что ваши представления об SPI, основанные на интуиции и догадках можно отправлять в мусорную корзину.

Надо читать.
Избежать чтения даташитов невозможно.
---
В догонку.
Все, что нужно для работы с этим АЦП описано на этих страницах (не только мной). Причем, досконально. Поверьте.

Сообщение отредактировал DpInRock - Feb 22 2011, 21:43


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 23 2011, 10:06
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Эти противоречия в моих постах говорят о том, что я сомневаюсь в том что пишу, а даташиты не совсем понятны, хоть и перевод есть.

Но как стало ясно из доки на контроллер, у SPI есть флаг (особый бит в регистре) того что данные пришли.

Но. Вы говорили про настройку порта на 16 битные данные. Конкретно в SAM9260 про это не слово. Хотя в других микроуонтроллерах это настраивается (8 или 16 бит). Выходит SPI в SAM9260 всега оперирует с 16 битными данными. Пришло 16 бит - прерывание... ещё 16 бит - прерывание... и т.д.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Feb 23 2011, 11:02
Сообщение #23


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Еще раз.
Даташиты надо читать до конца. И от начала. И не один раз (И даже не 10 раз. Минимум 50).

Страница 381.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 23 2011, 12:51
Сообщение #24


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Цитата(DpInRock @ Feb 22 2011, 11:37) *
Настраиваем порт на 16 битное слово.


как это осуществляется? В даташите нету.

На стр.381 - это ясно, что как раз те биты по которым можно прерывание отслеживать

Сообщение отредактировал TigerSHARC - Feb 23 2011, 12:52
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 23 2011, 14:18
Сообщение #25


Гуру
******

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



Внимательно и полностью прочитайте описание регистра SPI_CSR.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Feb 23 2011, 14:21
Сообщение #26


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Чума.

Страница 357. Начало описания.
Цитата
• Master or slave serial peripheral bus interface
– 8- to 16-bit programmable data length per chip select
– Programmable phase and polarity per chip select
– Programmable transfer delays between consecutive transfers and between clock
and data per chip select
– Programmable delay between consecutive transfers


Из этого следует, что длина программируется на каждый "chip select" отдельно.
Длина 8..16 бит.
Дальше ищите сущность "chip select". Там развернется основная борьба.

Цитата
На стр.381 - это ясно, что как раз те биты по которым можно прерывание отслеживать

Вот только что именно ясно?
Цитата
The BITS field determines the number of data bits transferred.

Более однозначной фразы сыскать трудно - "Поле определяет количество передаваемых бит". Какое еще в ... прерывание?

Также обратите внимание на структуру регистра передачи SPI
Цитата
SPI Transmit Data Register


Поле PCS. В нем указывается по какому именно "профилю" будет работать SPI. для конкретной передачи.

Также обратите собственное внимание на то, что вы не будете использовать реальных пинов чипселекта SPI.
(Хотя можете. Поле LASTXFER поможет убрать CS после передачи всех восьми слов, а не после передачи одного. Но для этого надо прочитать ВСЁ).




--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 23 2011, 20:29
Сообщение #27


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



Ещё есть вопрос. Кому не лень - прошу ответить (раздел всё таки для начинающих)

1)Копаюсь в библиотеках атмеловских

//------------------------------------------------------------------------------
/// Disables a SPI peripheral.
/// \param spi Pointer to an AT91S_SPI instance.
//------------------------------------------------------------------------------
void SPI_Disable(AT91S_SPI *spi)
{
spi->SPI_CR = AT91C_SPI_SPIDIS;
}

Pointer to an AT91S_SPI instance. - что это?
Если перевести - то это "указатель на экземпляр на AT91S_SPI"
Можно на примере что это может быть?

2)и что может означать такая конструкция как
AT91C_BASE_AIC->AIC_SVR[source] = (unsigned int) handler;
непонятна операция "->" и квадратные скобки после имени регистра AIC_SVR[source]

Заранее благодарен.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Feb 23 2011, 20:47
Сообщение #28


Гуру
******

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



Цитата(TigerSHARC @ Feb 23 2011, 23:29) *
Если перевести - то это "указатель на экземпляр на AT91S_SPI"
Можно на примере что это может быть?

Это указатель на структуру AT91S_SPI, сама структура определена в хидере на процессор.

Цитата(TigerSHARC @ Feb 23 2011, 23:29) *
2)и что может означать такая конструкция как
AT91C_BASE_AIC->AIC_SVR[source] = (unsigned int) handler;
непонятна операция "->" и квадратные скобки после имени регистра AIC_SVR[source]

AT91C_BASE_AIC - указатель на структуру AT91S_AIC.
-> - оператор, позволяющий обратится к какому-либо члену структуры или union'а через указатель на структуру или union.
AIC_SVR - массив, заключенный в структуре AT91S_AIC
содержимое квадратных скобок - индекс в массива

Цитата(TigerSHARC @ Feb 23 2011, 23:29) *
Копаюсь в библиотеках атмеловских

Вредного содержимого там многовато. Особенно для начинающих sad.gif
Go to the top of the page
 
+Quote Post
TigerSHARC
сообщение Feb 24 2011, 06:51
Сообщение #29


Знающий
****

Группа: Свой
Сообщений: 688
Регистрация: 4-09-09
Пользователь №: 52 195



рекомендуете писать с нуля всё?

Прошу прокоментировать как в IAR для AT91SAM9260 установить биты а каком либо в регистре

например, смотрю код для LPC в KEIL

S1SPCR = (1<<SPIE)|(1<<MSTR)|(0<<CPOL)|(0<<CPHA); //всё понятно S1SPCR - регистр, SPIE - бит в регистре

смотрю коды в IAR для AT91 - там всё через структуры и указатели.

например вот:

// Initialize the SPI structure
pSdSpi->pSpiHw = pSpiHw;
pSdSpi->spiId = spiId;
pSdSpi->semaphore = 1;

// Enable the SPI clock
AT91C_BASE_PMC->PMC_PCER = (1 << pSdSpi->spiId);

// Execute a software reset of the SPI twice
pSpiHw->SPI_CR = AT91C_SPI_SWRST;
pSpiHw->SPI_CR = AT91C_SPI_SWRST;

получается что нужно объявить кучу указателей сначала(pSdSpi, pSpiHw...) и потом через них обращаться к членам структур...
может я чего то не понимаю и то что в исходниках в конечном итоге удобнее...

Сообщение отредактировал TigerSHARC - Feb 24 2011, 07:25
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Feb 24 2011, 07:43
Сообщение #30


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Код
void SPIConfig(void)
{


AT91C_BASE_SPI0->SPI_CR=0x82;//disable and reset
AT91C_BASE_SPI1->SPI_CR=0x82;//disable and reset

AT91C_BASE_SPI0->SPI_MR=0x0a0f0013;//master
AT91C_BASE_SPI1->SPI_MR=0x0a0f0013;//master

//SerialFlash 25 Mhz 8 bit
AT91C_BASE_SPI0->SPI_CSR[0]=0x00220F0A;
//SSM2602 14 MHz 16 bit
AT91C_BASE_SPI0->SPI_CSR[1]=0x00020782;
//ADC 7877 14 Mhz 16 bit
AT91C_BASE_SPI0->SPI_CSR[2]=0x00020782;;

AT91C_BASE_SPI0->SPI_CR=0x1000001;//enable SPI0


//AF44002 62252 4094 993 - 8 bit
AT91C_BASE_SPI1->SPI_CSR[0]=0x0000FF02;//3-9913  2 for 4002

AT91C_BASE_SPI1->SPI_CR=0x1000001;//enable SPI1


}
unsigned char Flash_Send(unsigned char u,unsigned int last)
{
//last=0x1000000
AT91C_BASE_SPI0->SPI_TDR=((unsigned int)u)|0x000E0000|last;
while ((AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
return(AT91C_BASE_SPI0->SPI_RDR&0xFF);
}

unsigned short A7490_Send(unsigned short u)
{
AT91C_BASE_SPI0->SPI_TDR=u|0x010B0000;
while ((AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
return(AT91C_BASE_SPI0->SPI_RDR&0xFFFF);
}
void SSM_Send(unsigned short u)
{
AT91C_BASE_SPI0->SPI_TDR=u|0x010D0000;
while ((AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_TXEMPTY) == 0);
}
//


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 28th August 2025 - 08:16
Рейтинг@Mail.ru


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