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

 
 
> AT91SAM7 + AT45DB642 статус
MegaFPGA
сообщение Jun 8 2010, 10:46
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



Пытаюсь прочитать статус флэшки командами 0x57 и 0xD7:
По сути делаю вот что:
pSPI ->SPI_TDR= 0x57 ; // запись в регистр передачи SPI команды для флэшки
DataReceived=pSPI->SPI_RDR; // чтение принятых по SPI данных

DataReceived имеет то же значение что и код команды. Осциллом видно что на MISO действительно тот же самый код. Т.е. флешка возвращает мне то что я ей отправил. Пробовал ставить задержку вразные места проги. Все равно результат тот же.
хелп.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MegaFPGA
сообщение Jun 11 2010, 05:53
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 75
Регистрация: 12-11-09
Из: Уфа
Пользователь №: 53 567



Оказалось одна из микросхем на плате коротила 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(). Далее инициализация, передача разных команд. Код корявый но это только для теста.

Сообщение отредактировал MegaFPGA - Jun 11 2010, 05:55
Go to the top of the page
 
+Quote Post



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

 


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


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