Autor Tema: Ayuda con DMA y SPI en dsPIC33FJ128GP802  (Leído 7494 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Ayuda con DMA y SPI en dsPIC33FJ128GP802
« en: 18 de Julio de 2011, 14:51:58 »
Buenas Tardes, estoy haciendo un dispositivo que reproduce un archivo  .wav desde una tarjeta SD, con un dsPIC33FJ128GP802, es mi primera vez con dsPIC, y luego de leer horas de codigo y de leer los datasheet y app notes de Microchip, ya me creo listo para comenzar, sin embargo el codigo que tengo escrito lo tengo con CCS y aunque casi toda la documentacion es para C30...

lo primero que hice fue averiguar como poner a funcionar el oscilador y el DAC, de momento ya funciona pero en modo "manual" es decir, debo cargar manualmente el valor del DAC1RDAT cada cierto tiempo... y a la vez leer de la memoria SD los datos a meter en el buffer DACRDAT (es mono, 16bits @44.1 kbps) y la idea es aprovechar la capacidad de usar Direct Memory Access (DMA) para liberar de tiempo la CPU de tan tediosa tarea como es leer de la memoria SD, pero aca si no tengo ni idea de como empezar....

no se como aprovechar el DMA para recibir automaticamente los datos de la SD a los respectivos buffers (BufferA y BufferB) por medio de SPI.... o es que acaso DMA solo me sirve para "vaciar" el contenido de los BuffersA y B una vez lleno dentro del registro DAC1RDAT?? y la lectura de los datos por SPI los debo hacer manuales??

alguna lectura que me puedan recomendar para tratar de entender esa parte??


luego de eso, prometo que me quemaré las pestañas programando pero... ¿Como programas algo que no entiendes?



saludos
« Última modificación: 19 de Julio de 2011, 11:59:46 por sal0m0n »
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con DMA y dsPIC33FJ128GP802
« Respuesta #1 en: 18 de Julio de 2011, 19:01:30 »
Hola salomon, yo no se ni C30 ni CSS pero puedo observar ciertas similitudes.

Viste ya el doc de SPI?

Código: [Seleccionar]
http://ww1.microchip.com/downloads/en/DeviceDoc/70206C.pdf
Ahi hay una seccion que dice "SPI OPERATION WITH DMA" e incluso un codigo de ejemplo para C30 bajo el titulo "SPI Transmission and Reception with DMA"

Si queres leer mas y ver el funcionamiento especifico del DMA, que seguro que lo vas a necesitar te vas aca:

Código: [Seleccionar]
http://ww1.microchip.com/downloads/en/DeviceDoc/70182b.pdf
Citar
y luego de leer horas de codigo y de leer los datasheet y app notes de Microchip, ya me creo listo para comenzar

Yo tambien me crei listo para comenzar cuando empeze a jugar en ASM con estos dsPIC y siempre tope contra una pared.. pergunte y nada... la unica forma es leer y leer.. siempre se me habia pasado algo por alto.
A diferencia de los PIC comunes que se encesita solo el datasheet del dispositivo, este necesitas el datasheet y ademas hay un pdf por cada periferico (A/D , DMA, I2C, etc . ) que son realmente utiles.

Mas no te peudo decir por que jamas trabaje con DMA, me gustaria hacerlo si... pero bueno soy victima del tiempo xD jeje

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: Ayuda con DMA y dsPIC33FJ128GP802
« Respuesta #2 en: 19 de Julio de 2011, 11:02:21 »
por si queda alguna duda de los documentos descargados y leidos aca les dejo una imagen!




Gracias a ellos pude hacer andar, El oscilador a 80mhz @40MIPS, usar el PPS para configurar los pines del SPI, el DAC, el Clock del DAC desde el oscilador principal con PLL (este fue un reto porque hay errores en uno de los documentos), ahora  ando en la parte de la lectura de la memoria pero con tanta info tengo un bit puesto a cero en mi cerebro :P....



saludos
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: Ayuda con DMA y dsPIC33FJ128GP802
« Respuesta #3 en: 19 de Julio de 2011, 11:22:43 »
Otra cosa, el SPI se comporta de manera extraña, tengo este codigo de prueba sacado del codigo de inicializacion de una memoria SD...


Código: [Seleccionar]
OUTPUT_LOW(PIN_B9); //Chip Select
 for(i=0;i<10;i++)                       // Inicializar la memoria en modo SPI
   {
SPI_WRITE(0xFF);
}


 SPI_WRITE(0x40);    //  reset
 SPI_WRITE(0x00);    // argumentos para el comando reset
 SPI_WRITE(0x00);
 SPI_WRITE(0x00);
 SPI_WRITE(0x00);
 SPI_WRITE(0x95);

 y en la salida, del SPI solo sale
0xFF,  0xFF, 0x00



luego que el bucle se repite a los 185ms sale cada 185ms (tiempo del bucle)

estos datos: 0xFF, 0xFF, 0x40



he probado, colocar un while asi: "while(SPITBF)" para que espere hasta que el buffer se vacíe y transmita los datos para que no se pierdan, pero el resultado es el mismo....

saludos
« Última modificación: 19 de Julio de 2011, 11:27:04 por sal0m0n »
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: Ayuda con DMA y dsPIC33FJ128GP802
« Respuesta #4 en: 19 de Julio de 2011, 11:58:28 »
se me ha ocurrido ahcer una prueba a ver que sucede....



Código: [Seleccionar]
OUTPUT_LOW(PIN_B9); //para activar el trigger
 for(i=0;i<256;i++)                      
   {
SPI_WRITE(i); //escribo el valor de i al SPI (modo 8bits)
}


y el resultado es este:



desde 0 hasta 255, pero de 5 en cinco :S




alguien me puede explicar?
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #5 en: 20 de Julio de 2011, 00:32:22 »
Muy bueno !!! Hiciste un multiplcador por 5 sin quererlo xD jejje. Che la verdad que ni idea xD y la configuracion de los pines y demas cosas del SPI que dice ?.. que hace la funcion SPI_WRITE exactamente en ASM? por que como dije no entiendo nada de C,, o sea no quiere decir q no entienda sino que una funcion no permite ver exactamente lo que hace dentro del micro,, mientras q con ASM tengo todo controlado pero lleva mas tiempo y control, ademas de ser un poco mas complejo

Pero la verda que me mataste xD,, tendria q ponerme a averiguar sobre SPI y probarlo... por cierto, lindo analizador logico... xD se me caen las babas xD quiero uno xD ,, noams que salen fortuna :S

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #6 en: 20 de Julio de 2011, 00:47:57 »
¿Puedes enseñarnos cómo tienes inicializado el módulo SPI?
Por cierto, ¿cuál es el analizador que utilizas?

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #7 en: 20 de Julio de 2011, 10:43:01 »
Te falta esperar a que se transmita el dato, dentro de Microchip C30 hay una carpeta deniminada docs con ayuda para las funciones para los perifericos


Saludos
No contesto mensajes privados, las consultas en el foro

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #8 en: 20 de Julio de 2011, 11:04:38 »
Anoche, despues de horas de depuración, me di cuenta de que el problema es que al tener el micro corriendo a 40mips (FCY=40Mhz, Fosc=80mhz), cuando inicialmente tengo el clock del SPI en 625Khz, al escribir:

Código: [Seleccionar]
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64); //asi inicializo SPI para que el clock del SPI sea de 625khz

