??? 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 |
Topic | Author | Date |
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 |