Re: Tips eller Samköp? SPI-Flash SST25VF080B

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
gurgalof
EF Sponsor
Inlägg: 1311
Blev medlem: 18 februari 2004, 22:15:06
Ort: Göteborg
Kontakt:

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av gurgalof »

Jag upptäckte det med hastigheten för 2 minuter sedan också :D
Måste ha varit SBS (Skit Bakom Spakarna) innan...
Jag avkopplade lite bättre, och då gick det med lägre hastigheter.

Det men dina trasiga minnen, det känns ju knappast att de skulle vara döda från början, det kan mycket väl vara din lödkolv...
Eller Lucas :D eller så var det måndags ex...

Nu ska jag försöka skriva lite data till minnet, och se hur det fungerar.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av BEEP »

Lucas var bara framme nosade på ett av minnena när det satt på STK500 så troligtvis är det ett SBS fel.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av BEEP »

Jag har lyckats med att skriva till och läsa en byte från minnet och i kväll så ska jag försöka att skrämma liv i ATmegan,

Propeller:

Kod: Markera allt

CON
  '--- 80 MHz ---                                                       
  _clkmode = xtal1 + pll16x     ' PLL
  _xinfreq = 5_000_000          ' Crystal 5 MHz
                            
  SI  = 0                       ' FlashMem: Serial Data Input
  SCK = 1                       ' FlashMem: Serial Clock
  SO  = 2                       ' FlashMem: Serial Data Output
  CE  = 3                       ' FlashMem: Chip Enable                  
  PIN_MASK = (1<<SI) | (1<<SCK) | (1<<CE)   

PUB Main
  Init                          ' Set pin direction states and initialize SCK, CE 
  
  WREN                          ' Enable the Write Enable Latch
  WRSR($00)                     ' Disable all Block Write Protection

  WREN                          ' Enable the Write Enable Latch
  Sector_Erase($000000)         ' Sector Erases the Chip
  Wait_Busy                     ' Waits until device is no longer busy

  WREN                          ' Enable the Write Enable Latch
  Byte_Program($000000,$01)     ' Write byte to adress
 
  StatusLeds(Read($000000))     ' Read byte from adress
  
  repeat                        ' Keep the processor alive.         

PRI StatusLeds(status)
  dira |= $FF00                 ' Pin 15~8
  outa[15..8] := status                  
                                                                 
PUB Init                                                           
  dira := PIN_MASK              ' Set pin direction states      
  outa[SCK] := 0                ' Set clock to low initial state  
  CE_High                       ' Disable device, set CE high

PUB WREN
'' This procedure enables the Write Enable Latch.
'' It can also be used to Enables Write Status Register.
  CE_Low                        ' Enable device, clear CE low
  Send_Byte($06)                ' Send WREN command
  CE_High                       ' Disable device, set CE high
  
PUB WRDI
'' This procedure disables the Write Enable Latch.
  CE_Low                        ' Enable device 
  Send_Byte($04)                ' Send WRDI command 
  CE_High                       ' Disable device

PUB EWSR
'' This procedure Enables Write Status Register.
  CE_Low                        ' Enable device
  Send_Byte($50)                ' Enable writing to the status register
  CE_High                       ' Disable device  
  
PUB RDSR | byte_
'' This procedure read the status register and Returns the byte.         
  CE_Low                        ' Enable device, clear CE low
  Send_Byte($05)                ' Send RDSR command
  byte_ := Get_Byte             ' Receive byte  
  CE_High                       ' Disable device, set CE high
  result := byte_

PUB WRSR(byte_)
'' This procedure writes a byte to the Status Register.
'' Input:       byte
'' Returns:     Nothing
  CE_Low                        ' Enable device. 
  Send_Byte($01)                ' Select write to status register. 
  Send_Byte(byte_)              ' Data that will change the status of BPx 
                                ' or BPL (only bits 2,3,4,5,7 can be written). 
  CE_High                       ' Disable the device 

PUB WREN_Check | byte_
'' This procedure checks to see if WEL bit set before program/erase.
'' Input:       None
'' Returns:     Boolean
  byte_ := RDSR                 ' Read the status register  
  if byte_ & $02                ' Verify that WEL bit is set
    result := true     
  else                 
    result := false                                                            

PUB Wait_Busy
'' This procedure waits until device is no longer busy (can be used by  
'' Byte-Program, Sector-Erase, Block-Erase, Chip-Erase).
  repeat while ((RDSR & $03) == $03) ' waste time until not busy 
    RDSR
    
