Easyelectronics.ru

Электроника для всех
Текущее время: 19 июн 2018, 02:01

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



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

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

Зарегистрирован: 21 мар 2012, 14:33
Сообщения: 523
Тему обновил!
В устройстве есть плата на 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
Сообщения: 523
Вот выдрал из оригинала примерную процедуру чтения байта по 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 часов


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

Сейчас этот форум просматривают: Google [Bot]


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

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

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