Оказалось одна из микросхем на плате коротила 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