hola.despues de bastantes horas de trabajo para entender el funcionamiento del SPI de la serie 18F.he realizado un programa para la escritura y posterior lectura en una eeprom con ayuda de un programa que realizo pibe para el 16f877.
este programa tambien puede modificarse para usar eeproms de menos memoria de la serie 25lcxx.solo hay que limitar el direccionamiento interno.
es decir,quitar un par de lineas del codigo.
en el archivo adjunto pongo el programa con el VSM integrado.de esta forma tambien explico el funcionamiento de SPI de modo grafico con el osciloscopio.
y el SPI debuger de isis.
LIST P=PIC18F4550 ;Se indica el modo de procesador
#INCLUDE <P18F4550.inc>
RADIX HEX ;Sistema de numeracion hexadecimal
CONFIG FOSC = HS ;Osc por XTAL 20mhz
CONFIG DEBUG = OFF
CONFIG PWRT = OFF
CONFIG BOR = OFF
CONFIG WDT = OFF
CONFIG MCLRE = ON
CONFIG PBADEN = OFF
CONFIG LVP = OFF
CONFIG CP0 = OFF
CONFIG CP1 = OFF
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF
CONFIG CPD = OFF
ERRORLEVEL -302
CBLOCK 0x10 ;comienza el bloque de ram
rxdata
AUX0
AUX1
AUX2
ADDRESS0
ADDRESS1
ADDRESS2
ENDC
;***************Bit Definitions****************************************
#define CS PORTA,2,ACCESS ; SPI chip select bit definition
;**********************************************************************
;***************25Cxxx command definitions
#define wren 6 ;write enable latch
#define WRDI 4 ;reset the write enable latch
#define RDSR 5 ;read status register
#define WRSR 1 ;write status register
#define READ 3 ;read data from memory
#define WRITE 2 ;write data to memory
; Bit defines within status register
#define WIP 0 ;write in progress
#define WEL 1 ;write enable latch
#define BP0 2 ;block protection bit
#define BP1 3 ;block protection bit
;**********************************************************************
;<<<<<<---------------------- VECTOR DE RESET ------------------------>>>>>>>
ORG 0x00 ;Inicio en el Vector de Reset
goto INICIO ;ir a la primera instruccion del programa
ORG 0X001A
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
INICIO MOVLW b'00001111' ;
MOVWF ADCON1,ACCESS ;
MOVLW b'11111011' ; TRISA
bsf PORTA,2
clrf PORTD
MOVWF TRISA,ACCESS ; RA2 output
MOVLW b'11111101' ;
movwf TRISB,ACCESS ; PortB
MOVLW b'00110111' ;
movwf TRISC,ACCESS ; PortC
movlw b'00000000'
movwf TRISD,ACCESS ; PortD
movlw 0x00
movwf TRISE,ACCESS ; Puerto E
movlw 0x07
movwf CMCON,ACCESS ;
clrf INTCON,ACCESS ; deshabilita todas la interrupciones
movwf SPPCON
movwf SSPCON1 ; clear SSP control register
movwf PIE1 ; deshabilita interrupciones perifericas
movwf SSPSTAT ; borra el registro de estado de SSP
movwf SPPCFG ; borra el registro de configuracion SSP
movwf UCON
movwf ADCON0
movlw 0x31 ; SPI master, clk/16, ckp=1
movwf SSPCON1 ; SSPEN enabled
movlw 0x80 ; set up spi port, SPI master,
movwf SSPSTAT ; cke = 0 (mode 1,1)
clrf ADDRESS0,ACCESS ;borra byte de direccion 0
clrf ADDRESS1,ACCESS ;borra byte de direccion 1
clrf ADDRESS2,ACCESS ;borra byte de direccion 2
call Wren,0
call wrsr,0
call busy_test,0
call Wren,0
;escritura en eeprom 25lcxx
bcf CS ;habilita chip 25lcxx
movlw WRITE ;comando de escritura
call output,0 ;envia comando
movf ADDRESS2,W,ACCESS ;valor del tercer byte de direcciones
call output,0 ;envia direccion byte2
movf ADDRESS1,W,ACCESS ;valor del segundo byte de direcciones
call output,0 ;envia direccion byte1
movf ADDRESS0,W,ACCESS ;valor del primer byte de direcciones
call output,0 ;envia direccion byte0
movlw 0xA5 ;valor a grabar
call output,0 ;envia dato
bcf SSPCON1,CKP,ACCESS ;estado inactivo para ckl a nivel bajo.
bsf CS ;deshabilita chip 25lcxx
bsf SSPCON1,CKP,ACCESS ;estado inactivo para ckl a nivel alto.
call busy_test ;espera a terminacion de escritura.
;call rdsr
;lectura del dato escrito en la 25lcxx
bcf CS ;habilita chip 25lcxx
movlw READ ;comando de lectura
call output,0 ;envia comando
movf ADDRESS2,W,ACCESS ;valor del tercer byte de direcciones
call output,0 ;envia direccion byte2
movf ADDRESS1,W,ACCESS ;valor del segundo byte de direcciones
call output,0 ;envia direccion byte1
movf ADDRESS0,W,ACCESS ;valor del primer byte de direcciones
call output,0 ;envia direccion byte0
call output,0 ;lee dato grabado
bsf CS ;deshabilita chip 25lcxx
; mostrar dato
movf rxdata,w ;carga valor del registro rxdata en w
movwf PORTD ;visualizalo en PORTD
I goto I
org 0x0100
include "SPI_25xx.inc"
END
y el archivo .inc
;***************Bit Definitions****************************************
;#define CS PORTA,2 ; SPI chip select bit definition
;**********************************************************************
;***************25Cxxx command definitions
;#define wren 6 ;write enable latch
;#define WRDI 4 ;reset the write enable latch
;#define RDSR 5 ;read status register
;#define WRSR 1 ;write status register
;#define READ 3 ;read data from memory
;#define WRITE 2 ;write data to memory
; Bit defines within status register
;#define WIP 0 ;write in progress
;#define WEL 1 ;write enable latch
;#define BP0 2 ;block protection bit
;#define BP1 3 ;block protection bit
;**********************************************************************
;******Subrutina de Recepcion y Transmision de Datos***************
output movwf SSPBUF,ACCESS ; cargar el contenido de w al registro de recepcion/transmisin de datos
loop1 ;bsf STATUS,RP0 ; seleccion del bank 1
btfss SSPSTAT,BF,ACCESS ; espera a que se complete la transmision
goto loop1 ; si no ha terminado,espera.
;bcf STATUS,RP0 ; seleccion del bank 0
movf SSPBUF,W,ACCESS ; carga el contenido del registro de recepcion/transmisin de datos en w
movwf rxdata,ACCESS ; carga el contenido de w en rxdata
return 0 ; retorno de subrutina
;*******Subrutina de Habilitacion de Escritura****************************************
Wren bcf CS ; seleccion de chip a nivel bajo(chip habilitado)
movlw b'00000110' ; habilitacion de escritura en el byte de control de la eeprom
call output,0 ; transmite el dato de habilitacion de escritura
bcf SSPCON1,CKP,ACCESS ; poner a nivel bajo el la polaridad de ckl
bsf CS ; seleccion de chip a nivel alto(chip deshabilitado)
bsf SSPCON1,CKP,ACCESS ; poner a nivel alto el la polaridad de ckl
return 0 ; retorno de subrutina
;*******Subrutina de Inabilitacion de Escritura****************************************
Wrdi bcf CS ; seleccion de chip a nivel bajo(chip habilitado)
movlw b'00000100' ; inhabilitacion de escritura en el byte de control de la eeprom
call output,0 ; transmite el dato de inhabilitacion de escritura
bcf SSPCON1,CKP,ACCESS ; poner a nivel bajo el la polaridad de ckl
bsf CS ; seleccion de chip a nivel alto(chip deshabilitado)
bsf SSPCON1,CKP,ACCESS ; poner a nivel alto el la polaridad de ckl
return 0 ; retorno de subrutina
;*******Subrutina de Lectura del Registro de Estado********************************
rdsr bcf CS ; seleccion de chip a nivel bajo(chip habilitado)
movlw b'00000101' ; habilitacion de lectura del registro de estado de la eeprom
call output,0 ; lectura del registro de estado de la eeprom y lo cargas en rxdata
movlw b'00000101' ; no tener en cuenta
call output,0 ; lectura del registro de estado de la eeprom y lo cargas en rxdata
bsf CS ; seleccion de chip a nivel alto(chip deshabilitado)
return 0 ; retorno de subrutina
;*******Subrutina de Escritura del Registro de Estado*******************************
wrsr bcf CS ; seleccion de chip a nivel bajo(chip habilitado)
movlw b'00000001' ; orden para habilitar la escritura en la eeprom
call output,0 ; manda el dato
movlw b'00000010' ; deshabilitacion de la proteccion de lectura
call output,0 ; manda el dato
bcf SSPCON1,CKP,ACCESS ; poner a nivel bajo el la polaridad de ckl
bsf CS ; seleccion de chip a nivel alto(chip deshabilitado)
bsf SSPCON1,CKP,ACCESS ; poner a nivel alto el la polaridad de ckl
return 0 ; retorno de subrutina
;*******Busy Test - WIP bit in Status Register*************************
busy_test
bcf CS ; seleccion de chip a nivel bajo(chip habilitado)
movlw b'00000101' ; habilitacion de lectura del registro de estado de la eeprom
call output,0 ; lectura del registro de estado de la eeprom y lo cargas en rxdata
movlw b'00000000' ; send dummy byte
call output,0 ; to initiate clock sequence for read
bsf CS ; seleccion de chip a nivel alto(chip deshabilitado)
btfsc rxdata,WIP,ACCESS ; test WIP bit read from status register
goto busy_test ; repeat busy test
return 0 ; retorno de subrutina
cuando tengamos abierto el proyecto,le daremos al play y esperaremos unos segundos para que se carge el SPI Debug.
el programa se parara automaticamente.y tendremos las cuatro señales principales para el control de la 25lc1024 visualizadas en el
osciloscopio.
en el osciloscopio se han conectado los pin de la siguiente forma:
pin CS "seleccion de chip" de la eeprom al canal verde.
pin SI "entrada de datos" de la eeprom al canal rojo
pin SCK "sincronismo" de la eeprom al canal azul.
pin SO "salida de datos" de la eeprom al canal amarillo
el pin sck por defecto su estado logico es alto."1 logico" y la señal probeniente del microcontrolador es una rafaga de 8 impulsos
de unos 10uS de duracion en cada estado bajo.es decir cada ciclo dura 20uS.y se usa para determinar que el dato contenido en
SI y SO.
la forma de determinar que dato refleja por ejemplo la señal SI.lo vamos a ver en el osciloscopio.
para ello con la barra de desplazamiento del osciloscopio,buscaremos el final de la trama.y buscando el primer estado a 1logico
de SI "entrada roja" veremos que la subida de la onda ha coincidido con los dos ultimos impulsos de la señal azul(sck)
y como estas rafagas interpretan 8 bits,y la secuencia es b7,b6,b5,b4,b3,b2,b1,b0 de izquierda a derecha,
vemos que el estado a nivel alto coincide con b1 y b0.
asi se determina que es el valor binario 00000011.
si queremos ver mas datos,recorreremos la line roja hacia la izquierda y veremos que la señal no es la misma.
ya que es un valor diferente.
en este caso el estado alto de SI(rojo),coincide con los bit b2 y b0 de la señal sck(azul) que seria el valor en binario 00000101.
como vemos en la señal roja.despues del bit 0.el estado de la señal continua en alto.hasta que empieza la siguente rafaga azul.
a esto no hay que darle importancia.ya que no contiene ningun valor al no tener sincronismo con clk.
en nuestro programa hemos grabado un dato en la eeprom 25lcxx y posteriormente lo hemos leido.
este dato es el A5.
y podemos verlo el la señal del osciloscopio.la señal es SO"amarillo"
esta al final de la trama recibida y como podemos ver coincide con algunos estados de la señal sck.
en este caso los estados altos de SO coinciden con los bits de sincronismo de SCK.y son con los bits:b7,b5,b2,b0 =10100101=A5
ya que conocemos la forma de interpretar los valores de las señales,es hora de conocer como leer o escribir en la eeprom.
pero eso lo dejare para otro dia.que ya se me hizo tarde.