PUB Sector_Erase(Dst)                                     
'' This procedure Sector Erases the Chip.                              
'' Input:   Dst:    Destination Address 000000H - 0FFFFFH
'' Returns: Nothing
  CE_Low                                ' enable device 
  Send_Byte($20)                        ' send Sector Erase command 
  Send_Byte(((Dst & $FFFFFF) >> 16))    ' send 3 address bytes 
  Send_Byte(((Dst & $FFFF) >> 8))
  Send_Byte(Dst & $FF)
  CE_High                               ' disable device

PUB Byte_Program(Dst,byte_)                                              
'' This procedure programs one address of the device.                                   
'' Assumption:  Address being programmed is already erased and is NOT block protected.   
'' Input:       Dst:    Destination Address 000000H - 0FFFFFH                           
''              byte:   byte to be programmed                                            
'' Returns:     Nothing
  CE_Low                                ' Enable device 
  Send_Byte($02)                        ' Send Byte Program command
  Send_Byte(((Dst & $FFFFFF) >> 16))    ' Send 3 address bytes  
  Send_Byte(((Dst & $FFFF) >> 8))
  Send_Byte(Dst & $FF)  
  Send_Byte(byte_)                      ' Send byte to be programmed 
  CE_High                               ' Disable device

PUB Read(Dst): byte_                                               
'' This procedure reads one address of the device.
'' It will result the byte read in variable byte.                              
'' Input:       Dst:    Destination Address 000000H - 0FFFFFH                              
'' Returns:     byte     
  CE_Low                                ' enable device 
  Send_Byte($03)                        ' read command 
  Send_Byte(((Dst & $FFFFFF) >> 16))    ' send 3 address bytes 
  Send_Byte(((Dst & $FFFF) >> 8))
  Send_Byte(Dst & $FF)
  byte_ := Get_Byte
  CE_High                               ' disable device 
  result := byte_                       ' result one byte read 

PRI CE_High                                             
'' This procedure set CE = High.
  outa[CE] := 1                 ' set CE high  

PRI CE_Low
'' This procedure drives the CE of the device to low.
  outa[CE] := 0                 ' clear CE low 
 
PRI Send_Byte(out) | i
  repeat i from 0 to 7          ' for (i = 0 i < 8 i++)   
    if (out & $80) == $80       ' check if MSB is high
      outa[SI] := 1
    else
      outa[SI] := 0             ' if not, set to low           
    outa[SCK] := 1              ' toggle clock high   
    out := (out << 1)           ' shift 1 place for next bit   
    outa[SCK] := 0              ' toggle clock low
  
PRI Get_Byte | i,in,temp
  in := 0
  repeat i from 0 to 7          ' for (i = 0 i < 8 i++) 
    in := (in << 1)             ' shift 1 place to the left or shift in 0
    temp := ina[SO]    
    outa[SCK] := 1              ' toggle clock high                                             
    if temp == 1                ' check to see if bit is high
      in := in | $01            ' if high, make bit high      
    outa[SCK] := 0              ' toggle clock low               
  result := in

PRI Delay(ms)
  waitcnt(80_000*ms + cnt)

Senast redigerad av BEEP 18 mars 2010, 12:31:17, redigerad totalt 8 gånger.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av jesse »

Vad är det för programspråk? Basic? Vilken processor?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av sodjan »

Det står ovanför koden.
Och med tanke på processorn, sannolikt "Spin"...
Se också BEEP's 4'de inlägg i tråden.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av BEEP »

jesse: SPIN och Propeller
Eftersom det är ganska enkelt att porta över enklare C kod till SPIN så tror jag inte att det är så likt Basic men jag har bara skrivit lite Basic på hobbydatorerna som fanns på 80 talet så vad vet jag.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av BEEP »

"Jag har lyckats med att skriva till och läsa en byte från minnet och i kväll så ska jag försöka att skrämma liv i ATmegan,"

AVR - C kod

Kod: Markera allt

/*
  µC: ATMEL - ATmega88, ATmega644
  Serial Flash Memory: SST25VF080B         
*/

#include <avr/io.h>   

//--- ATmega88 ---
/*
#define DDR_SPI    DDRB
#define PORT_SPI   PORTB
//#define DD_HOLD   PORTBn
//#define DD_WP     PORTBn
#define DD_CE      PORTB2
#define DD_MOSI    PORTB3
//#define DD_MISO    PINBn
#define DD_SCK     PORTB5
*/

