Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
02/21/06 12:07
Read: times


 
#110401 - DataFlash using SPI of 89V51RD2
Responding to: ???'s previous message
Thanks a lot for the quick response.

Since DataFlash is 3.3V powered and i am using 5V powered 89V51RD2, i have used a latch 74HCT373 to interface serial output signal(SO) of DataFlash to microcontroller. Rest all pins of Dataflash (viz., RST,SI,*WP,*CS,SCK) are 5V tolerant.

Latch Enable signal is connected on port1.1.

I am using the SPI Mode 3 for SPI.
In order to write the data, i am using "MAIN MEMORY PAGE PROGRAM THROUGH BUFFER 1".

The opcode for "MAIN MEMORY PAGE PROGRAM THROUGH BUFFER 1" is 82H which should be followed by page address(PA11-PA0) and byte address(BFA9-BFA0). After this i am writing the data(e.g. 45H).

After that i am reading the data by using "MAIN MEMORY PAGE READ". The opcode for "MAIN MEMORY PAGE READ" is 0D2H(due to SPI Mode 3 being selected) which is followed by page address(PA11-PA0), byte address(BFA9-BFA0)
and 4 don't care bytes.

In SPI data/command/address write routine, i am checking for the SPI interrupt flag.
Also after every 8 bit data/command/address written into DataFlash, I am checking for the busy pin of Dataflash.

Please find attached the code.
Do let me know if any correction are to made.

CODE:

;PROGRAM FOR DATAFLASH MEMORY USING SERIAL PERIPHERAL INTERFACE(SPI)
;ON PORT 2.0 & PORT 2.1, LEDS ARE CONNECTED FOR CHECKING PURPOSE


ORG 0000H ;
SJMP OVER ;

;**************************************************************************************

;PORT 2.0 LED BLINK

BLK: MOV R5,#0AH ;FOR 1 SECOND DELAY, INITIALISE THE COUNTER TO 0AH(10D)
SETB 0A0H ;TURN ON THE LED CONNECTED ON PIN 1(I.E. PORT 2.0)[1us]
LP: ACALL DLY ;DELAY FOR THE LED WILL REMAIN ON OR OFF[2us]
DJNZ R5,LP ;FOR 1 SECOND DELAY[2us]

MOV R5,#0AH ;FOR 1 SECOND DELAY, INITIALISE THE COUNTER TO 0AH(10D)
CLR 0A0H ;TURN OFF THE LED CONNECTED ON PIN 1(I.E. PORT 2.0)[1us]
LPI: ACALL DLY ;DELAY FOR THE LED WILL REMAIN ON OR OFF[2us]
DJNZ R5,LPI ;FOR 1 SECOND DELAY[2us]
RET

;**************************************************************************************

;PORT 2.1 LED BLINK

BNK: MOV R5,#0AH ;FOR 1 SECOND DELAY, INITIALISE THE COUNTER TO 0AH(10D)
SETB 0A1H ;TURN ON THE LED CONNECTED ON PIN 2(I.E. PORT 2.1)[1us]
NP: ACALL DLY ;DELAY FOR THE LED WILL REMAIN ON OR OFF[2us]
DJNZ R5,NP ;FOR 1 SECOND DELAY[2us]

MOV R5,#0AH ;FOR 1 SECOND DELAY, INITIALISE THE COUNTER TO 0AH(10D)
CLR 0A1H ;TURN OFF THE LED CONNECTED ON PIN 2(I.E. PORT 2.1)[1us]
NPI: ACALL DLY ;DELAY FOR THE LED WILL REMAIN ON OR OFF[2us]
DJNZ R5,NPI ;FOR 1 SECOND DELAY[2us]
RET

;**************************************************************************************

;DELAY OF 0.1 SECOND

DLY: MOV R6,#0C8H ;INITIALISE THE OUTER DELAY COUNTER[2us]
OUT: MOV R7,#0F8H ;INITIALISE THE INNER DELAY COUNTER[2us]
IN: DJNZ R7,IN ;DECREMENT INNER DELAY COUNTER TILL IT BECOMES 0[2us]
DJNZ R6,OUT ;DECREMENT OUTER DELAY COUNTER TILL IT BECOMES 0[2us]
RET ;RETURN BACK TO MAIN PROGRAM[2us]

;**************************************************************************************

;SPI DATA/COMMAND/ADDRESS WRITE

DAT: MOV 86H,30H ;86H -> SPDAT -> SPI DATA
LP1: JNB 0B1H,LP1 ;0B1H -> SPI INTERRUPT FLAG
RET ;RETURN BACK TO MAIN PROGRAM

;**************************************************************************************

;MAIN PROGRAM STARTS HERE

OVER: MOV 81H,#10H ;INTIALISE THE STACK POINTER TO RAM LOCATION 10H

MOV 80H,#0FFH ;INITIALISE THE PORT 0
MOV 90H,#0FFH ;INITIALISE THE PORT 1
MOV 0A0H,#0FFH ;INITIALISE THE PORT 2
MOV 0B0H,#0FFH ;INITIALISE THE PORT 3

START:MOV 0D5H,#5CH ;D5H -> SPCR -> SPI CONTROL REGISTER(ENABLE SPI)

LP3: JNB 93H,LP3 ;CHECK IF THE DATAFLASH IS BUSY

CLR 94H ;ENABLE DATAFLASH

MOV 30H,#82H ;OPCODE FOR MAIN MEMORY PAGE PROGRAM
ACALL DAT ;XFER OPCODE TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE: 1

MOV 30H,#00H ;RESERVED BITS & PAGE ADDRESS(PA11-PA6)
ACALL DAT ;XFER ADDRESS TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:2

MOV 30H,#04H ;PAGE ADDRESS(PA5-PA0) & BYTE ADDRESS(BFA9-BFA8)
ACALL DAT ;XFER ADDRESS TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:3

MOV 30H,#01H ;BYTE ADDRESS(BFA7-BFA0)
ACALL DAT ;XFER ADDRESS TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:4

MOV 30H,#45H ;DATA TO BE WRITTEN
ACALL DAT ;XFER DATA TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:5

LP4: JNB 93H,LP4 ;CHECK IF THE DATAFLASH IS BUSY

SETB 91H ;SELECT LATCH FOR SERIAL OUTPUT(READING)

MOV 30H,#0D2H ;OPCODE FOR MAIN MEMORY PAGE READ
ACALL DAT ;XFER OPCODE TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:6

MOV 30H,#00H ;RESERVED BITS & PAGE ADDRESS(PA11-PA6)
ACALL DAT ;XFER ADDRESS TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:7

MOV 30H,#04H ;PAGE ADDRESS(PA5-PA0) & BYTE ADDRESS(BFA9-BFA8)
ACALL DAT ;XFER ADDRESS TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:8

MOV 30H,#01H ;BYTE ADDRESS(BFA7-BFA0)
ACALL DAT ;XFER ADDRESS TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:9

MOV 30H,#00H ;DON'T CARE BYTES
ACALL DAT ;XFER DON'T CARE BYTES TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:10

MOV 30H,#00H ;DON'T CARE BYTES
ACALL DAT ;XFER DON'T CARE BYTES TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:11

MOV 30H,#00H ;DON'T CARE BYTES
ACALL DAT ;XFER DON'T CARE BYTES TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:12

MOV 30H,#00H ;DON'T CARE BYTES
ACALL DAT ;XFER DON'T CARE BYTES TO DATAFLASH

ACALL BNK ;CHECKING PURPOSE:13

LP2: MOV A,86H ;TRANSFER READ DATA TO ACCCUMULATOR
JNB 93H,LP2 ;CHECK IF THE DATAFLASH IS BUSY

CJNE A,#45H,MQ ;CHECK WHETHER THE DATA WRITTEN & THE DATA READ IS THE SAME
SETB 0A0H ;SET PORT 2.0
SETB 0A1H ;CLEAR PORT 2.1

SJMP EXIT ;EXIT

MQ: CLR 0A0H ;CLEAR PORT 2.0
CLR 0A1H ;CLEAR PORT 2.1

EXIT: ACALL DLY ;TO CREATE A DELAY OF 1 SECOND
ACALL DLY ;CHECKING PURPOSE
ACALL DLY
ACALL DLY
ACALL DLY
ACALL DLY
ACALL DLY
ACALL DLY
ACALL DLY
ACALL DLY

SETB 94H ;DISABLE DATAFLASH
MOV 0D5H,#00H ;DISABLE SPI

END





List of 21 messages in thread
TopicAuthorDate
DataFlash            01/01/70 00:00      
   user_count++            01/01/70 00:00      
   What's in a name?            01/01/70 00:00      
      how you trying to read an write on flash            01/01/70 00:00      
         Not just any old flash            01/01/70 00:00      
   DataFlash using SPI of 89V51RD2            01/01/70 00:00      
      use CodeArchitect            01/01/70 00:00      
         How to post code and retain format            01/01/70 00:00      
      Guru 'magic'            01/01/70 00:00      
         be egotistical            01/01/70 00:00      
            It's worse than that, Jim!            01/01/70 00:00      
               yes, i remember from my time in Britain            01/01/70 00:00      
         But wait.. there's more!            01/01/70 00:00      
            It can't            01/01/70 00:00      
   More magic            01/01/70 00:00      
      AVR BUTTERFLY            01/01/70 00:00      
   thanks for the valuable suggestions            01/01/70 00:00      
      Latch?            01/01/70 00:00      
      Atmel Application Note            01/01/70 00:00      
   Re:Atmel Application Note            01/01/70 00:00      
      But why a Latch            01/01/70 00:00      

Back to Subject List