Autor Tema: Memorias SD/MMC .... ¿algo simple y que funcione?  (Leído 17591 veces)

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

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #15 en: 18 de Octubre de 2010, 01:09:20 »
Primero tiene que funcionar la iniciacion de SD. Una prueba solamente disk_initialize() par ver si la configuracion del spi esta bien o el cableado falta algo.
Dependiendo del compilador FATFS, DIR se le declara como static.

He probado por horas y no logro hacer andar esto .... ya los ojos se me achicharran...
POR FAVOR AYUDA !!!!!

Siguiendo con el codigo de Chan, por favor alguien que me ayude y me diga si para un Atmega32 este codigo dentro del mmc.h esta bien modificado.
No entiendo la diferencia que hace entre SS y CS, además solo definie MOSI pero no define MISO. Juro que me estoy volviendo loco frente a la compu.  :5]

Código: [Seleccionar]
#ifndef _MMC_H__
#define _MMC_H__

//SPI configuration (Platform dependent)
#define SPI_PORT PORTB
#define SPI_DDR DDRB
#define DD_MOSI 5
#define DD_SCK 7
#define DD_SS 6

// Defines for SD card SPI access
#define SD_CS_PORT   PORTB
#define SD_CS_DDR    DDRB
#define SD_CS_PIN    4

// Port Controls  (Platform dependent)
#define SELECT() SD_CS_PORT &= ~(1<<SD_CS_PIN)      /* MMC CS = L */
#define DESELECT() SD_CS_PORT |=  (1<<SD_CS_PIN)      /* MMC CS = H */

/*-----------------------------------------------------------------------*/
/* SPI interface                                                          */
/*-----------------------------------------------------------------------*/
void init_spi (void)
{
DESELECT(); // set default CS pin
SPI_DDR    = (1<<DD_MOSI) | (1<<DD_SCK); // set spi direction
// SPI_DDR    = (1<<DD_MOSI) | (1<<DD_SCK)| (1<<DD_SS); // set spi direction
SD_CS_DDR |= (1<<SD_CS_PIN);           // Turns on CS pin as output
     if (!(SPI_DDR & (1<<DD_SS))) // if SS is input
     SPI_PORT |= (1<<DD_SS); //   set internal pull up SS for spi master mode

SPCR   = (1<<SPE)|(1<<MSTR); // Initialize SPI port (Mode 0)
     SPSR   = (1<<SPI2X); // SPI double speed settings
}

BYTE rcv_spi (void)
{
SPDR = 0xFF;
loop_until_bit_is_set(SPSR, SPIF);
return SPDR;
}

/* Alternative macro to receive data fast */
#define rcv_spi_m(dst) SPDR=0xFF; loop_until_bit_is_set(SPSR,SPIF); *(dst)=SPDR

#define xmit_spi(dat) SPDR=(dat); loop_until_bit_is_set(SPSR,SPIF)

#endif

« Última modificación: 18 de Octubre de 2010, 11:06:30 por JCAK »
Julio - Argentina

Desconectado ma4826

  • PIC16
  • ***
  • Mensajes: 130
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #16 en: 18 de Octubre de 2010, 09:34:26 »
En tu caso has conectado al CS de la SD en el Pin SS del mega por lo que coinciden.

Código: [Seleccionar]
#define DD_SS 4
Pero ese cambio no afecta al funcionamiento del trozo de código que has puesto.
Puedes probar a bajar la velocidad del SPI que ahora está al máximo (Fosc/2).

Saludos,

ma4826.



万人の友は誰の友でもない。

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #17 en: 18 de Octubre de 2010, 11:27:36 »
En tu caso has conectado al CS de la SD en el Pin SS del mega por lo que coinciden.

Código: [Seleccionar]
#define DD_SS 4
Pero ese cambio no afecta al funcionamiento del trozo de código que has puesto.
Puedes probar a bajar la velocidad del SPI que ahora está al máximo (Fosc/2).

Gracias ma4826

Sigue sin quedarme claro algo, a ver si me podes aclarar …

//SPI configuration (Platform dependent)
#define DD_MOSI      5   
#define DD_SCK      7   
#define DD_SS      6   

// Defines for SD card SPI access
#define SD_CS_PIN    4

Vos me confirmes que SD_CS_PIN va a PB4 (/SS del Atmel), pero mi duda es con DD_SS que yo asigne a PB6 (MISO)
Yo interpreto DD_SS como Slave Select, pero si lo interpreto así el MISO no tiene nada que hacer en ese lugar y para peor me quedaría sin asignar. Que significa DD_SS?