//--- ATmega644 ---
#define DDR_SPI    DDRB
#define PORT_SPI   PORTB
#define PIN_SPI    PINB 
//#define DD_HOLD   PORTBn
//#define DD_WP     PORTBn
#define DD_CE      PORTB4
#define DD_MOSI    PORTB5
#define DD_MISO    PINB6
#define DD_SCK     PORTB7

#define DUMMY_BYTE 0xFF

void SPI_MasterInit();
unsigned char SPI_MasterTransmit(unsigned char);
void Poll_SO();
void CE_High();
void CE_Low();
//void Hold_Low();
//void Unhold();
//void WP_Low();
//void UnWP();
unsigned char RDSR();
void EWSR();
void WRSR(unsigned char);
void WREN();
void WRDI();
void EBSY();
void DBSY();
unsigned char Read_ID(unsigned char);
unsigned long Jedec_ID_Read();
unsigned char Read(unsigned long Dst);
void Read_Cont(unsigned long Dst, unsigned long no_bytes);
unsigned char HighSpeed_Read(unsigned long Dst);
void HighSpeed_Read_Cont(unsigned long Dst, unsigned long no_bytes);
void Byte_Program(unsigned long Dst,unsigned char byte);
void Auto_Add_IncA(unsigned long Dst, unsigned char byte1, unsigned char byte2);
void Auto_Add_IncB(unsigned char byte1, unsigned char byte2);
void Auto_Add_IncA_EBSY(unsigned long Dst, unsigned char byte1, unsigned char byte2);
void Auto_Add_IncB_EBSY(unsigned char byte1, unsigned char byte2);
void Chip_Erase();
void Sector_Erase(unsigned long Dst);
void Block_Erase_32K(unsigned long Dst);
void Block_Erase_64K(unsigned long Dst);
void Wait_Busy();
void Wait_Busy_AAI();
void WREN_Check();
void WREN_AAI_Check();
void Verify(unsigned char byte, unsigned char cor_byte);

unsigned char dataArray[128];                   // Global array to store read data
                                               
void SPI_MasterInit()
{
  // Set MOSI, SCK and CE output, all others input
  DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_CE);

  // Enable SPI, Master, set clock rate fck/16
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

  PORT_SPI |= (1<<DD_CE);                       // Set CE high (device disabled)
  PORT_SPI &= ~(1<<DD_SCK);                     // Set clock to low initial state
}

unsigned char SPI_MasterTransmit(unsigned char data)
{   
  SPDR = data;                                  // Start transmission   
  while(!(SPSR & (1<<SPIF)));                   // Wait for transmission complete   
  return (SPDR);                                // Return the received byte
}

void Poll_SO()
{
  unsigned char temp = 0;
  CE_Low();  
  //>------------------ 2009-07-16 ---------------------------------------- ???
  //while (temp == 0x00)                        // Waste time until not busy
    //temp = DD_MISO;
  while ((PIN_SPI & 1<<DD_MISO) == 0);
  //------------------ 2009-07-16 ----------------------------------------> ???    
  CE_High();
}

void CE_High()
{
  PORT_SPI |= (1<<DD_CE);                       // Set CE high
}

void CE_Low()                                   
{
  PORT_SPI &= ~(1<<DD_CE);                      // Clear CE low
}

/*
void Hold_Low()
{
  Hold = 0;                                     // Clear Hold pin
}

void Unhold()
{
  Hold = 1;                                     // Set Hold pin
}

void WP_Low()
{
  WP = 0;                                       // Clear WP pin
}

void UnWP()
{
  WP = 1;                                       // Set WP pin
}
*/

unsigned char RDSR()
{
  char byte = 0;                       
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x05);                     // Send RDSR command
  byte = SPI_MasterTransmit(DUMMY_BYTE);        // Receive byte
  CE_High();                                    // Disable device
  return (byte);
}

void EWSR()
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x50);                     // Enable writing to the status register
  CE_High();                                    // Disable device
}

void WRSR(unsigned char byte)
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x01);                     // Select write to status register
  SPI_MasterTransmit(byte);                     // Data that will change the status of BPx
                                                // or BPL (only bits 2,3,4,5,7 can be written)
  CE_High();                                    // Disable the device
}

void WREN()
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x06);                     // Send WREN command
  CE_High();                                    // Disable device
}

