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

 
 
> LPC1768 + AT45DB с использованием SSP
TAutomatic
сообщение May 26 2012, 13:37
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798



Добрый день, коллеги.
Волею судьбы пришлось использовать ARM в разработке. Столкнулись с такой проблемой. Нужно связать LPC1768 и AT45DB321. Опыт работы с этой датафлеш есть предостаточный, но все на PIC. Так вот, в чем проблема. Если использовать модуль SPI, вопросов не возникает, рабочий код для PIC был портирован практически без изменений и работает. Все бы ничего, но скорость обмена не более 12МГц. Датафлеш позволяет обмениваться быстрее, что собственно и нужно. При использовании SSP возникают нюансы, а именно: включается буфер FIFO глубиной 8 слов. Пока он не заполнен до верху, получается, невозможно считать данные. Допустим, кто знаком с работой датафлеши, на запрос о статусе надо принять всего единственный байт. Невозможно его получить, пока 8 раз не запросишь. Это разве удобства? А если выполнить блочное чтение, значит, нужно читать на 8 байт больше, что бы считать на вершине буфера свой нужный последний? Или я чего-то не понимаю? Почему у модуля УАРТ можно указать глубину буфера Фифо, тут нельзя. Как дали, так и кушать? Может кто подскажет, как проще выкрутиться? Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
jcxz
сообщение May 26 2012, 14:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Не очень понятно в чём проблема? Работаю именно с этой AT45DB321 и с LPC1788 и ранее - с LPC2378 через SSP без проблем. Как с DMA, так и без. На SCLK==30МГц.
Статус - читается только один байт.
CODE
enum {CDF_STATUS = 0xD7}; //чтение регистра статуса

//Возвращает статус
static u32 WaitRDY(int hold = 0)
{
u32 i, j;
volatile HwRegsSSP *ssp = &concatAB(SSP, nSSP_dflash);
ssp->CR[0] = 15 | B6 | B7;
ssp->CR[1] = B1;
while (1) {
ssp->DR = CDF_STATUS << 8;
while (ssp->SR & B4);
if ((i = ssp->DR) & B7) break;
if (!hold) PostDF();
OSTimeDly(ms2tkt(2));
if (!hold) PendDF();
}
ssp->CR[1] = 0;
j = i & 0x3D;
if (j != 0x2C && j != 0x34) trap(TRAP_DFLASH);
return i;
}

void InitSSP(SspCtl *p, volatile HwRegsSSP *ssp, u32 cpsr)
{
ssp->IMSC = ssp->CR[1] = 0;
ssp->CPSR = cpsr;
ssp->DMACR = 0;
while (ssp->SR & B2) { u32 i = ssp->DR; }
p->mbox = MboxCreate();
SemPend(p->sem = SemCreate()); //блокируем до выполнения функции, конфигурирующей устройство
}
Go to the top of the page
 
+Quote Post
TAutomatic
сообщение May 26 2012, 15:57
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 11-12-11
Пользователь №: 68 798



Ну мне кажется, я достаточно подробно описал, в ЧЕМ проблема. Но все равно спасибо, за ответ. Впрочем, я не проверял работоспособность Вашего кода. Там есть кое-какие отсутствующие куски, что бы просто скопировать и попробовать у себя. Но на взгляд, у меня вызывает вопрос строчка кода
Код
if ((i = ssp->DR) & B7) break;

Мне все абсолютно ясно в ней, поскольку используем, как я уже сказал, AT45DB321 в проектах на PIC16, PIC18, PIC24 без всяких трудностей. Но у меня она не дает сразу нужного результата, пока я не выполню чтение 8 раз, тоесть пока самый первый байт не окажется на вершине буфера FIFO. Как у Вас так просто получается, надо разобраться. Кстати, при использовании DMA допускаю, что работает как раз все предсказуемо, поскольку модули DMA не используют буферы FIFO периферии, а читают сразу из входных регтсров.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- TAutomatic   LPC1768 + AT45DB с использованием SSP   May 26 2012, 13:37
- - aaarrr   Цитата(TAutomatic @ May 26 2012, 17:37) Д...   May 26 2012, 16:07
|- - TAutomatic   Цитата(aaarrr @ May 26 2012, 19:07) Это н...   May 26 2012, 16:20
|- - aaarrr   Цитата(TAutomatic @ May 26 2012, 20:20) ....   May 26 2012, 16:35
|- - TAutomatic   У коллеги, кстати, тоже не так работает, как хотел...   May 26 2012, 16:45
|- - jcxz   Цитата(TAutomatic @ May 26 2012, 22:45) У...   May 26 2012, 17:25
|- - TAutomatic   Цитата(jcxz @ May 26 2012, 20:25) Это как...   May 26 2012, 17:43
- - DmitryM   Цитата(TAutomatic @ May 26 2012, 17:37) Д...   May 27 2012, 06:22
|- - _Артём_   Цитата(DmitryM @ May 27 2012, 09:22) А ка...   May 27 2012, 06:26
||- - DmitryM   Цитата(_Артём_ @ May 27 2012, 10:26) Смыс...   May 27 2012, 06:34
|- - TAutomatic   Цитата(DmitryM @ May 27 2012, 09:22) А ка...   May 27 2012, 07:45
- - aaarrr   1. Нет ни малейшей необходимости заполнять FIFO по...   May 27 2012, 08:32
- - _Артём_   Цитата(aaarrr @ May 27 2012, 11:32) 1. Не...   May 27 2012, 08:47
- - TAutomatic   Цитата(_Артём_ @ May 27 2012, 11:47) Точн...   May 27 2012, 13:05
- - TAutomatic   Всем спасибо, кто откликнулся. Дело действительно ...   May 28 2012, 13:31


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

 


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


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