Autor Tema: Utilización de la memoria spi 25LC256  (Leído 5605 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Utilización de la memoria spi 25LC256
« en: 14 de Septiembre de 2006, 13:03:29 »

Buennass:

Estoy utilizando para un proyectillo una memoria spi de 256 Kbits, la 25LC256, pero tengo un problemilla porque la memoria no responde nada al dspic, este es mi codigo si alguien puede echar alguna manilla se lo agradecería y seguro que después podría aprovecharlo alguien mas y si nadie me puede ayudar pues seguro que alguien le valdrá este trozo de codigo por lo menos para configurar el modulo spi y el uart.

El modulo spi y el uart estan bien configurado estan comprobado.

#include "p30f3013.h"
#include <uart.h>
#include <spi.h>

#define CSDA1       PORTBbits.RB6   //Defino CSDA1 (Chipselect D/A nº1).
#define CSDA2       PORTBbits.RB7   //Defino CSDA2 (Chipselect D/A nº2).
#define CSMEM       PORTBbits.RB8   //Defino CSMEM (Chipselect memoria).

#define MEMHOLD      PORTBbits.RB9   //Defino MEMHOLD (Hold de la memoria)
#define MEMWP      PORTDbits.RD8   //Defino MEMWP   (Write Protection de la memoria)


_FOSC(CSW_FSCM_OFF & XT_PLL16); /* Multiplicador del pll x 16 =120 Mhz */                         
_FWDT(WDT_OFF);                 /* Deshabilitado el Watch-Dog Timer.  */
_FBORPOR(MCLR_EN & PWRT_OFF);   /* Habilitado el pin MCLR reset pin apagados los power-up timers. */
_FGS(CODE_PROT_OFF);            /* Deshabilitado el Code Protection */


unsigned int datospi;


/*Declaración de funciones*/

int main(void);
void inicializo_variables(void);
void HabilitarEscritura(void);
void LeerStatus(void);

void temporizacion(unsigned int tiempo);
void configura_uart(void);
void escribe_uart();
void configura_spi(void);



int main(void)
{

   TRISB=0x03F;            //Entradas:RBO,RB1,RB2,RB3,RB4,RB5
                        //Salidas:RB6,RB7,RB8,RB9
   
   TRISFbits.TRISF3=0;       //RF3=SDO Como salida;
   TRISFbits.TRISF6=0;       //RF6=SCK Como salida;

   TRISDbits.TRISD8=0;         //RD8 como salida.

   configura_spi();
   temporizacion(100);
   inicializo_variables();
   HabilitarEscritura();
   LeerStatus();
   
   //CloseSPI1();

   escribe_uart();
   
   while(1);
   return 0;
}

/*************************MEMORIA 25LC256********************************************************/

void HabilitarEscritura(void)
{
   CSMEM=0;
   WriteSPI1(0x06);
   while(SPI1STATbits.SPITBF);   
   temporizacion(150);            //Utilizo la temporización para mantener el CS a 0,
                           //mientras escribe el dato el modulo spi
   CSMEM=1;
}


void LeerStatus(void)
{
   temporizacion(25);
   CSMEM=0;
   WriteSPI1(0x05);
   while(SPI1STATbits.SPITBF);
   temporizacion(500);
   datospi=ReadSPI1();
   CSMEM=1;
   CloseSPI1();
}

/*************************FIN MEMORIA 25LC256******************************************************/


/**************************OTRAS FUNCIONES********************************************************/


void inicializo_variables(void)
{
   CSDA1=1;   //Chip select desactivado, dispositivo no seleccionado.
   CSDA2=1;   //Chip select desactivado, dispositivo no seleccionado.
   CSMEM=1;   //Chip select desactivado, dispositivo no seleccionado.
   MEMHOLD=1;   //Dispositivo modo operación.
   MEMWP=1;   //Dispositivo protección de escritura desactivada. modo operacion.
}

void temporizacion(unsigned int tiempo)
{
   unsigned int timeout;
   timeout=0;
   while(timeout<tiempo)
   {
      timeout=timeout+2;
   }
}

/**********************FIN OTRAS FUNCIONES********************************************************/

/*********************************MODULO UART****************************************************/

void configura_uart(void)
{

   unsigned int baudvalue;         /* Holds the value of baud register */
   unsigned int U1MODEvalue;      /* Holds the value of uart config reg */
   unsigned int U1STAvalue;      /* Holds the information regarding uart   TX & RX interrupt modes */

            
   CloseUART2();               /* Turn off UART1module */
   /* Configure uart1 receive and transmit interrupt */
   ConfigIntUART2(UART_RX_INT_EN & UART_RX_INT_PR6 & UART_TX_INT_DIS & UART_TX_INT_PR2);
   /* Configure UART1 module to transmit 8 bit data with one stopbit.   Also Enable loopback mode */
   
   baudvalue = 191;   //9600 baudios
   U1MODEvalue =    UART_EN & UART_IDLE_CON & UART_RX_TX &
                  UART_DIS_WAKE & UART_DIS_LOOPBACK &
               UART_DIS_ABAUD & UART_NO_PAR_8BIT &
               UART_1STOPBIT;

   U1STAvalue =    UART_INT_TX_BUF_EMPTY &
               UART_TX_PIN_NORMAL &
               UART_TX_ENABLE & UART_INT_RX_3_4_FUL &
               UART_ADR_DETECT_DIS &
               UART_RX_OVERRUN_CLEAR;

   OpenUART2(U1MODEvalue, U1STAvalue, baudvalue);
}

void escribe_uart()
{

   configura_uart();   
   WriteUART2(0x66);
   while(BusyUART2());   
   WriteUART2(datospi);
   while(BusyUART2());
   CloseUART2();
}

/****************FIN DE MODULO UART***************************************************************/

/********************MODULO SPI****************************************************************/
void configura_spi(void)
{

   unsigned int SPICONValue;      //Información sobre la configuracion SPI;
   unsigned int SPISTATValue;
   
   CSDA1=1;   //Chipselect activo a nivel bajo.
   CSDA2=1;
   CSMEM=1;

   CloseSPI1();

/*CONFIGURADO PARA TRABAJAR A 469 khz (Memoria 25LC256, frec trabajo max 10 Mhz) Cambio el modo para que trabaje a 8 bits SPI_MODE16_OFF*/
   SPICONValue =    FRAME_ENABLE_OFF & FRAME_SYNC_OUTPUT &
               ENABLE_SDO_PIN & SPI_MODE16_OFF &
               SPI_SMP_ON & SPI_CKE_OFF &
               SLAVE_ENABLE_OFF &
               CLK_POL_ACTIVE_HIGH &
               MASTER_ENABLE_ON &
               SEC_PRESCAL_4_1 &
               PRI_PRESCAL_16_1;
//FIN, para la configuarión de la velocidad solo se tocan el prescalador primario y secundario.

   SPISTATValue =    SPI_ENABLE & SPI_IDLE_CON &
               SPI_RX_OVFLOW_CLR;
   
   OpenSPI1(SPICONValue,SPISTATValue );
   
}

/*****************************FIN DE MODULO SPI***************************************************/


Un saludo a todos.
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Utilización de la memoria spi 25LC256
« Respuesta #1 en: 18 de Septiembre de 2006, 05:56:49 »

Buennasss:

Mas datos sobre el problema, aquí dejo unas imagenes de osciloscopio de las patillas de la memoria spi.

CH1 (Amarillo): SCK, reloj del modulo spi
CH2 (Azul): Chip Select de la memoria
CH3 (Lila): SO, salida de datos de la memoria
CH4 (Verde): SI, entrada de datos de la memoria

Aqui esta el funcionamiento de la función HabilitarEscritura();



Hasta aquí todo bien,

función LeerStatus();



Aquí esta el problema, la memoria no se entera de lo que le mando y no saca el valor del registro status por la patilla SO, que es lo que debería de hacer.

Por ultimo dejo una imagen resumen de las dos funciones, donde se ve claramente que la memoria no contesta nada, CH3 (lila)




También voy a dejar en datos adjuntos el datasheet de la memoria y una nota de aplicación de microchip desde donde configura el modulo spi de un pic18 para utilizar este tipo de memorias, a alguien le servirá.

Un saludo,
Milo
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Utilización de la memoria spi 25LC256
« Respuesta #2 en: 18 de Septiembre de 2006, 06:11:16 »


Lo siento los archivos son muy grandes para ponerlos como adjuntos os paso las direcciones de la pagina de microchip,

AN995, Nota de aplicación donde configura el modulo spi de un pic18 para la utilización de esta memoria,
AN995

Data Sheet, Memoria 25LC56
25LC256

Un saludo,
Milo
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Utilización de la memoria spi 25LC256
« Respuesta #3 en: 02 de Octubre de 2006, 08:11:35 »

Bueno voy avanzando aunque sea poco a poco, al final lo conseguiré,

Ya he conseguido que la memoria me responda algo, el truco esta en enviar después de la instrucción de leerstatus (0x05), una instrucción con 0x00, para que el reloj del dspic, sck, siga funcionando y la memoria responda, aquí esta el código.

void LeerStatus(void)
{
   temporizacion(1);   //10 con 1,25 Mhz
   CSMEM=0;
   WriteSPI1(0x05);
   while(SPI1STATbits.SPITBF);
   temporizacion(2); //No hace falta ponerla
   WriteSPI1(0x00);
   while(SPI1STATbits.SPITBF);
   temporizacion(2);   //50 con 1,25 Mhz
   while(!DataRdySPI1);


   datospi=ReadSPI1();
   

   CSMEM=1;
   temporizacion(2);
   CSMEM=0;
   temporizacion(2);
   CSMEM=1;
   CloseSPI1();
}

y aqui la respuesta en verde, SO de la memoria.



Ahora el problema esta en que el dspic no me detecta la respuesta de la memoria, y recibe 0x00 por el buffer spi.

Saludos.
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Utilización de la memoria spi 25LC256
« Respuesta #4 en: 27 de Noviembre de 2006, 09:15:10 »
Buennass

Ya esta arreglado, yo me lo guiso y yo me lo como, al parecer el problema estaba en la lectura de los registros del modulo spi, aquí esta el código, se hacen todas las funciones igual, lectura memoria, escritura memoria, etc, pero cambiando el dato que le enviamos por spi, este es para leer es registro de status de la memoria.

CS = 0;               
WriteSPI1(0x05);
while(!IFS0bits.SPI1IF);   
IFS0bits.SPI1IF = 0;     
ReadSPI1();

WriteSPI1(0x00);     
while(!IFS0bits.SPI1IF);
IFS0bits.SPI1IF = 0;
rval = ReadSPI1();         
CS = 1;   

saludos,
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Utilización de la memoria spi 25LC256
« Respuesta #5 en: 27 de Noviembre de 2006, 09:19:58 »


Ahhh se me olvidaba, si teneis alguna duda sobre dspic utilizando el mplab C30, y no lo conseguis resolver de ninguna manera, una opción puede ser escribir al soporte tecnico de microchip, teneís que escribir en ingles, pero te resuelven la duda.

La dirección,

Microchip Support

Teneís que estar registrados.

Saludos,
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Utilización de la memoria spi 25LC256
« Respuesta #6 en: 27 de Noviembre de 2006, 09:21:07 »
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset

Desconectado Mireya

  • PIC10
  • *
  • Mensajes: 2
Re: Utilización de la memoria spi 25LC256
« Respuesta #7 en: 14 de Enero de 2009, 13:46:07 »
Hola,

He visto que tu post tiene algún tiempo...sin embargo me encuentro en una solución parecida a la tuya, pero con el PIC 18F2320 y la memoria 25LC640. El caso es que he intentado por activa  y por pasiva el código que muestras, así como variantes de la hoja de aplicación de microchip y nada. No consigo leer ni un byte.
Mi problema creo que está en la escritura.... ya que las señales que le llegan a  la memoria (SDO del PIC, el CS y el clock) parecen normales (si los comparo con la hoja de aplicación) pero al contrario de lo que te pasaba a ti, a mí la señal de la memoria SDO (SDI en el PIC) me sale todo el rato a "1". Y según parece eso es que tiene algún problema en el proceso de escritura, porque coincide con las señales teóricas que se deben esperar. Lo malo es que se me queda en ese estado permanentemente.

No sé si me he explicado bien... pero si me pudieras ayudar aunque fuera un poco me harías un favor. Ya no sé qué más puedo probar.

Muchas gracias,
Saludos

Desconectado Milo

  • PIC16
  • ***
  • Mensajes: 101
Re: Utilización de la memoria spi 25LC256
« Respuesta #8 en: 21 de Marzo de 2009, 10:23:32 »
Hola Mireya:

Yo trabajaba con un dspic, y con el compilador C30 de Microchip, en realidad es programar C, al igual que el C18. Lo que pasa es que las librerias supongo que no coincidiran. Como bien dices el post ya tiene algún timpecillo y ya no me acuerdo de mucho, pero te aconsejaría que intentes siempre empezar por lo mínimo, intenta solo al principio, no escribir, si no, por ejemplo, leer el status register de la memoria, si lo consigues, luego puedes modificarle algún dato de ese registro,... y así hasta ya por ultimo escribir y leer algún valor de la memoria.

Siento no poderte ayudar más, espero que te sirva de algo,

Suerte y Animo. :-/
"En tanto que haya alguien que crea en una idea, la idea vive" Ortega y Gasset


 

anything