OUTPUT_LOW(PIN_B9); //para activar el trigger
 for(i=0;i<256;i++)                      
   {
SPI_WRITE(i); //escribo el valor de i al SPI (modo 8bits)
}

el procesador va tan rapido que escribe datos en el buffer de salida SPI1BUF aun cuando no se han terminado de enviar los primeros datos, entonces a esa velocidad, lo solucioné colocando un delay de 2us y ahora se comportade manera normal...

ahora el resultado de este código:
Código: [Seleccionar]
setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_64); //asi inicializo SPI para que el clock del SPI sea de 625khz

OUTPUT_LOW(PIN_B9); //para activar el trigger
 for(i=0;i<256;i++)                      
   {
SPI_WRITE(i); //escribo el valor de i al SPI (modo 8bits)
[b]delay_us(2);[/b]
}

es el siguiente:



luego, cuando coloco el clock del SPI a 10Mhz (setup_spi(SPI_MASTER | SPI_L_TO_H | SPI_CLK_DIV_4);
no hace falta colocarle ningun delay al bucle de escritura del SPI y el resultado con este código:

Código: [Seleccionar]
void EnviaSD (char data) //Función para enviar los datos a la SD
{
   char buffer;

   SPI1BUF = data;
   while (SPITBF);
   buffer = SPI1BUF;//para que no quede ativada la bandera de buffer de recepcion full

}

//////////en una funcion para enviar el CMD0 ///////////

      // envia 80 clocks
      for (i = 0; i < 10; i++)   SD8pulsos (); //ya aca no tengo necesidad de delays porque estoy corriendo el SPI a 10Mhz

      // envia CMD0 -> Idle state
      SeleccionaSD (TRUE);
      EnviaSD (0x40); // CMD0
      EnviaSD (0x00);
      EnviaSD (0x00);
      EnviaSD (0x00);
      EnviaSD (0x00);
      EnviaSD (0x95); // CRC - OK
      SD8pulsos ();


//// ...  ////

el resultado es este:



antes del 0x40 hay 80 bytes con 0xFF y luego sale el comando que colocamos en el código finalizando en 0x95, sin necesidad de colocar ningun tipo de delay


EL analizador lógico que utilizo no lo considero para nada costoso, para lo completo que es el modelo es "Zeroplus Logic Cube LAPC-16032" y con las puntas de pruebas adicionales me costo como 160USD en  una tienda por internet de MIAMI.
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #9 en: 20 de Julio de 2011, 11:14:56 »
En el anterior post, se resolvió lo del SPI, pero la inquietud del DMA sigue ahi, comprendo mas o menos como se utilizaría para transportar los bytes desde el buffer en la RAM hasta el registro DAC1RDAT, pero...

no comprendo como me puede ser util para recibir los datos desde la memoria SD a un buffer en la RAM (no se si se puede hacer)

saludos

Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #10 en: 20 de Julio de 2011, 13:51:39 »
Colocar una demora arbitraria no es lo adecuado, hay una funcion especifica para esperar en el caso de no usar interrupciones  ;-)
No contesto mensajes privados, las consultas en el foro

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #11 en: 20 de Julio de 2011, 14:08:04 »
yo intente esperando a que el Hardware pusiera a cero el bit de "buffer de transmision lleno" (SPITBF), en SPI1STAT si mal no recuerdo (bit 1), pero el comportamiento de la transmision era peor, si estas hablando de otra funcion, sería bueno que la especificaras en la respuesta porque aca...