Algo más que debo probar como vos sugerís es lo de la velocidad. Estoy usando el micro a 16MHz, voy a cambiar la velocidad del SPI. ¿qué valor máximo soportan estas memorias?
« Última modificación: 18 de Octubre de 2010, 11:30:15 por JCAK »
Julio - Argentina

Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #18 en: 18 de Octubre de 2010, 11:50:37 »
Hola, en la incialización la tarjeta debe ser servida con un clock por SPI de 100 a 400 Khz, una vez inicializada podes aumentar la velocidad. Hasta 8 Mhz a mi me funciono bien. Una de la cosas que nunca pude entender es que la frecuencia del SPI siempre debía ser potencia de 2, en otros valores la cosa se ponía inestable, nunca pude investigar a fondo por donde venia el problema si era problema del driver con la tarjeta o algun problema de hard.

Saludos !

Desconectado ma4826

  • PIC16
  • ***
  • Mensajes: 130
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #19 en: 18 de Octubre de 2010, 13:07:25 »
 Los pines del SPI vienen fijados por hardware no los puedes elegir. Le dices que pines son el MOSI y SCK para ponerlos como salida en la inicialización, el MISO no hace falta porque por defecto arranca configurado como entrada. El único pin que puedes elegir es el que va conectado al CS de la SD, en este caso has cogido el PIN SS del mega.

Código: [Seleccionar]
    if (!(SPI_DDR & (1<<DD_SS))) // if SS is input
    SPI_PORT |= (1<<DD_SS); //   set internal pull up SS for spi master mode

 Para trabajar como maestro único tienes que poner el pin SS como salida o al menos asegurarte de que si está como entrada va a tener un nivel alto por eso la librería comprueba si el PIN_SS está configurado como salida y sino no lo está activa la pull-up, es para lo único que utiliza el valor de DD_SS. Porque si está configurado como entrada un nivel bajo en este pin interrumpe la transmisión, esto se usa cuando hay más de un maestro.

 Respecto a las velocidades es cierto lo que dice RICHI777, de hecho en la versión completa de la librería hace el cambio de velocidad.

 Saludos,

 ma4826.
« Última modificación: 18 de Octubre de 2010, 13:10:17 por ma4826 »
万人の友は誰の友でもない。

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #20 en: 18 de Octubre de 2010, 13:15:35 »
No es nesesario definir mosi, miso, sck por que el hardware lo controla, solo defines el pin selector "SS" por que se activa por el programa.
SS atemega32 pin PB4.

#define SELECT()    PORTB &= ~16        /* MMC CS = L */
#define    DESELECT()    PORTB |= 16        /* MMC CS = H */

Pero si se configura SS, MOSI, SCK como salidas y MISO como entrada en DDRB=176 para atmega32.

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #21 en: 18 de Octubre de 2010, 23:46:58 »
Hola ma4826

Citar
Para trabajar como maestro único tienes que poner el pin SS como salida o al menos asegurarte de que si está como entrada va a tener un nivel alto por eso la librería comprueba si el PIN_SS está configurado como salida y sino no lo está activa la pull-up, es para lo único que utiliza el valor de DD_SS. Porque si está configurado como entrada un nivel bajo en este pin interrumpe la transmisión, esto se usa cuando hay más de un maestro.

A ver si entiendo ... Vos me queres decir que si pongo esto asi para el Atmega32, debería andar sin importar lo que ponga en DD_SS?
//SPI configuration
#define DD_MOSI      5
#define DD_SCK      7  
#define DD_SS      1   ------------------------- ¿acá puedo poner cualquier pin si solo tengo un Master? ¿puedo usar PB1 y no conectarle nada, queda en el aire?
// Defines for SD card SPI access
#define SD_CS_PIN    4

Y por ultimo hago como vos decis y el MISO teniendo en cuenta que esta en Master y queda como entrada, lo mando directo al pin 7 del SD/MMC

¿es asi?
Porque si es asi a mi no me anda. Cambie el cristal por uno de 8MHz y también dividi la velocidad del SPI para que no sea  mayor a 400KHz.

