0

我正在研究 SPI 通信。尝试通信 SST25VF032B(32 MB 微芯片 SPI 闪存)。当我阅读制造商 ID 时,它显示 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); 

请指导我该怎么做?提前致谢!!

4

2 回答 2

0

SPI 功能没有明显问题。问题在于您的打印功能。Arm是little endian处理器。它在内存中保持字节反转。您需要以相反的顺序打印它,您会没事的。

于 2015-05-09T07:00:35.783 回答
0

从过去几天开始,我一直在努力解决这个问题,最后我找到了解决方案。我只需要按 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然后用 value 填充寄存器SPTDAT0 = outb;

感谢大家的支持。

于 2015-05-09T09:11:04.203 回答