|
|
View previous topic :: View next topic |
Author |
Message |
ad
Joined: 24 Mar 2015 Posts: 14
|
Problem with memory SPI |
Posted: Fri Jun 19, 2015 2:54 am |
|
|
I have a N25Q064 memory with communication SPI, my problem is that not read correctly. It always reads 0. I don't know because it happens.
My code:
Code: |
#include <18F4550.h>
//!#fuses XT //Cristal de cuarzo de 8 MHz
//!#fuses NOWDT //Perro guardian deshabilitado
//!#fuses NOPROTECT //Inhabilitado la proteccion contra la lectura
//!#fuses NOLVP
//!#fuses MCLR
//#fuses INTHS //Oscilador Interno
#use delay(clock=20MHz)
//#use delay(internal=8MHz) //Velocidad Oscilador Interno
#use spi(master,DI=PIN_C7,DO=PIN_B0,CLK=PIN_B1,ENABLE=PIN_A5) //Comunicacion PIC-MEMORIA SPI
#include "C:\Users\x\PROGRAMA_DEFINITIVO\flex_lcd420.c" //LCD
//!#include <math.h>
//!#include "C:\Users\x\PROGRAMA_DEFINITIVO\kbd.c" //Teclado
//!#include <stdlib.h>
//Variables
int dato;
int direccion;
void main(){
//Configuracion de la memoria
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16);
//Inicializar LCD
lcd_init();
//Habilitar Escritura
output_low(PIN_A5); //Habilitar dispositivo
spi_write(6); //Habilitar la escritura de la memoria
output_high(PIN_A5); //Deshabilitar el dispositivo
//Escribir Memoria
output_low(PIN_A5); //Habilitar dispositivo
spi_write(2); //Instruccion de escritura de la memoria
spi_write(0); //Direccion de la memoria
lcd_putc("E");
for (dato=0;dato<7;dato++){ //Dato
spi_write(dato); //Valor del dato
printf(lcd_putc,"%u",dato); //Muestra el valor del dato en LCD
delay_ms(500); //Tiempo de espera
}
//Leer
output_high(PIN_A5); //Deshabilita escritura
delay_ms(1000);
lcd_putc("\nL");
output_low(PIN_A5); //Habilitar dispositivo
spi_write(3); //Habilitar la lectura de la memoria
spi_write(0);
for (direccion=0;direccion<7;direccion++){
dato=(spi_read(direccion)); //Lee el dato
printf(lcd_putc,"%u",dato); //Muestra el valor del dato en LCD
delay_ms(500);
}
output_high(PIN_A5); //Deshabilita escritura
}
|
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19499
|
|
Posted: Fri Jun 19, 2015 8:02 am |
|
|
First thing. How are you handling voltages?. You have a 5v PIC. The 4550, requires 4.2v minimum. Your memory supports 3.6v maximum. The PIC SPI running requires signals to go up to 4v. The memory can't do this without a level translator between the chips, and if you are feeding the PIC SPI outputs directly into the chip you risk damaging it.....
Second comment. It is surprising your chip is actually working. Fuses are needed. You may just be lucky, and the erased state of the fuses is defaulting to a working combination, but this is _luck_. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Sat Jun 20, 2015 8:00 am |
|
|
And then the other issues: Code: | #use spi(master,DI=PIN_C7,DO=PIN_B0,CLK=PIN_B1,ENABLE=PIN_A5)
...
setup_spi(SPI_MASTER | SPI_H_TO_L | SPI_CLK_DIV_16); | The CCS compiler supports two sets of SPI-functions:
1) The old set, a combination of the functions setup_spi(), spi_write() and spi_read().
These functions can only be used with the hardware SPI module in the processor.
2) The newer functions consisting of '#use SPI' and spi_xfer().
These newer functions are more flexible and can generate a software UART when you use pins not connected to a hardware SPI module.
BEWARE: you can't mix the two function sets in your code! It is undefined how your SPI module will be configured when you mix the functions of both sets as you do in your code.
Now, to which pins is your external device connected?
In the #use SPI setup you define C7 for SPI input, but in the SPI hardware from the processor it is a SPI output. The compiler solves this by generating a software SPI module instead. Software SPI will work, but it is a waste to use the correct hardware pins for hardware SPI and then have them connected wrong.
SPI can work in one of four communication modes. You didn't specify this 'mode' parameter. 75% chance the compiler default is wrong for your chip... |
|
|
ad
Joined: 24 Mar 2015 Posts: 14
|
|
Posted: Mon Jun 29, 2015 2:49 am |
|
|
Realized I was mixing the communication protocols of hardware with software. I have established that the software will therefore be used:
#use spi (master, DI = PIN_C7, DO = PIN_B0, CLK = PIN_B1, ENABLE = PIN_A5) for configuration.
spi_xfer (stream DATA) for the issue of communicating.
Now that I have found this error I'm a little lost, such as saving of the values obtained of an NTC temperature for example every 5 seconds, for an hour.
We know that #task ( rate = 5s , max = 1ms ) NTC void ();
NTC is read within 5 seconds. |
|
|
ckielstra
Joined: 18 Mar 2004 Posts: 3680 Location: The Netherlands
|
|
Posted: Mon Jun 29, 2015 4:03 am |
|
|
ckielstra wrote: | SPI can work in one of four communication modes. You didn't specify this 'mode' parameter. 75% chance the compiler default is wrong for your chip... |
ad wrote: | #use spi (master, DI = PIN_C7, DO = PIN_B0, CLK = PIN_B1, ENABLE = PIN_A5) |
Never mind, I'm out. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|