Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SAM9260 и SPI
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Zelepuk
Есть нужда связать АЦП и AT91SAM9260.

АЦП имеет 8 каналов причём 4 из них передаёт по одной ноге по SPI, а 4 других по другой ноге по SPI.
При этом для всего этого хозяйства используется один CLK и один CS.

Итого имеем 2 последовательных канала данных SPI + CLK и CS.

На ARM9 планирую использовать SPI0 и SPI1.

Как сделать программно работу по двум MISO, одному CLK и CS?

Можно ли прсото указать в инициализации одинаковые параметры для обоих SPI и при этом не использовать CLK и СS одного из каналов, завязав АЦП на CLK и CS только одного из SPI на ARM9?
aaarrr
Цитата(Zelepuk @ Feb 20 2011, 18:52) *
Можно ли прсото указать в инициализации одинаковые параметры для обоих SPI и при этом не использовать CLK и СS одного из каналов, завязав АЦП на CLK и CS только одного из SPI на ARM9?

Нет, так нельзя.

Можно сконфигурировать один SPI как master, а второй как slave. Или добавить немного внешней логики, и обойтись одним на удвоенной частоте.
Zelepuk
Если один как master, а второй как slave будет, то что мне это даст? можно по-подробнее?
scorp2011
Цитата(Zelepuk @ Feb 20 2011, 19:47) *
Если один как master, а второй как slave будет, то что мне это даст? можно по-подробнее?

Мастер генерирует CLK(ну CS не проблема) и принимает сразу данные с одного канала. Slave будет подключен на прием со второго канала. CLK для slave берется от мастера а выход просто в воздухе.
DpInRock
Вы бы указали что за АЦП.
Zelepuk
АЦП AD7606. Только никак даташит не могу перевести нормально, вроде можно там по одной линии данные передовать, но какие для этого условия надо соблюсти - непонятно.
Dron_Gus
Можно. Просто даете 128 клоков, а не 64.
Zelepuk
Простите за наглость, но правильно ли японял что для этого АЦП частота подаваемая на CONVSTA/B определяет частоту дискретизации?
или же просто положительный фронт задаёт старт преобразования и далее АЦП сам тактирует выборку?

