Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM7 + AT45DB642 статус
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
MegaFPGA
Пытаюсь прочитать статус флэшки командами 0x57 и 0xD7:
По сути делаю вот что:
pSPI ->SPI_TDR= 0x57 ; // запись в регистр передачи SPI команды для флэшки
DataReceived=pSPI->SPI_RDR; // чтение принятых по SPI данных

DataReceived имеет то же значение что и код команды. Осциллом видно что на MISO действительно тот же самый код. Т.е. флешка возвращает мне то что я ей отправил. Пробовал ставить задержку вразные места проги. Все равно результат тот же.
хелп.
aaarrr
Вы должны отправить (и, соответственно, принять) минимум два байта, ответы с содержимым статусного регистра пойдут начиная со второго. Не может же флеш отвечать, еще не получив код команды.
MegaFPGA
а разве команда DataReceived=pSPI->SPI_RDR; не выдает байт для того чтоб выдвинуть байт из слейва ?
MegaFPGA
Пробовал делать как вы говорите. Тот же результат. Флешка вседа возвращает то же что ей отправил.
aaarrr
Цитата(MegaFPGA @ Jun 9 2010, 06:15) *
а разве команда DataReceived=pSPI->SPI_RDR; не выдает байт для того чтоб выдвинуть байт из слейва ?

Разумеется, нет. Чтение RDR не вызывает никаких эффектов, кроме сброса флага RDRF.

Цитата(MegaFPGA @ Jun 9 2010, 07:19) *
Пробовал делать как вы говорите. Тот же результат. Флешка вседа возвращает то же что ей отправил.

Окончания передачи подождать не забываете?
Код
unsigned int spi0_trans(unsigned int data)
{
    AT91C_BASE_SPI0->SPI_TDR = data;
    while(!(AT91C_BASE_SPI0->SPI_SR & AT91C_SPI_RDRF));
    return (AT91C_BASE_SPI0->SPI_RDR);
}
MegaFPGA
Нет не забываю. Отрезал дорожку MISO от флешки. Оказывается во время передачи и на MISO те же сигналы что и на MOSI. Прозвонка показывает 8КОм между этими ножками.
help.gif
aaarrr
Цитата(MegaFPGA @ Jun 9 2010, 12:24) *
Прозвонка показывает 8КОм между этими ножками.

Значит флеш просто и не отвечала. CS выставляется нормально? Интерфейс выбран правильно?

8кОм похоже на грязную плату. Промойте получше.
MegaFPGA
Оказалось одна из микросхем на плате коротила MOSI и MISO.

Сейчас другая проблема. Флешка на команды запроса статуса выдает однобокую пилу. На команды чтения выдает какие то очень мелкие сильно зашумленные расплывчатые прямоугольные импульсы. Контроллер их распознает как 0. Смотрел осциллом при подключенном к контроллеру MISO и висящем в воздухе. Результат одинаковый.

Пробовал менять флешку результат тот же.
Вот код работы с флешкой:
CODE


unsigned char waitflash()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
unsigned char flag =0;
unsigned char get=0;
pSPI ->SPI_TDR = 0xD7;
get = pSPI ->SPI_RDR;
flag = ((get)>>7)&1;
if(flag)
return 1;


}

void waitspisend()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
unsigned int flag =0;
while(!flag)
{flag=pSPI ->SPI_SR;
flag=flag&0x00000200;}


}
void SPISendByte(unsigned char SPIDataToSend)
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
pSPI ->SPI_TDR= ((unsigned int)(SPIDataToSend))&0x000000FF;
waitspisend();
}
unsigned int SPIReceiveByte()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
unsigned char DataReceived = 0;
DataReceived=pSPI->SPI_RDR;
waitspireceive();
return (DataReceived);
}

