Quantcast
Channel: EngineerZone: Message List
Viewing all articles
Browse latest Browse all 24339

Re: Problem with interfacing SPI Flash in bf609

$
0
0

with reference to above mentioned issue, i have provided my spi and flash drivers, please check this and help me in solving this issue.

 

void flash_write()

{

  unsigned int memaddress = 0x00,address = 0x00;;

  unsigned char check[10] = {0x0B,0x0B,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB};

   spi_write(SPI_FLASH_CS, FLASH_WREN, 1,&dummy,0);

  do

  {

  spi_read(SPI_FLASH_CS, FLASH_RDSR, 1,&status,1);

  }while(status & 0x01);

  memaddress = (FLASH_PW << 24) | 0x11;

  spi_write(SPI_FLASH_CS, memaddress, 4,&check,10);

}

 

void flash_read()

{

  unsigned int memaddress = 0x00,address = 0x00;

  memaddress = (FLASH_READ << 24) | 0x10;

  spi_read(SPI_FLASH_CS, memaddress, 4,&chk_rd[0],10);

}

 

/*

* spi.c

*

*  Created on: Nov 14, 2013

*      Author: satheeshr

*/

 

#define SPI_BAUD 32

#define SPI_CTL      ENUM_SPI_CTL_SCKLO |  ENUM_SPI_CTL_SCKBEG |   ENUM_SPI_CTL_MASTER                                    |  ENUM_SPI_CTL_EN

 

#define SPI_SLVSEL_RESET  0x0000FE00

#define SPI_FLASH    ENUM_SPI_SLVSEL_SSEL1_EN

 

 

void spi_init()

{

  *pREG_SPI0_SLVSEL = SPI_SLVSEL_RESET | SPI_FLASH;

  *pREG_SPI0_CLK = SPI_BAUD;

  *pREG_SPI0_CTL = SPI_CTL;

  *pREG_SPI0_RXCTL = ENUM_SPI_RXCTL_RX_EN | ENUM_SPI_RXCTL_OVERWRITE;

  *pREG_SPI0_TXCTL = ENUM_SPI_TXCTL_TX_EN | ENUM_SPI_TXCTL_ZERO | ENUM_SPI_TXCTL_TTI_EN;

}

int spi_write(unsigned int device,unsigned int address,unsigned char addressLength,unsigned char *data,int count)

{

  unsigned int index = 0,mask = 0;

  unsigned char dummy;

  *pREG_SPI0_SLVSEL &= ~device;

  do

  {

       --addressLength;

       mask = addressLength * 8;

       *pREG_SPI0_TFIFO = ((address >> mask) & 0xFF);

       Delay(40);

       while(!(*pREG_SPI0_STAT & ENUM_SPI_STAT_TFIFO_EMPTY))

       dummy = *pREG_SPI0_RFIFO;

   }while(addressLength > 0);

  Delay(40);

    while(index < count)

   {

       *pREG_SPI0_TFIFO = data[index++];  // Transfer a byte

       while(!(*pREG_SPI0_STAT & ENUM_SPI_STAT_TFIFO_EMPTY))

         dummy = *pREG_SPI0_RFIFO;

       Delay(40);

   }

  *pREG_SPI0_SLVSEL |= device;

  return 0;

}

 

int spi_read(unsigned int device,unsigned int address,unsigned char addressLength,unsigned char *data,int count)

{

  unsigned char value,dummy;

  unsigned int index = 0,mask = 0;

*pREG_SPI0_SLVSEL &= ~device;

  do

  {

       --addressLength;

       mask = addressLength * 8;

       *pREG_SPI0_TFIFO = ((address >> mask) & 0xFF);

       Delay(40);

       while(!(*pREG_SPI0_STAT & ENUM_SPI_STAT_TFIFO_EMPTY));

       dummy = *pREG_SPI0_RFIFO;

   }while(addressLength > 0);

  while(!(*pREG_SPI0_STAT & ENUM_SPI_STAT_RFIFO_E))

  dummy = *pREG_SPI0_RFIFO;

  while(index < count)

  {

       *pREG_SPI0_TFIFO = 0x00;

       while(*pREG_SPI0_STAT & BITM_SPI_STAT_RFE);

       data[index++] = *pREG_SPI0_RFIFO;   // Read data byte

       Delay(40);

  }

  *pREG_SPI0_SLVSEL |= device;

  Delay(40);

  return 0;

}


Viewing all articles
Browse latest Browse all 24339

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>