...hay una funcion especifica para esperar en el caso de no usar interrupciones  ;-)

quedé igual que antes, de todos modos muchas gracias, aun ando por entrarle al DMA, que es la pregunta pendiente!

saludos
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #12 en: 20 de Julio de 2011, 15:41:11 »
yo intente esperando a que el Hardware pusiera a cero el bit de "buffer de transmision lleno" (SPITBF), en SPI1STAT si mal no recuerdo (bit 1), pero el comportamiento de la transmision era peor, si estas hablando de otra funcion, sería bueno que la especificaras en la respuesta porque aca...


No me encuentro en el lugar de estudio/trabajo, y te escribo desde un dispositivo móvil... Se que la función existe, porque la he utilizado en proyectos, habría que buscarla en la documentación que trae Microchip, Microchip/C30/Docs


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #13 en: 20 de Julio de 2011, 16:12:00 »
De todos modos en el primer post indiqué que estoy trabajando con CCS, de verdad que he pensado en migrar a C30 pues la documentacion para dsPICs es mas completa, y tiene funciones "builtin" para escribir P.E. el registro OSCCON mientras que con CCS me toco colocar esa parte en ASM.


Yo estoy leyendo y avanzando un paso a la vez, lo que pasa es que quiero dar los pasos muy rapido jajajajaja :-/

saludos
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Ayuda con DMA y SPI en dsPIC33FJ128GP802
« Respuesta #14 en: 20 de Julio de 2011, 18:46:12 »
Ups! Disculpa, nunca imagine que usaran CCS para dsPIC, perdón!  :oops:
No contesto mensajes privados, las consultas en el foro