S3c2440(ARM9) spi_read_write Флэш-память

Я работаю над связью SPI. Пытаюсь связаться с SST25VF032B(микросхема SPI Flash 32 МБ). Когда я читаю идентификатор производителя, он показывает MF_ID =>4A25BF, но изначально это MF_ID =>BF254A. Я получаю это просто в обратном порядке, означает первый укус в 3-м и 3-м байте в первую очередь.

Что может быть причиной этого? Моя функция инициализации SPI здесь:

//Enable clock control register CLKCON 18 Bit enables SPI  
CLKCON |= (0x01 << 18);//0x40000;  
printk("s3c2440_clkcon=%08ld\n",CLKCON);
//Enable GPG2 Corresponding NSS port
GPGCON =0x1011;//010000 00 01 00 01
printk("s3c2440_GPGCON=%08ld\n",GPGCON);
SPNSS0_ENABLE(); 
//Enable GPE 11,12,13,Corresponding MISO0,MOSI0,SCK0 = 11 0x0000FC00
GPECON &= ~((3 << 22) | (3 << 24) | (3 << 26));  
GPECON |=  ((2 << 22) | (2 << 24) | (2 << 26));  
//GPEUP Set; all disable  
GPGUP &= ~(0x07 << 2);    
GPEUP |=  (0x07 << 11);
//SPI Register section
//SPI Prescaler register settings,  
//Baud Rate=PCLK/2/(Prescaler value+1)  
SPPRE0 = 0x18;       //freq = 1M 
printk("SPPRE0=%02X\n",SPPRE0);  

//polling,en-sck,master,low,format A,nomal = 0 | TAGD = 1  
SPCON0 = (0<<5)|(1<<4)|(1<<3)|(0<<2)|(0<<1)|(0<<0);  
printk("SPCON1=%02ld\n",SPCON0);  

//Multi-host error detection is enabled 
SPPIN0 = (0 << 2) | (1 << 1) | (0 << 0);  
printk("SPPIN1=%02X\n",SPPIN0);  

//Initialization procedure
SPTDAT0 = 0xff;

Моя функция spi_read_write выглядит следующим образом:

static char spi_read_write (unsigned char outb) 
{
   // Write and Read a byte on SPI interface.  

   int j = 0;  
   unsigned char inb;
   SPTDAT0 = outb;  
   while(!SPI_TXRX_READY) for(j = 0; j < 0xFF; j++);  
   SPTDAT0 = outb;
   //SPTDAT0 = 0xff;  
   while(!SPI_TXRX_READY) for(j = 0; j < 0xFF; j++);   
   inb = SPRDAT0; 
   return (inb);   
}

Моя функция вызова:

   MEM_1_CS(0);
   spi_read_write(0x9F);
   m1 = spi_read_write(0x00);
   m2 = spi_read_write(0x00);
   m3 = spi_read_write(0x00);
   MEM_1_CS(1); 
   printk("\n\rMF_ID =>%02X-%02X-%02X",m1,m2,m3); 

Пожалуйста, подскажите, что мне делать? Заранее спасибо!!

2 ответа

Там нет явных проблем с функцией SPI. Проблема с вашей функцией печати. Рука little endian процессор. он хранит байты в памяти в обратном порядке. Вам нужно распечатать его в обратном порядке, и все будет в порядке.

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

static char spi_read_write (unsigned char outb) 
{
   int j = 0;  
   unsigned char inb;   
   while(!SPI_TXRX_READY) for(j = 0; j < 0xFF; j++); 
   SPTDAT0 = outb;   
   while(!SPI_TXRX_READY) for(j = 0; j < 0xFF; j++);   
   inb = SPRDAT0;
   return (inb);       
}

ИЗМЕНЕНИЯ СДЕЛАНЫ:

Прежде всего мы должны проверить, является ли SPI_TXRX_READY затем заполните регистр значением SPTDAT0 = outb;,

Спасибо всем за вашу поддержку.

Другие вопросы по тегам