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.