void WRDI()
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x04);                     // Send WRDI command
  CE_High();                                    // Disable device
}

void EBSY()
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x70);                     // Send EBSY command
  CE_High();                                    // Disable device
}

void DBSY()
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x80);                     // Send DBSY command
  CE_High();                                    // Disable device
}

unsigned char Read_ID(unsigned char ID_addr)
{
  unsigned char byte;
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x90);                     // Send read ID command (90h or ABh)
  SPI_MasterTransmit(0x00);                     // Send address
  SPI_MasterTransmit(0x00);                     // Send address
  SPI_MasterTransmit(ID_addr);                  // Send address - either 00H or 01H
  byte = SPI_MasterTransmit(DUMMY_BYTE);        // Receive byte
  CE_High();                                    // Disable device
  return byte;
}

unsigned long Jedec_ID_Read()
{
  unsigned long t;
  t = 0;
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x9F);                     // Send JEDEC ID command (9Fh)
  t = (t | SPI_MasterTransmit(DUMMY_BYTE)) << 8;// Receive byte
  t = (t | SPI_MasterTransmit(DUMMY_BYTE)) << 8;
  t = (t | SPI_MasterTransmit(DUMMY_BYTE));     // temp value = 0xBF258E
  CE_High();                                    // Disable device
  return t;
}

unsigned char Read(unsigned long Dst)
{
  char byte = 0;
  CE_Low();                                     // Enable device   
  SPI_MasterTransmit(0x03);                     // Send Read command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));;
  SPI_MasterTransmit(Dst & 0xFF);
  byte = SPI_MasterTransmit(DUMMY_BYTE);        // Receive byte
  CE_High();                                    // Disable device
  return byte;                                  // Return one byte read
}

void Read_Cont(unsigned long Dst, unsigned long no_bytes)
{
  unsigned long i = 0;
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x03);                     // Send Read command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);
  for (i = 0; i < no_bytes; i++)                // Read until no_bytes is reached
  {
    dataArray[i]=SPI_MasterTransmit(DUMMY_BYTE);// Receive byte and store
  }
  CE_High();                                    // Disable device
}

unsigned char HighSpeed_Read(unsigned long Dst)
{
  unsigned char byte = 0;
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x0B);                     // Read command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);
  SPI_MasterTransmit(DUMMY_BYTE);               // Dummy byte
  byte = SPI_MasterTransmit(DUMMY_BYTE);
  CE_High();                                    // Disable device
  return byte;                                  // Return one byte read
}

void HighSpeed_Read_Cont(unsigned long Dst, unsigned long no_bytes)
{
  unsigned long i = 0;
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x0B);                     // Read command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);
  SPI_MasterTransmit(DUMMY_BYTE);               // Dummy byte
  for (i = 0; i < no_bytes; i++)                // Read until no_bytes is reached
  {
    dataArray[i]=SPI_MasterTransmit(DUMMY_BYTE);// Receive byte and store
  }
  CE_High();                                    // Disable device
}

void Byte_Program(unsigned long Dst, unsigned char byte)
{
  CE_Low();                                     // Enable device                       
  SPI_MasterTransmit(0x02);                     // Send Byte Program command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);                       
  SPI_MasterTransmit(byte);                     // Send byte to be programmed
  CE_High();                                    // Disable device
}

void Auto_Add_IncA(unsigned long Dst, unsigned char byte1, unsigned char byte2)
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0xAD);                     // Send AAI command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);
  SPI_MasterTransmit(byte1);                    // Send 1st byte to be programmed     
  SPI_MasterTransmit(byte2);                    // Send 2nd byte to be programmed
  CE_High();                                    // Disable device
}

void Auto_Add_IncB(unsigned char byte1, unsigned char byte2)
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0xAD);                     // Send AAI command
  SPI_MasterTransmit(byte1);                    // Send 1st byte to be programmed
  SPI_MasterTransmit(byte2);                    // Send 2nd byte to be programmed
  CE_High();                                    // Disable device
}

void Auto_Add_IncA_EBSY(unsigned long Dst, unsigned char byte1, unsigned char byte2)
{
  EBSY();                                       // Enable RY/BY# status for SO in AAI
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0xAD);                     // Send AAI command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);
  SPI_MasterTransmit(byte1);                    // Send 1st byte to be programmed     
  SPI_MasterTransmit(byte2);                    // Send 2nd byte to be programmed
  CE_High();                                    // Disable device       
  Poll_SO();                                    // Polls RY/BY# using SO line
}

