Lecto-grabador de tarjetas MMC, SD, MicroSD con PIC

No estoy seguro si el puerto SPI usado para la microSD también pueda utilizarse para comunicación entre el WT5001M02 y el microcontrolador.
La persona que me vende esos módulos me dijo que si, pero yo no lo he comprobado.
Yo uso el protocolo RS-232, ya que me resulta más cómodo que el SPI.
 
Hola D@rkbytes hasta ahora puede conseguir una versión del WT5001M02 no sé porque el fabricante le borro la serie de la pastilla, pero el modulo funciona bien.
El problema que estoy teniendo es que quiero hacer la comunicación vía SPI, esto me llevo a buscar en la red foros que hablaran del tema pero es poco lo que se dice de este módulo manejado por SPI.
Recurrí a el modulo físicamente y pude notar que el modulo tiene un integrado M2I-12G (la foto la adjunto)
20160520_233914.jpg

Que al parecer es el que maneja la comunicación SIP para el módulo wt5001.
Estuve investigando la hoja de datos y la verdad no se cómo armar la línea de comando a enviar
cuadro 1.jpg
Te pregunto si tienes algún manual de cómo saber armar estas tramas de comando o si me puedes explicar cómo anda eso porque la verdad no se cómo tomar el caso.
o algo que me pueda orientar porque todas las notas que he visto en la web no saben tampoco cómo usarlo.
Nota: la presunta es abirta a respuesta de cualquier persona.

** Una solución que ami se me ocurre es usar algún converso de SPI-a-UART
Conocen alguno que sea fácil de manejar? .
Hoja de datos
Ver el archivo adjunto mx25l8006em2i-12g_3789808.pdf
 
Última edición:
Saludos.
Como te mencioné anteriormente, yo usé el protocolo de comunicación serial RS-232.
Con SPI ni lo intenté ya que estaba limitado de pines y porque usar RS-232 es más sencillo.
WT5001M02 PCB Design.jpg

Actualmente lo tengo funcionando y en etapa final de desarrollo. DSC01765.jpg

En dado caso, la comunicación por SPI no debería tener problema si se usa el protocolo dado por el fabricante y se realizan las conexiones correctamente.
 
Hola D@rkbytes gracias por tus comentarios, el módulo Wt5001 me ha ahorrado un montón de tiempo en estudio, construcción y montaje.
Pero mi proyecto consiste en dos modulo (WT5001(vos) y SIM900(modem)) que se comunican vía UART.
Ambos módulos los quiero comunicar a un solo pic para dales las órdenes.
El detalle está en que el Pic que estoy usando es el pic16f877a y solo tiene un puerto uart y el del SPI hasta donde yo tengo entendido. De ahí radica por qué quería usar el puerto SPI. Un puerto para el SIM900 y el otro para el WT5001.
Yo pensé en un Pic que tenga dos puerto UART pero no se si existen y si CCS compiler los maneje.
Se pueden conectar dos módulos con comunicacion UART a un solo puerto?
Qué opciones me puedes sugerir para usar los dos módulos desde un solo pic?

Gracias por tu tiempo dedicado.
 
Última edición:
Puedes manejar los puertos seriales que quieras, pero los demás por software.
Para esto se usa un identificador (Stream) en cada puerto serial extra por software.

Por ejemplo:
#use RS232 (UART1, STREAM = uart_1) // Puerto serial por módulo USART (Hardware)
#use RS232 (XMIT = PIN_XX, RCV = PIN_XX, STREAM = uart_2) // Puerto extra por software.

Si se omite "BAUD", el compilador usará 9600 Bps. Por defecto.

Pero al usar el identificador "STREAM" también se deben usar otras instrucciones para enviar y recibir.
Ahora a las instrucciones les precede una "f".
Por ejemplo, para enviar: fprintf (uart_2,"%c",dato);
Para recibir: dato = fgetc(uart_2);

Aún así, y aunque se puedan tener más de dos puertos seriales, sería interesante hacerlo por SPI.
 
Última edición:
Estuve investigando un poco, y parece que el chip WT5001 únicamente se puede comunicar por RS-232 cuando se usa un microcontrolador.
Ya que al parecer, el bus SPI es sólo para la comunicación con la SPI Flash y la microSD.

De hecho, en la hoja de datos no viene nada relacionado sobre comunicación por SPI hacia el WT5001, que tenga que ver con los comandos de reproducción.

Posiblemente se pueda, pero esa información no la he visto por ningún lado.
 
Estoy tratando de hacer una comunicación con el WT5001 y el PIC16F877A.
He creado un programa que lo único que hace es mandar una cadena al modulo WT5001 para que reproduzca la canción 0001.mp3.
Además de encender y apagar un LED para indicar que el programa está funcionando.

