Hi Scampy;
Here is a code i do some time go to interface a 93c46 using both MSSP and Shift. Hope ot will be useful to you;
Code:
'****************************************************************
'* Name : 93C46N EEPROM + MSSP *
'* Author : [GADELHAS] *
'* Notice : Copyright (c) 2012 *
'* : All Rights Reserved *
'* Date : 08-02-2012 *
'* Version : 1.0 *
'* Notes : *
'* : EASYPICV6 + PIC16F887 + 93C46N - FARCHILD *
'****************************************************************
' CONFIGS
' ================================================================
@ __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOR_OFF & _DEBUG_OFF & _LVP_OFF & _FCMEN_ON & _IESO_OFF
@ __CONFIG _CONFIG2, _WRT_OFF & _BOR40V
' DEFINES & INCLUDES
' ================================================================
DEFINE OSC 8
' REGISTERS AND PINOUT ( 1 = IN; 0 = OUT )
' ================================================================
'76543210 '76543210
TRISA = %00000000: PORTA = %00000000
TRISB = %00000000: PORTB = %00000000
TRISC = %00010000: PORTC = %00000000
TRISD = %00000000: PORTD = %00000000
TRISE = %00000000: PORTE = %00000000
ADCON0 = %00000000
ADCON1 = %00000000
ANSEL = %00000000
ANSELH = %00000000
CM1CON0 = %00000000
CM2CON0 = %00000000
SSPSTAT = %00000000 'Configures the SPI Module ( Read DataSheet )
SSPCON = %00110001 'Configures the SPI Module ( Read DataSheet )
' ALIAS & MODIFIERS
' ================================================================
CS VAR PORTC.1 'Pin 1 of the 93C46N - PDIP CASE ( CS )
CLK VAR PORTC.3 'Pin 2 of the 93C46N - PDIP CASE ( SK )
SDI VAR PORTC.4 'Pin 4 of the 93C46N - PDIP CASE ( DO )
SDO VAR PORTC.5 'Pin 3 of the 93C46N - PDIP CASE ( DI )
' VARIABLES & COSTANTS
' ================================================================
ADDRESS VAR BYTE 'Address position to read or write
BT0 VAR BYTE 'Byte 0 to read or write
BT1 VAR BYTE 'Byte 1 to read or write
I VAR BYTE
' DEFINES
' ====================================================================
DEFINE LCD_DREG PORTB ' LCD Data bits on PORTB
DEFINE LCD_DBIT 0 ' PORTB starting address
DEFINE LCD_RSREG PORTB ' LCD RS bit on PORTB
DEFINE LCD_RSBIT 4 ' LCD RS bit address
DEFINE LCD_EREG PORTB ' LCD E bit on PORTB
DEFINE LCD_EBIT 5 ' LCD E bit address
DEFINE LCD_BITS 4 ' LCD in 4-bit mode
DEFINE LCD_LINES 2 ' LCD has 2 rows
DEFINE LCD_COMMANDUS 2000 ' Set command delay time in us
DEFINE LCD_DATAUS 50 ' Set data delay time in us
DEFINE DEBUG_REG PORTC
DEFINE DEBUG_BIT 6
DEFINE DEBUG_BAUD 19200
DEFINE DEBUG_MODE 0
' PROGRAM INIT
' ================================================================
'0123456789012345
LCDOUT $FE, 1, " 93C46 EEPROM "
PAUSE 2000
DEBUG "Start", 13,10,13,10
' MAIN LOOP
' ================================================================
MAIN:
FOR I = 0 TO 63
GOSUB READ2BYTES
LCDOUT $FE, 1, "Iteracao: ", DEC I
LCDOUT $FE,$C0,"BT0:", HEX BT0, " - BT1:", HEX BT1
DEBUG "Iteracao: ", DEC I," - ", HEX BT0,HEX BT1,13,10
NEXT
STOP
GOTO MAIN
' SUB - ROTINES
' ================================================================
WRITE2BYTES:
CS=1 'Enable Device
SSPBUF = $1 'Start Bit
SSPBUF = $30 'Command to Write
CS=0 'Disable Device
CS=1 'Select Device
SSPBUF = $1 'Start Bit
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPBUF = $40 | ADDRESS '01000000 Ored with ADDRESS
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPBUF = BT0 'Data 00
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPBUF = BT1 'Data 01
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
CS=0 'Disable Device
PAUSE 5 'Insure that you don't work you the device for 5ms
RETURN
READ2BYTES:
CS=1 'Enable Device
SSPBUF = $1 'Start Bit
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPBUF = $80 | ADDRESS '10000000 Ored with ADDRESS
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPCON.4=0 'Change Signal Clock "DataSheet of the PIC"
SSPBUF = $0 'Send Something
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
BT0=SSPBUF 'Read the SSPBUF to the BT0 Variable
SSPBUF = $0 'Send Something
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
BT1=SSPBUF 'Read the SSPBUF to the BT1 Variable
CS=0 'Disable Device
SSPCON.4=1 'Change the clock to initial state
PAUSE 5 'Insure that you don't work you the device for 5ms
RETURN
ERASEALL:
CS = 1 'Enable Device
SSPBUF = $1 'Start Bit
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPBUF = $20 'Command to Erase ALL
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
CS = 0 'Disable Device
PAUSE 5 'Insure that you don't work you the device for 5ms
RETURN
WRITEALL:
CS = 1 'Enable Device
SSPBUF = $1 'Start Bit
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPBUF = $10 'Command to Erase ALL
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPBUF = BT0 'Data Pattern 00
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
SSPBUF = BT1 'Data Pattern 01
WHILE SSPSTAT.0=0:WEND 'Wait for the BF flag to be Set
CS = 0 'Disable Device
PAUSE 5 'Insure that you don't work you the device for 5ms
RETURN
END
Code:
'****************************************************************
'* Name : 93C46N EEPROM *
'* Author : [GADELHAS] *
'* Notice : Copyright (c) 2012 *
'* : All Rights Reserved *
'* Date : 08-02-2012 *
'* Version : 1.0 *
'* Notes : *
'* : EASYPICV6 + PIC16F887 + 93C46N - FARCHILD *
'****************************************************************
' CONFIGS
' ================================================================
@ __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOR_OFF & _DEBUG_OFF & _LVP_OFF & _FCMEN_ON & _IESO_OFF
@ __CONFIG _CONFIG2, _WRT_OFF & _BOR40V
' DEFINES & INCLUDES
' ================================================================
DEFINE OSC 8
' REGISTERS AND PINOUT ( 1 = IN; 0 = OUT )
' ================================================================
'76543210 '76543210
TRISA = %00000000: PORTA = %00000000
TRISB = %00000000: PORTB = %00000000
TRISC = %10101101: PORTC = %00000000
TRISD = %00000000: PORTD = %00000000
TRISE = %00000000: PORTE = %00000000
ADCON0 = %00000000
ADCON1 = %00000000
ANSEL = %00000000
ANSELH = %00000000
CM1CON0 = %00000000
CM2CON0 = %00000000
' ALIAS & MODIFIERS
' ================================================================
CS VAR PORTC.1 'Pin 1 of the 93C46N - PDIP CASE ( CS )
CLK VAR PORTC.3 'Pin 2 of the 93C46N - PDIP CASE ( SK )
SDI VAR PORTC.4 'Pin 4 of the 93C46N - PDIP CASE ( DO )
SDO VAR PORTC.5 'Pin 3 of the 93C46N - PDIP CASE ( DI )
' VARIABLES & COSTANTS
' ================================================================
ADDRESS VAR BYTE 'Address position to read or write
BT0 VAR BYTE 'Byte 0 to read or write
BT1 VAR BYTE 'Byte 1 to read or write
I VAR BYTE
' DEFINES
' ====================================================================
DEFINE LCD_DREG PORTB ' LCD Data bits on PORTB
DEFINE LCD_DBIT 0 ' PORTB starting address
DEFINE LCD_RSREG PORTB ' LCD RS bit on PORTB
DEFINE LCD_RSBIT 4 ' LCD RS bit address
DEFINE LCD_EREG PORTB ' LCD E bit on PORTB
DEFINE LCD_EBIT 5 ' LCD E bit address
DEFINE LCD_BITS 4 ' LCD in 4-bit mode
DEFINE LCD_LINES 2 ' LCD has 2 rows
DEFINE LCD_COMMANDUS 2000 ' Set command delay time in us
DEFINE LCD_DATAUS 50 ' Set data delay time in us
DEFINE DEBUG_REG PORTC
DEFINE DEBUG_BIT 6
DEFINE DEBUG_BAUD 19200
DEFINE DEBUG_MODE 0
' PROGRAM INIT
' ================================================================
'0123456789012345
LCDOUT $FE, 1, " 93C46 EEPROM "
PAUSE 2000
DEBUG "Start",13,10,13,10
' MAIN LOOP
' ================================================================
MAIN:
FOR I = 0 TO 63
GOSUB READ2BYTES
LCDOUT $FE, 1, "Iteracao: ", DEC I
LCDOUT $FE,$C0,"BT0:", HEX BT0, " - BT1:", HEX BT1
DEBUG "Iteracao: ", DEC I," - ", HEX BT0,HEX BT1,13,10
NEXT
STOP
GOTO MAIN
' SUB - ROTINES
' ================================================================
WRITE2BYTES:
CS = 1
SHIFTOUT SDO,CLK,1,[%10011,0\4] 'Enable write
PAUSE 5
CS = 0
CS = 1
SHIFTOUT SDO, CLK, 1, [%101\3,ADDRESS\6,BT0,BT1] 'Two bytes at a time
PAUSE 5
CS = 0
RETURN
READ2BYTES:
CS=1
SHIFTOUT SDO,CLK,1,[%110\3,ADDRESS\6]
SHIFTIN SDI,CLK,2,[BT0,BT1] 'Two bytes at a time
PAUSE 5
CS=0
RETURN
ERASEALL:
CS = 1
SHIFTOUT SDO,CLK,1,[%10010,0\4]
PAUSE 5
CS = 0
RETURN
WRITEALL:
CS = 1
SHIFTOUT SDO,CLK,1,[%10001,0\4,BT0,BT1] 'Two bytes data pattern
PAUSE 5
CS = 0
RETURN
END
Bookmarks