Easyelectronics.ru

Электроника для всех
Текущее время: 28 июн 2017, 18:54

Часовой пояс: UTC + 5 часов



    • The World's Cheapest PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: LPC2468: запись SPI-флеш 25P64V6P, какие-то глюки с SSP0DR
СообщениеДобавлено: 20 дек 2014, 09:28 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 417
Тему обновил!
В устройстве есть плата на LPC2468 с SPI-флеш ST25P64V6P. Стал смотреть как в оригинальной программе идёт работа с этой флеш. Почему-то для нормальной работы нужно считать 8 байт по SPI, после чего чтение работает нормально. Иначе считываются 0xFF, либо какие-то ранее считанные байты. И то, сразу после включения этот метод в первый раз даёт неправильный результат считывания.

Так выглядит инициализация SPI:
Код:
SSP0CR0   =   0x01c7;
SSP0CR1   =   0x00;
SSP0CPSR   =   0x10;
SSP0IMSC   =   0x00;
SSP0CR1   =   0x02;

Чтобы избавиться от глюка с чтением сразу после включения, я добавил следующий код:
Код:
IOCLR1=0x00200000;
SSP0DR=0xFF;
while(SSP0SR&0x04) SSP0DR;
IOSET1=0x00200000;


Последний раз редактировалось tmtlib 24 дек 2014, 07:07, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Запись SPI-флеш 25P64V6P, пытаюсь понять чужую программу
СообщениеДобавлено: 20 дек 2014, 20:20 
Старожил

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 417
Вот выдрал из оригинала примерную процедуру чтения байта по SPI:
Код:
IOCLR1=0x00200000;

//посылаем в флеш команду на считывание из нулевого адреса
SSP0DR=0x03;
SSP0DR=0x00;
SSP0DR=0x00;
SSP0DR=0x00;
                              
while((SSP0SR&0x10)){};   
               
// (!!!) непонятно только во это: зачем считывается 8 раз?
TmpByte=SSP0DR;
TmpByte=SSP0DR;
TmpByte=SSP0DR;
TmpByte=SSP0DR;
TmpByte=SSP0DR;
TmpByte=SSP0DR;
TmpByte=SSP0DR;
TmpByte=SSP0DR;
                     
// пишем 0xff, чтобы принять один байт
         
SSP0DR=0xff;
                              
while(!(SSP0SR&0x04)){};
                     
// приняли байт         
TmpByte=SSP0DR;


Это код из оригинала. Я его немного облагородил, но ошибка воспроизводима. В первый вызов после включения глючит и считывает неправильный байт. Поэтому автор видимо и вызывает его перед основным чтением дополнительно один раз.

Попробовал немного доработать:
Код:
void spiReadFlash(unsigned char a1,
                   unsigned char a2,
              unsigned char a3,
                   unsigned char cnt)
{
int i;

IOCLR1=0x00200000;
                              
SSP0DR=0x03;
SSP0DR=a1;
SSP0DR=a2;
SSP0DR=a3;
                              
while(SSP0SR&0x10){};   
while(SSP0SR&0x04) SSP0DR;

for (i=0;i<cnt;i++)
{
SSP0DR=0xff;   
while(!(SSP0SR&0x04)){};
spidata[i]=SSP0DR;
}
                                 
IOSET1=0x00200000;
                              
}


Как видно, для корректной работы приходится вызывать while(SSP0SR&0x04) SSP0DR; причём этот цикл может пройти неодинаковое количество раз. Вроде бы по логике работы spi должно прийти 4 байта (послали 4, считали 4). Здесь:
Код:
SSP0DR=0x03;
SSP0DR=a1;
SSP0DR=a2;
SSP0DR=a3;

Т.е. после этого вызвать SSP0DR;SSP0DR;SSP0DR;SSP0DR (чтение без анализа результата). А затем послав SSP0DR=0xFF считать байт b=SSP0DR. Но тут какой-то глюк, никак не пойму зачем читать восемь байт, и почему сразу после включения приходят ещё какие-то байты, т.е. количество вызовов записи SSP0DR=... и чтения ...=SSP0DR не совпадает.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB