Thanks Paul for your shared codes!!! It is great.
I did the same test, but used PIC16LF877(3.0V) and FM25V10(3.0V,1Mbit). I think the communication is the same, only with some minor modifications. I spent almost one day on it,still get no result yet.... Can you help me to check if there is anything wrong with it?
Thanks!
Code:
'****************************************************************
'* Name : HARDWARE_SPI_FRAM TEST.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 3/17/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'****************************************************************
Define OSC 10
'INCLUDE "modedefs.bas"
DEFINE LOADER_USED 1
Define LCD_DREG PORTD
Define LCD_DBIT 4
Define LCD_RSREG PORTE
Define LCD_RSBIT 0
Define LCD_EREG PORTE
Define LCD_EBIT 1
Low PORTE.2 ' LCD R/W line low (W)
ADCON1 = %10000010 ' Set PORTA analog and right justify result
Pause 500 ' Wait .5 second
Low PORTE.2 ' LCD R/W line low (W)
ADCON1 = %10000010 ' Set PORTA analog and right justify result
Pause 500 ' Wait .5 second
Ticks VAR word ' Tick count (61 ticks = 1 sec)
Hour VAR byte ' Hour variable
Minute VAR byte ' Minute variable
Second VAR byte ' Second variable
Disp VAR byte ' Disp = 1 to update display
' Interrup handling bits
GIE var INTCON.7
PEIE var INTCON.6
TMR2IE VAR PIE1.1
TMR2ON VAR T2CON.2
TMR2IF VAR PIR1.1
' Definations for the SPI communication protocal
'------------------------------------------------------------------
'TRISB.5=0 ' This is for the CS PIN
FM_CS VAR PORTA.5 ' SPI FRAM CHIP CS PIN
FM_CS_TRIS VAR TRISA.5 ' SPI FRAM CHIP CS PIN DIRECTION
SCK VAR PORTC.3 ' SPI CLOCK
SCK_TRIS VAR TRISC.3 ' SPI CLOCK PIN DIRECTION CONTROL
SDI VAR PORTC.4 ' SPI DATA IN
SDI_TRIS VAR TRISC.4 ' SPI DATA IN PIN DIRECTION
SDO VAR PORTC.5 ' SPI DATA OUT PIN
SDO_TRIS VAR TRISC.5 ' SPI DATA OUT PIN
WCOL VAR SSPCON.7 'SSP WRITE COLLISION
SSPEN VAR SSPCON.5 'SSP ENABLE
SSPIF VAR PIR1.3 'SSP INTERRUPT FLAG
'---------------------------------------------------------------------
'-----------------------A/D setups --------------------------------------------
'Define ADC_BITS 10 ' Set number of bits in result
'Define ADC_CLOCK 2 ' Set clock source (3=rc)
'Define ADC_SAMPLEUS 20 ' Set sampling time in uS
'TRISA = %11111111 ' Set PORTA to all input
'ADCON1 = %10000010 ' Set PORTA analog and right justify result
'-------------------------------------------------------------------------------
'-------------SPI PORT REGISTERS SETUP----------------------------------------
SSPSTAT=%01000000 ' SAMPLE AT THE MIDDLE OF DATA OUTPUT TIME, TRANSMIT ON IDLE RISING EDGE OF SCK
SSPCON=%00100000 ' SPI MASTER MODE, CLOCK=Fosc/4 ENABLE HARDWARE SPI PORT
SSPEN=1 ' ENABLE HARDWARE SPI PORT
'-------------------------------------------------------------------------------
'---VARIABLES FOR THE ADDRESS AND DATA MANAGEMENT-------------------------------
'TX_LEN CON 1 'SENDING DATA LENGTH
TX_BUFF var byte'[TX_LEN] 'SENDING DATA ARRAY
'RX_LEN CON 1 'RECEIVING DATA LENGTH
RX_BUFF var byte'[RX_LEN] 'RECEIVING DATA ARRAY
ADD VAR WORD 'ADDRESS FOR THE MOMEORY(LOW 16BITS)
BLOCK0 VAR BYTE 'HIGH EIGHT BITS OF MEMORY ADDRESS
BLOCK1 VAR BYTE 'HIGH EIGHT BITS OF MEMORY ADDRESS
'-------------------------------------------------------------------------------
'-------------INITIALIZATION--------------------------------------------------
FM_CS=1 'FRAM CHIP DISABLED
FM_CS_TRIS=0 'OUTPUT
SDO=1 'START SPI PIN WITH HIGH
SDO_TRIS=0 'OUTPUT
SDI_TRIS=1 'INPUT
BLOCK0=%00000000;
BLOCK1=%00000001;
add=0;
B0 Var byte
b0=100;
X1 VAR BYTE
X2 VAR BYTE
X3 var BYTE
X4 var BYTE
'Delay VAR byte ‘ Used to Debounce button
'TRISA = 0 ‘ PORTA is output
'TRISB = 3 ‘ RB0,RB1 are inputs
'CMCON = 7 ‘ PORTA digital I/O
'PAUSE 500 ‘ Wait 0.5sec for LCD to initialize
'
' Clear Hour, Minute, Second and Ticks to zero
'
Hour = 0
Minute = 0
Second = 0
Ticks = 0
'
T2CON=%01001100 ' Set the prescaler to 1, and postscale to 10
ON INTERRUPT GOTO ISR ' ISR routine
'PR2=156 ' Set PR2 Register 10ms for timer2
'PR2=249 ' Set PRS2 Register
PR2=224' Set PR2 Resiger for 1ms timer2
GIE=1
PEIE=1
TMR2IE=1'Enable the Timer2 interrupt.
TMR2ON=1'
' Defines for the SPI-Control Registers
'-------------------------------------------------------------------------------------
TRUE con 1;
FALSE CON 0;
CONT_WREN CON %00000110 'F-RAM WRITE ENBALE OP-CODE
CONT_RDSR CON %00000101 'F-RAM READ STATUS REIGSTER OP-CODE
CONT_WRSR CON %00000001 'F-RAM WRITE STATUS REGISTER OP-CODE
CONT_READ CON %00000011 'F-RAM READ MOMEORY OP-CODE
CONT_WRITE CON %00000010 'F-RAM WRITE MEMORY OP-CODE
'-------------------------------------------------------------------------------------
LOOP:
'-------Write the OP-CODE and the three Bytes of address-----
FM_CS=0
TX_BUff=cont_WREN
gosub writespi
fm_cs=1
fm_cs=0
tx_buff=cont_write
gosub writespi
'-----send three bytes of address-------------
tx_buff=block0;
gosub writespi
tx_buff=add.byte1
gosub writespi
tx_buff=add.byte0
gosub writespi
'----------------------Write the first four bytes the desired data--------------
tx_buff=$02
gosub writespi
tx_buff=$03
gosub writespi
tx_buff=$04
gosub writespi
tx_buff=$05
gosub writespi
FM_CS=1
ADD=0
'----------------------Read the four bytes------------------------------------
fm_cs=0;
tx_buff=cont_read
gosub writespi
'------------------Sending three byts of address---------------------------
tx_buff=block0;
gosub writespi
tx_buff=add.byte1
gosub writespi
tx_buff=add.byte0
gosub writespi
'-----------------Read data into the variables-------------------------------
gosub readspi
x1=rx_buff
gosub readspi
x2=rx_buff
gosub readspi
x3=rx_buff
gosub readspi
x4=rx_buff
'hserout [dec4 hour];
'hserout [dec4 Minute];
'hserout [dec4 Ticks];
'hserout [hex ];
'hserout [dec4 ];
'hserout [dec4 ];
'hserout [dec4 ];
IF Disp = 1 THEN
LCDOUT $FE, 2
LCDOUT hex X1, ":",hex X2, ":",hex x3,":",dec4 Ticks
PAUSE 20
ENDIF
Disp = 0
'PAUSE 1000
GOTO LOOP
'-----------------Sub routines for the SPI write and read-----------------------
WriteSPI:
WCOL=0
Rx_buff=SSPBUF ' CLEAR THE BUFFER
SSPIF=0 ' CLEAR THE INTERRUP FLAG
SSPBUF=tx_buff ' SEND THE BYTE
IF(wcol) THEN RETURN
WHILE(!SSPIF)
WEND
SSPIF=0;
RETURN
ReadSPI:
rx_buff=SSPBUF ' Clear the buffer
SSPIF=0 ' Clear the interrup flag
SSPBUF=0 ' Shift out a dummy byte What is this?
while(!sspif) ' wait for receive byte
wend
rx_buff=SSPBUF ' Get the byte
return
DISABLE
ISR:
'pause 3
'pauseus 400
'TMR2ON=0' TURN OFF TMR2
Ticks = Ticks + 1
'IF Ticks < 4 THEN NoUpdate
'
' 1 second has elapsed, now update seconds and if necessary minutes and hours.
'
if Ticks=1000 then
ticks=0
Second = Second + 1 ' Update second
IF Second = 60 THEN
Second = 0
Minute = Minute + 1 ' Update Minute
IF Minute = 60 THEN
Minute = 0
Hour = Hour + 1 ' Update Hour
IF Hour = 24 THEN
Hour = 0
ENDIF
ENDIF
ENDIF
endif
Disp = 1 ' Set to update display
'
' End of time update
'
NoUpdate:
TMR2IF=0 ' Re-enable TMR2 interrupts
Resume
ENABLE ' Re-enable interrupts
END
END ' End of program
Bookmarks