void Auto_Add_IncB_EBSY(unsigned char byte1, unsigned char byte2)
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0xAD);                     // Send AAI command
  SPI_MasterTransmit(byte1);                    // Send 1st byte to be programmed
  SPI_MasterTransmit(byte2);                    // Send 2nd byte to be programmed
  CE_High();                                    // Disable device
  Poll_SO();                                    // Polls RY/BY# using SO line
  WRDI();                                       // Exit AAI before executing DBSY
  DBSY();                                       // Disable SO as RY/BY# output if in AAI
}

void Chip_Erase()
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x60);                     // Send Chip Erase command (60h or C7h)
  CE_High();                                    // Disable device
}

void Sector_Erase(unsigned long Dst)
{
  CE_Low();                                     // Enable device                   
  SPI_MasterTransmit(0x20);                     // Send Sector Erase command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);
  CE_High();                                    // Disable device
}

void Block_Erase_32K(unsigned long Dst)
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0x52);                     // Send 32 KByte Block Erase command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);
  CE_High();                                    // Disable device
}

void Block_Erase_64K(unsigned long Dst)
{
  CE_Low();                                     // Enable device
  SPI_MasterTransmit(0xD8);                     // Send 64KByte Block Erase command
  SPI_MasterTransmit(((Dst & 0xFFFFFF) >> 16)); // Send 3 address bytes
  SPI_MasterTransmit(((Dst & 0xFFFF) >> 8));
  SPI_MasterTransmit(Dst & 0xFF);
  CE_High();                                    // Disable device
}

void Wait_Busy()
{
  while ((RDSR() & 0x03) == 0x03)               // Waste time until not busy
  RDSR();
}

void Wait_Busy_AAI()
{
  while ((RDSR() & 0x43) == 0x43)               // Waste time until not busy
  RDSR();
}

void WREN_Check()
{
  char byte = 0;
  byte = RDSR();                                // Read the status register
  if (byte != 0x02)                             // Verify that WEL bit is set
  {
    while(1);
            // Add source code or statements for this file to compile
            // i.e. option: insert a display to view error on LED?
  }
}

void WREN_AAI_Check()
{
  unsigned char byte;
  byte = RDSR();                                // Read the status register
  if (byte != 0x42)                             // Verify that AAI and WEL bit is set
  {
    while(1);
            // Add source code or statements for this file to compile
            // i.e. option: insert a display to view error on LED?
  }
}

void Verify(unsigned char byte, unsigned char cor_byte)
{
  if (byte != cor_byte)
  {
    while(1);
            // Add source code or statement for this file to compile
            // i.e. option: insert a display to view error on LED?
  }
}

//- - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// D E M O 
//- - -  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void StatusLeds(unsigned char status)
{
  DDRD  = 0xFF;
  PORTD = ~status;                      // STK500 (output low = led on).
}

int main()
{
  SPI_MasterInit();                     // Initiate SPI Master

  WREN();                               // Enable the Write Enable Latch
  WRSR(0x00);                           // Disable all Block Write Protection

  WREN();                               // Enable the Write Enable Latch
  Sector_Erase(0x000000);               // Sector Erases the Chip
  Wait_Busy();                          // Waste time until not busy

  WREN();                               // Enable the Write Enable Latch
  Byte_Program(0x000000,0x04);          // Write byte to adress

  StatusLeds(Read(0x000000));           // Read byte from adress & show it on the status leds
}
Senast redigerad av BEEP 15 oktober 2012, 21:59:04, redigerad totalt 16 gånger.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av BEEP »

Jag har fått in allt från SST exempelkod till AVR - C koden (se ovan) och förhoppningsvis så har jag inte gjort några större dumheter :)

unsigned char idata upper_128[128];
idata är troligtvis något för en 8052 ?
Detta är ändrat till
unsigned char dataArray[128];

Här är en test av Auto Address Increment (AAI) Word-Program

Kod: Markera allt

#define F_CPU 8000000UL                 // CPU clock in Hertz
#include <util/delay.h>

void StatusLeds(unsigned char status)
{
  DDRD  = 0xFF;
  PORTD = ~status;                      // STK500 (output low = led on).
}

int main()
{
  unsigned long i = 0;

  SPI_MasterInit();                     // Initiate SPI Master

  WREN();                               // Enable the Write Enable Latch
  WRSR(0x00);                           // Disable all Block Write Protection

  WREN();                               // Enable the Write Enable Latch
  Sector_Erase(0x000000);               // Sector Erases the Chip
  Wait_Busy();                          // Waste time until not busy

  WREN();                               // Enable the Write Enable Latch
  Auto_Add_IncA(0x000000,0,1);
  for (i = 1; i < 128; i++)
  {
    Auto_Add_IncB(i*2,i*2+1);
  }
  WRDI();                               // Disable the Write Enable Latch

  for (i = 0; i < 256; i++)
  {
    StatusLeds(Read(i));
    _delay_ms(25);
  }
}
Edit:
Det saknas kontroll av BUSY status i koden, lägger in det senare när jag får tid.
Senast redigerad av BEEP 26 juni 2010, 08:45:57, redigerad totalt 2 gånger.
Användarvisningsbild
gurgalof
EF Sponsor
Inlägg: 1311
Blev medlem: 18 februari 2004, 22:15:06
Ort: Göteborg
Kontakt:

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av gurgalof »

Bra jobbat!
Jag har själv inte haft tid att leka, men din kod ser ut att göra jobbet perfekt!

Ska se om jag hinner testa din kod i ATMega88 imorgon.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av jesse »

BEEP: jag funderar på att börja titta på mina minnen så småningom.

undrar bara - du som gjort en fungerande kod för AVR - du använder tydligen det inbyggda SPI-interfacet. Är det så att man adresserar minnet på något vis så man kan koppla på andra sakar på samma trådar eller hur fungerar det där?

Vill både ha minne och en extern SPI-anslutning om det kan fungera att kombinera? Ser att det finns en pinne som heter "SS - slave select" på AVR'en... så det kanske bara är att använda en "slave-select"-tråd för varje enhet som ska kommuniceras med och se till att den multiplexas till rätt enhet från SS-pinnen? Den kopplar jag väl bara till CE# på minnet så ska väl det fungera?

EDIT: och så HOLD# pinnen... är den nödvändig eller går det att dra den till + ?
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av BEEP »

Jag kan väldigt lite om SPI så jag hoppas att det jag skriver är korrekt.

När det gäller våra SST minnen så har dom ingen enhetsadressering i protokollet eller vad det nu heter, så man använder CE kopplad till en valfri utgång på AVR'en för att aktivera det minne som man vill prata med. SO, SI och SCK linjerna delar minnena med varandra. Är dina SPI enheter slavar med CE ingång så gör du likadant med dom också.

"Ser att det finns en pinne som heter "SS - slave select" på AVR'en..."
Om jag inte har fel så används SS som ingång när AVR'en är en SPI slave?

"EDIT: och så HOLD# pinnen... är den nödvändig eller går det att dra den till + ?"
Just nu så är jag ute på jobb så jag kan inte kolla upp det men om du tittar på SST minnet så ser du att HOLD och WP är kopplat till plus eller minus.
Senast redigerad av BEEP 19 maj 2009, 06:10:07, redigerad totalt 1 gång.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av jesse »

OK, tack för svaret. Verkar inte så krångligt då. Tar nog ett par veckor innan jag kommit så långt att jag börjat bygga min testboard med Atmega48. Jag ska ha lite blandat - bl.a. LCD-display (utbytbar med annan device, tex 7-segm displayer), UART 5V, RS485, RS232, utgång för MOSFET-gate, summer, ett par knappar, kanske en IR-mottagare (fjärrkontroll) samt ett flashminne att logga data i.

Flashminnet kommer jag att ansluta bland det sista jag gör. Tänkte cadda kortet så att jag kan limma på det lilla minneskortet på mitt PCB och bygla över anslutningarna på nåt vis. Alternativet , om man har platsbrist är väl att helt enkelt löda av kretsen från det lilla kortet. Är väl inte så besvärligt egentligen.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av jesse »

perfekt! :tumupp:
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Tips eller Samköp? SPI-Flash SST25VF080B

Inlägg av BEEP »

BEEP skrev: Tyvärr så är minnet lika dött med din kod på AVR sidan så jag ska ta och prova med ett nytt minne, kanske var det min katt Lucas som släckte ljuset när han var framme och nosade på kopplingarna.
Idag så släcktes ljuset för Lucas efter att hans njurar hade lagt av.
Eftersom han var en extremt go tillgiven katt så var det hemskt att avliva honom, RIP :(
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar