Sida 4 av 5
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 23 mars 2009, 18:54:25
av gurgalof
Jag upptäckte det med hastigheten för 2 minuter sedan också

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

eller så var det måndags ex...
Nu ska jag försöka skriva lite data till minnet, och se hur det fungerar.
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 23 mars 2009, 20:44:37
av BEEP
Lucas var bara framme nosade på ett av minnena när det satt på STK500 så troligtvis är det ett SBS fel.
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 27 mars 2009, 11:38:38
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)
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 27 mars 2009, 12:26:58
av jesse
Vad är det för programspråk? Basic? Vilken processor?
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 27 mars 2009, 12:30:07
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.
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 27 mars 2009, 12:54:40
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.
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 27 mars 2009, 20:48:03
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
}
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 31 mars 2009, 14:03:09
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.
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 31 mars 2009, 20:00:17
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.
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 18 maj 2009, 14:55:01
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 + ?
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 18 maj 2009, 20:31:08
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.
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 18 maj 2009, 23:04:12
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.
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 19 maj 2009, 07:09:01
av BEEP
Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 19 maj 2009, 11:07:58
av jesse
perfekt!

Re: Tips eller Samköp? SPI-Flash SST25VF080B
Postat: 19 januari 2012, 18:02:37
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