До того как связался с этим Д/Ш думал что знаю английский((
DpInRock
Цитата
Conversion Start Input A, Conversion Start Input B. Logic inputs. These logic inputs are used to initiate conversions on the analog input channels.
For simultaneous sampling of all input channels, CONVST A and CONVST B can be shorted together, and a single convert start signal can be applied.
Alternatively, CONVST A can be used to initiate simultaneous sampling: V1, V2, V3, and V4 for the AD7606; V1, V2, and V3 for the AD7606-6; and V1 and V2 for the AD7606-4. CONVST B can be used to initiate simultaneous sampling on the other analog inputs: V5, V6, V7, and V8 for the AD7606; V4, V5, and V6 for the AD7606-6; and V3 and V4 for the AD7606-4. This is possible only when oversampling is not switched on. When the CONVST A or CONVST B pin transitions from low to high, the front-end track-and-hold circuitry for the respective analog inputs is set to hold.


Перводчик Гугла.
Цитата
Преобразование Start Input, конверсии Start Input В. Логические входы.

Эти логические входы используются для установки на преобразование аналоговых входных каналов.
Для одновременного отбора проб всех входных каналов, CONVST и CONVST B могут касаться друг друга, и одного сигнала запуска преобразования могут быть применены.
Кроме того, CONVST могут быть использованы для одновременного начала выборки: V1, V2, V3 и V4 для AD7606, V1, V2, V3 для AD7606-6, V1 и V2 для AD7606-4. CONVST B могут быть использованы для одновременного начала выборки на других аналоговых входов: V5, V6, V7 и V8 для AD7606, V4, V5 и V6 для AD7606-6, V3 и V4 для AD7606-4. Это возможно только тогда, когда передискретизации не включен. Когда CONVST или CONVST переходов B контактный от низкого до высокого, передний конец трека и удерживать схемы для соответствующих аналоговых входов устанавливается провести.


Zelepuk
Значит по положительному фронту происходит тот самый HOLD в схеме track-and-hold. сталобыть на CONVSTA/B надо подавать сигнал с частотой 200 кГц, если я хочу осуществить выборку с такой частотой?
DpInRock
У вас там есть сигнал занятости, сигнал готовности. По ним надо ориентироваться. Ибо все равно по ним ориентироваться при считывании...
TigerSHARC
Необходимо осуществить передачу данных по SPI.
Данные принимаются с АЦП в последовательном виде (16-битные слова)
Как я смог понять из Д/Ш на контроллер то нужно разрешить прерывания от SPI по завершению приёма.
Так, когда передача завершилась, то входим в прерывание,в котором копируем значение из приёмного регистра SPI в переменную в программе.

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

Тогда выходит, что после окончания передачи(по CS) мы получим в приёмном регистре только последнее (из 8-ми слов) 16-битное слово.

Как осуществляется выборка по одному слову из регистра? Опишите пожалуйста механизм.
DpInRock
Очень просто.
Настраиваем порт на 16 битное слово.
Ждем готовности (хоть поллингом, хоть по прерыванию)
Ставим руками CS.
Запускаем чтение - читается первые 16 бит. Сохраняем их где-нибудь.
Запускаем чтение - ... вторые...
....
Убираем CS.

При желании можно запрограммировать прямой доступ, чтобы эта операция выполнялась автоматически. (Я бы не стал без особой нужды).
TigerSHARC
Цитата(DpInRock @ Feb 22 2011, 11:37) *
Очень просто.
Настраиваем порт на 16 битное слово.
Ждем готовности (хоть поллингом, хоть по прерыванию)
Ставим руками CS.
Запускаем чтение - читается первые 16 бит. Сохраняем их где-нибудь.
Запускаем чтение - ... вторые...
....
Убираем CS.

При желании можно запрограммировать прямой доступ, чтобы эта операция выполнялась автоматически. (Я бы не стал без особой нужды).


Спасибо! Очень познавательно.
Вот меня интересует по-подробнее начиная с "Запускаем чтение".Интересна логика процесса отлавливания этих битов.
Получается какой-то счётчик битов надо организовывать?
Или, наверное, нужно просто каждые 16 клоков SPI-порта скидывать содержимое регистра приёма в переменную?
DpInRock
Вы бы почитали бы про SPI как таковой.
У SPI программируется длина слова.
В вашем случае 16 бит (Ибо разрядность канала 16 бит).
SPI - система ты мне - я тебе. Чтобы что-то получить надо что-то дать. Даже если нечего дать и некуда дать - все равно надо дать.

Запуск чтения - это ЗАПИСЬ в регистр данных SPI любых данных. Например, 0.
SPI отправляет эти данные в наружу.
ОДНОВРЕМЕННО принимает данные снаружи.
По истечении 16 тактов - завершает работу. И говорит - готово, брателло. Типо, читай из регистра данных.
Ты - читаешь.

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

Теперь следующее чтение.
Опять пишем что-либо в регистр данных SPI....
TigerSHARC
В том то и дело, что АЦП шлёт данные в течении 128 клоков, сразу 8 слов по 16 бит.

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


Вот так выглядит операция чтения, только вместо 64 надо 128 клоков сделать, чтобы читать данные с одной ноги (вместо DoutA, DoutB)
DpInRock
Я ж говорю - ну ё прочитайте хоть что-нибудь про SPI. Что за за упертость.
АЦП выступает слэйвом и НИЧЕГО НИКОГДА САМА не шлет.
Клоки идут от вас.
TigerSHARC
Спасибо!

Если я всё верно понял, то управляя клоком мы просто приостанавливаем передачу данных (не трогая CS) и читаем данные из регистра данных SPI. Затем клочить .... и так по 16 клоков.
Тогда выходит, что считав таким образом все данные мы убираем CS и АЦП готовит новую выборку...
DpInRock
Если вы учили в школе немецкий - скажите.
А догадки строить - это кошмар.
Клоком управляете не вы. Вы его определяете. Чувствуете разницу?

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

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

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

Когда же возникают эти прерывания? после того как убрали CS со слейва (т.е. через 128 клоков когда передали данные). Или каждые 16 клоков?
DpInRock
Это не тупизм. Это дебилизм.
http://www.gaw.ru/html.cgi/txt/interface/spi/index.htm
Вы прочитайте свое сообщение.

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


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


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

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

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

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

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

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

Но. Вы говорили про настройку порта на 16 битные данные. Конкретно в SAM9260 про это не слово. Хотя в других микроуонтроллерах это настраивается (8 или 16 бит). Выходит SPI в SAM9260 всега оперирует с 16 битными данными. Пришло 16 бит - прерывание... ещё 16 бит - прерывание... и т.д.
DpInRock
Еще раз.
Даташиты надо читать до конца. И от начала. И не один раз (И даже не 10 раз. Минимум 50).

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


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

На стр.381 - это ясно, что как раз те биты по которым можно прерывание отслеживать
aaarrr
Внимательно и полностью прочитайте описание регистра SPI_CSR.
DpInRock
Чума.

Страница 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 после передачи всех восьми слов, а не после передачи одного. Но для этого надо прочитать ВСЁ).


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

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]

Заранее благодарен.
aaarrr
Цитата(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
TigerSHARC
рекомендуете писать с нуля всё?

Прошу прокоментировать как в 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...) и потом через них обращаться к членам структур...
может я чего то не понимаю и то что в исходниках в конечном итоге удобнее...
DpInRock
Код
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);
}
//
TigerSHARC
Спасибо. Полезно.
aaarrr
Цитата(TigerSHARC @ Feb 24 2011, 09:51) *
рекомендуете писать с нуля всё?

Да. Практической пользы в "библиотеках" ноль, а ляпов и несуразицы достаточно.

Цитата(TigerSHARC @ Feb 24 2011, 09:51) *
смотрю коды в IAR для AT91 - там всё через структуры и указатели.
...
получается что нужно объявить кучу указателей сначала(pSdSpi, pSpiHw...) и потом через них обращаться к членам структур...
может я чего то не понимаю и то что в исходниках в конечном итоге удобнее...

Объявлять указатели не обязательно:
Код
AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_SWRST;

А можно и так:
Код
*AT91C_SPI0_CR = AT91C_SPI_SWRST;

TigerSHARC
AT91C_BASE_SPI0->SPI_CR = AT91C_SPI_SWRST;

и что делает эта строка? вижу что SPI_CR - это регистр.... AT91C_SPI_SWRST - бит програмного сброса SPI. Но что мы с ним делаем? здесь просто равно? что это значит?
Просто сброс SPI?
aaarrr
Цитата(TigerSHARC @ Feb 24 2011, 15:04) *
Но что мы с ним делаем? здесь просто равно? что это значит?

Записываем в регистр.

Цитата(TigerSHARC @ Feb 24 2011, 15:04) *
Просто сброс SPI?

Именно.

Вы бы взяли какую-нибудь книжку по "C". Тех же K&R, например.
TigerSHARC
есть у меня книжки .... разбираюсь вот.... спасибо всем.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.