La trasmisión la estoy realizando por el puerto RS-232 manejado por software, pero aún no he podido hacer que ejecute la orden.

¿Me podrían decir que ven en el código que esté impidiendo hacer la comunicación entre el PIC y el módulo?

Agradezco todo el apoyo brindado.

El módulo WT5001M02-28P así lo tengo conectado:
la patilla 14 a gnd
la patilla_Tx 16 Rx del pic
la patilla_Rx 17 Tx del pic
la patilla 22 5vdc
la patilla 09 y 10 speaker.

PHP:
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4194304)   
#use delay(crystal = 4.194304MHz)
#use rs232(baud=9600,parity=N,xmit=PIN_E0,rcv=PIN_B0, stream=COM2,bits=8) 
//#use rs232(baud=9600, xmit=PIN_E0, rcv=PIN_B0, stream=COM2) // WT5001 Software

-----------------------------------------------------------
#include "E:\WT5001.h"
#include <string.h> 
#define  Luz_p Pin_C4
#Byte    Puerto_A = 0x85
#Byte    ProtA    =  0X05
#Byte    Puerto_D = 0x88
#Byte    ProtD    =  0X08

char cmd0[]={0x7E,0x04,0xA0,0x00,0x01,0x7E};     // Comando CMDO datos a enviar ;
     Int   i=0;
 
#int_TIMER1
void  TIMER1_isr(void) 
{
 // setup_timer_1(T1_DISABLED);
  set_timer1(0);
 // setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
 
} 

 #int_rda
void rda_isr(Void) // harware Sim900
{
  //aquí llega la interruptor de Sim900
  // VGN_Resive = getc( );
}
 
 /********************************************************************/
#int_EXT
void EXT_isr(void) // Software Wt5001
{
//aquí llega la interruptor de Wt5001
}
 
 
//---------------------------- 
 
 void main()
{  
 
   setup_adc_ports(NO_ANALOGS);// decimos al compilador que todos los puertos pasan hacer digitales y no analogos
   setup_adc(ADC_OFF);//se encarga básicamente de setear que puertos van a trabajar como analógicos y que puertos van a trabajar como digitales.
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   // -----------------------------------------------------
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_EXT);
    enable_interrupts(int_rda);
    set_timer1(0);
   //--------------------------------------------------------
   Puerto_A = 0x00;
   PROTA    = 0x00;
 
   Puerto_D = 0x00;
   PROTD    = 0x00; 
   //-------------------------------------------------

    
  for(i=0;i<=5;i++) 
  {   
    fprintf (COM2,"%c",cmd0[i]); 
  } 
  //fprintf (COM2,"%C","0x7E,0x04,0xA0,0x00,0x01,0x7E");
  
   while(true)
   {
    output_high(PIN_A0);
    delay_ms(1000);
    output_low(PIN_A0);
    delay_ms(1000);
   
  }// while(true)
}//void main()
 
Última edición por un moderador:
Hay muchas cosas declaradas en ese código que no son necesarias.
Adjunto un ejemplo que escribí de rápido con las funciones básicas.
No lo probé pero creo que debe funcionar.

Como el módulo también responde, se puede usar el retorno para determinar el estado.
Eso y las funciones para el volumen no las incluí, pero más o menos llevan la misma estructura.

Actualmente tengo un problema con la lectura de la cantidad de archivos en la uSD.
Sólo me envía la cantidad de archivos después de dar dos reset, y no he encontrado como solucionarlo.

Espero te sirva el ejemplo.
 

Adjuntos

  • 16F877A WT5001M02.rar
    50 KB · Visitas: 33
Gracias D@rkbytes voy a comenzar hacer las pruebas y te comento como me fue, ya que me callo una gripe de esas modernas que me dejo neutralizado por un par de días.
 
Hola D@rkbytes y a todos. La versión easy ya me salió.
Ahora voy a meterle un poco de complejidad para ver como me sale.

Gracias D@rkbytes por ayudarme a conocer y entender este modulo, y gracias a todos los que han estado pendiente del tema.

PHP:
void main()
{  
 int contador =20;
   while(true)
   {
    if(!input(PIN_B2))
    {
     fprintf(COM2,"%c%c%c%c%c%c",0x7E,0x04,0xA0,0x00,0x02,0x7E);
     output_high(PIN_A0);
     Delay_ms(1000);
    }
    
    if(!input(PIN_B3))
    {
     fprintf(COM2,"%c%c%c%c%c%c",0x7E,0x04,0xA0,0x00,0x01,0x7E);  
     output_high(PIN_A0);
      Delay_ms(1000);
    }
     
    if(!input(PIN_B1))
      {
       contador = contador +1;
          if(contador  == 31)
          {
          contador  = 0;
          }
        fprintf(COM2,"%c%c%c%c%c",0x7E,0x03,0xA7,contador,0x7E);
         delay_ms(500);  
      }
     
      output_low(PIN_A0);
  }// while(true)
}//void main()
 