Algo que me este comiendo??? ¿que proponen?
Si tienen algo que me puedan enviar por privado por si no lo quieren postear, mil gracias. Como verán estoy haciendo mi mejor esfuerzo y leyendo de todo, pero no hay caso. Gracias, muchas gracias.
« Última modificación: 18 de Octubre de 2010, 23:51:32 por JCAK »
Julio - Argentina

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #22 en: 19 de Octubre de 2010, 00:38:44 »
cristian_elect
No entiendo qué has querido explicar pero gracias igual.
« Última modificación: 19 de Octubre de 2010, 00:42:00 por JCAK »
Julio - Argentina

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #23 en: 19 de Octubre de 2010, 00:41:25 »
Pon tu codigo para ver cual es el error.

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #24 en: 19 de Octubre de 2010, 00:42:45 »
Pon tu codigo para ver cual es el error.

Aqui va completo. Estoy compilando con Studio 4
« Última modificación: 19 de Octubre de 2010, 01:23:33 por JCAK »
Julio - Argentina

Desconectado ma4826

  • PIC16
  • ***
  • Mensajes: 130
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #25 en: 19 de Octubre de 2010, 06:59:23 »
Citar
A ver si entiendo ... Vos me queres decir que si pongo esto asi para el Atmega32, debería andar sin importar lo que ponga en DD_SS?
No SS esta fijo en el micro es el PB4
Código: [Seleccionar]
#define DD_SS      4El que puedes elegir el pin al que conectas el CS de la SD. En tu caso has conectado SS del mega al CS de la SD, por lo que el pin SS va estar configurado como salida.

¿Dónde falla? ¿Que devuelve disk_initialize()?
¿Cuál es el tamaño de la SD? ¿Es SDHC?

Saludos,

ma4826.
« Última modificación: 19 de Octubre de 2010, 07:06:13 por ma4826 »
万人の友は誰の友でもない。

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #26 en: 19 de Octubre de 2010, 15:01:03 »
MA4826, por favor decime ¿esto deberia quedar así o como debe quedar?
Si alguien me dice como deben quedar, al menos no sigo pensando que el error puede estar en el cableado. Lo cual no creo pero todo es posible.
¿Cómo quedaría?


//SPI configuration
#define DD_MOSI      5
#define DD_SCK       7   
#define DD_SS        4

// Defines for SD card SPI access
#define SD_CS_PIN    4


Las memorias que tengo para probar son:
SanDisk   SD    512Mb
Kingston  SDHD  4Gb
Julio - Argentina

Desconectado ma4826

  • PIC16
  • ***
  • Mensajes: 130
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #27 en: 19 de Octubre de 2010, 15:40:18 »
Si, está bien.

¿Dónde falla? ¿Que devuelve disk_initialize()?

Saludos,

ma4826.
万人の友は誰の友でもない。

Desconectado cristian_elect

  • PIC18
  • ****
  • Mensajes: 453
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #28 en: 19 de Octubre de 2010, 17:20:21 »
Ya bueno para dar una ayuda aqui dejo un ejemplo para atmega32.
Pero respondan siempre que doy una ayuda hay termina todo, no se comenta si a servido o hay un error o falto algo.
Por que en el otro forodeelectronica me parece cuando estan cerca de fin de ciclo todos preguntan como apurados esperando que le resuelvan la tarea ni se toman el tiempo de usar el buscador del foro.

Desconectado JCAK

  • PIC18
  • ****
  • Mensajes: 325
Re: Memorias SD/MMC .... ¿algo simple y que funcione?
« Respuesta #29 en: 20 de Octubre de 2010, 00:06:45 »
Ya bueno para dar una ayuda aqui dejo un ejemplo para atmega32.
Pero respondan siempre que doy una ayuda hay termina todo, no se comenta si a servido o hay un error o falto algo.
Por que en el otro forodeelectronica me parece cuando estan cerca de fin de ciclo todos preguntan como apurados esperando que le resuelvan la tarea ni se toman el tiempo de usar el buscador del foro.

 :-/  :-/  :-/  :-/  :-/  :-/  :-/ :mrgreen:  :mrgreen:

Estoy infinitamente agradecido porque FUNCIONA !!!!
Lee la SanDisk 512Mb en FAT16 y también la Kingston 4Gb en FAT32
Lo he probado con el micro a 8MHz y con el terminal RS232 en Windows a 9600bps

Te comento un par de Warnings que arroja con el compilardor AVR Studio 4:
1) ../mmc_mega32.c:95: warning: pointer targets in passing argument 1 of 'mimprimir' differ in signedness
2) ../config_mmc_mega32.c:220: warning: implicit declaration of function 'putchar'

La ultima linea de Warning solo la arroja una vez, si vuelvo a compilar solo aparece la 1era.

Mil mil gracias Cristian
Julio - Argentina