void waitspireceive()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
unsigned int flag =0;
while(!flag)
{flag=pSPI ->SPI_SR;
flag=flag&0x00000201;}
}
void muchenieflash()
{
AT91PS_SPI pSPI = AT91C_BASE_SPI;
AT91PS_PIO pPIO = AT91C_BASE_PIOA;
while(1){
unsigned char rec[1056];
unsigned int stats=0;
AT91F_PIO_CfgPeriph(
AT91C_BASE_PIOA, // PIO controller base address
((unsigned int) AT91C_PA13_MOSI ) |
((unsigned int) AT91C_PA31_NPCS1 ) |
((unsigned int) AT91C_PA14_SPCK ) |
//((unsigned int) AT91C_PA11_NPCS0 ) |
((unsigned int) AT91C_PA12_MISO ), // Peripheral A
//((unsigned int) AT91C_PA9_NPCS1 ) |
//((unsigned int) AT91C_PA22_NPCS3 ) |
//((unsigned int) AT91C_PA3_NPCS3 ) |
//((unsigned int) AT91C_PA5_NPCS3 ) |
//((unsigned int) AT91C_PA10_NPCS2 ) |
((unsigned int) AT91C_PA30_NPCS2 )); // Peripheral B
AT91F_SPI_CfgPMC ();
AT91F_SPI_SWReset (AT91C_BASE_SPI);
pSPI ->SPI_CR = 0x01;
//(Last Transfer=0)+(SPI Software Reset=0)+(SPI Disable=0)+(SPI Enable=1)
pSPI ->SPI_MR = 0x0F030011;
//(Delay Between Chip Selects=F)+(Local loopback path disabled)+(CS2)
+(Mode fault detection is disabled)+(chip selects are directly connected)+(fixed CS)+(master mode)
pSPI ->SPI_IER = 0x0;// все прерывания отключены
pSPI ->SPI_IDR = 0x3FF;// все прерывания отключены
pSPI ->SPI_IMR = 0x0;// все прерывания замаскированы
pSPI ->SPI_CSR[2] = 0x0F0F1F02;
// (max Consecutive Transfers delay)+(max delay)+(min baud rate)
+(8 bit)+(Chip Select Active After Transfer)+(NPCHA=0)+(CPOL=1)


AT91F_PIO_CfgOutput(AT91C_BASE_PIOA,(unsigned int)1<<23);
AT91F_PIO_Enable(AT91C_BASE_PIOA,(unsigned int)1<<23);
AT91F_PIO_ClearOutput(AT91C_BASE_PIOA,(unsigned int)1<<23);
AT91F_PIO_SetOutput(AT91C_BASE_PIOA,(unsigned int)1<<23);


SPISendByte(0x57);
SPISendByte(0xFF);
delaytest(0xFFF);
stats = SPIReceiveByte();
SPISendByte(0xD7);
SPISendByte(0xFF);
delaytest(0xFFF);
rec[0] = SPIReceiveByte();
stats=stats;


SPISendByte(0x84);// запись в буфер
SPISendByte(0);
SPISendByte(0);
SPISendByte(0);

unsigned short int p=0;
for(p=0;p<1056;p++)
{
SPISendByte(0xAA);
}

SPISendByte(0x54);// чтение из буфера
SPISendByte(0);
SPISendByte(0);
SPISendByte(0);

for(p=0;p<1056;p++)
{ SPISendByte(0xFF);
rec[p] = SPIReceiveByte();
}
p++;
}
}



Запускается функция muchenieflash(). Далее инициализация, передача разных команд. Код корявый но это только для теста.
aaarrr
Цитата(MegaFPGA @ Jun 11 2010, 09:53) *
Код корявый но это только для теста.

Код настолько корявый, что совершенно отбивает желание его изучать. SPISendByte и SPIReceiveByte сделаны просто неправильно, подумайте о поведении флага RDRF.
aaarrr
Да, и еще раз внимательно проверьте железо. Питание до AT45 доходит?
MegaFPGA
С флагом понятно. А как правильно организовать прием передачу ?
Питание доходит. Сигналы SPI доходят нормально. Флешка выдает мусор.
aaarrr
Цитата(MegaFPGA @ Jun 11 2010, 11:58) *
С флагом понятно. А как правильно организовать прием передачу ?

Один из вариантов я приводил выше. И настоятельно рекомендую не использовать аппаратный CS там, где в этом нет необходимости.
MegaFPGA
Пробовал CS дергать вручную. Все проверил. Железо в норме. Ох уж не знаю в чем дело. Наверное все-таки в неправильном испоьзовании SPI.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.