Última edición por un moderador:
hola D@rkbytes, durante estos días he trabajado en el modulo wt5001, pero me nacido una pregunta.
¿Con cuantos mili amperios trabaja correctamente el modulo wt5001?
He tratado de resolver la pregunta con la hoja de datos y no lo puedo encontrar.
yo realice una prueba en vivo (Un poco desesperado )con 5v, 1.5 amp, el modulo trabajo muy bien pero el modulo toma una temperatura no aceptable.
Provee con 5v 1 amp y el modulo trabajo = de bien, y toma una temperatura que para mi es de trabajo, ya que no se calienta pero si se nota un leve cambio de temperatura.
por ende me gustaría saber cual debe ser la I ideal del modulo wt5001,para que dicho modulo tenga una una larga vida.
 
Saludos.
Realmente no lo sé, ya que nunca he medido la corriente de consumo del módulo.
Pero esa información si está en la hoja de datos.
Dice que en reproducción consume 39.1 mA con una carga de 8 Ω
Entonces eso consumirá aunque la fuente pueda entregar 10 Amperes.


WT5001 Electrical parameters.jpg
 
Gracias D@rkbytes por tus comentarios. La parte de la hoja de datos ya me queda claro, pero me queda la duda de cuantos amperios soporta el modulo, puesto que la fuente que alimenta al el modulo es de 1A y no se si sea mucha corriente para el modulo.
No se si hay una técnica para sacar esto, o si me puedes dar un aproximando.
 
Creo que no tienes claro el concepto sobre la corriente.
Si el módulo consume 39.1 mA, en reproducción, eso va a consumir aunque lo alimentes con una fuente que entregue 3.3 Voltios a 1000 Amperes.
O sea, que si la fuente de poder o batería puede entregar 100 mA, con eso será más que suficiente, únicamente para alimentar al módulo.
Ya no tomará más corriente aunque el suministro pueda ofrecer 1000 Amperes.

Y claro que hay una fórmula, la Ley de Ohm.
 
Gracias D@rkbytes la verdad es cierto, esto me cuesta un poco, ya que como no soy ingeniero en esto temas de electrónica y lo poco que se ya tengo mucho tiempo de no verlo, me cuenta un poco aprender o recordar ciertos temas , por eso les doy las gracias a ti y al foro por ayudarme con mis auto investigaciones.

Pero porque se abra presentado el caso de que cuando al modulo lo alimento con un fuente de 5 V 1.5 A el modulo toma una temperatura Bastante alta y cuando le pongo una fuente de 5V 1 A el modulo toma una temperatura muy moderada o pasable.
La única variable en esto fue los Amp.
Por esto fue que me nació la duda. Que esta pasando que se eleva la temperatura solo con elevar el amperaje?
 
No lo sé, no debería de suceder.
El consumo de corriente debe ser estable aunque las fuentes tengan diferentes intensidades de corriente.
O sea que teóricamente, si el módulo consume 39.1 mA con la fuente de 1 Amper, también debería consumir lo mismo con una de 2 o más Amperes.
 
Muy buenas a todos, me leí la 15 paginas de este hilo para intentar encontrar una solución al problema que tengo en la escritura de una SD (micro sd con adaptador a sd) con el pic 18f65j50.
Lo que descubrí hasta el momento es que puedo leer los datos de la sd y mostrarlos en un display lcd. Pero a la hora de escribir, la sd acepta el comando 24 con la direccion de donde grabar ya que me responde con "00" pero despues de que le mando los 512 bytes, todas las respuestas que obtengo son 0xFF. Espero que alguien me pueda ayudar ya que es un proyecto del colegio y estamos estancados.
Por si las dudas aclaro que el compilador es el CCS 4.104 y para programar utilizo el mplab.
 

Adjuntos

  • Programa.rar
    2.4 KB · Visitas: 19
No me gusta nada ese programa, y sin esquema, menos.
No veo que estés usando las rutinas adecuadas para leer y escribir una memoria SD.
En la carpeta de instalación del compilador hay un ejemplo que se llama "ex_mmcsd.c"
Míralo para que veas los procedimientos de lectura, escritura y configuración de pines.
 
Atrás
Arriba