Autor Tema: problema comunicacion SPI y MAX5312  (Leído 3204 veces)

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

Desconectado xsagas

  • PIC10
  • *
  • Mensajes: 9
problema comunicacion SPI y MAX5312
« en: 26 de Enero de 2012, 16:54:03 »
buenas tardes;
de nuevo con un problema que espero puedan ayudarme.
estoy trabajando con un DAC la referencia es MAX5312, este dispositivo funciona
con protocolo SPI.

he realizado pruebas con el protocolo SPI entre dos microcontroladores y funciona.
Pero implemento el protocolo con el DAC y no he podido hacer que funcione.

este dispositivo tiene un registro de entrada de 16bit, 4 de control y 12 de datos
los datos segun su
Citar
max5312datasheet
deben ir MSB y LSB
este es el listado de comandos:

0 0 0 0 XXXXXXXXXXXX No operation; command is ignored.
0 0 1 0 12-bit DAC data Load input register from shift register; DAC output unchanged.
0 1 0 0 12-bit DAC data Load input and DAC registers from shift register; DAC output updated.
0 1 1 0 XXXXXXXXXXXX Load D AC r eg i ster fr om i np ut r eg i ster ; D AC outp ut up d ated ; i np ut r eg i ster unchang ed .
1 0 0 0 XXXXXXXXXXXX Enter shutdown; input and DAC registers unchanged.
1 1 0 0 XXXXXXXXXXXX Exit shutdown; input and DAC registers unchanged.

agradeceria la ayuda que puedan ofrecerme, o si alguien ya trabajo este dispositivo le agradeceria
la orientacion que pueda darme. estoy utilizando un pic18f4550..
acontinuacion les adjunto el codigo que estoy utilizando
main.c
Código: [Seleccionar]
#include "stack.h"

#include "lcd.c"
#include "max5312.c"

unsigned int16 lectura;
unsigned int16 valor;

#zero_ram
void main()
{
   //setup_spi(spi_l_to_h | spi_clk_div_16);
   setup_spi(spi_master | spi_l_to_h | spi_clk_div_16|SPI_XMIT_L_TO_H);
   Init_DAC(1);// iniciar DAC en modo unipolar
   lcd_init();
   setup_adc_ports( AN0|VSS_VDD  );
   setup_adc(ADC_CLOCK_INTERNAL );
   set_adc_channel( 0 );           // Inicia lectura por ADC canal 0 PinA0
   setup_wdt(WDT_OFF);
   setup_oscillator(False);
   printf(lcd_putc,"\f");
   

for(valor=16384;valor<=20479;valor++){
      lcd_gotoxy(1,1);
      lectura=read_adc();
      printf(lcd_putc,"adc:%Lu",lectura);
      SPI_out16(0b0010011111111111);
      SPI_out16(0b0100011111111111);
      SPI_out16(0b0110011111111111);
     
      lcd_gotoxy(1,2);
      printf(lcd_putc,"dato:%Lu",valor);
      delay_ms(50);
     
   }

}

drive
Código: [Seleccionar]
#BIT flag=0xF9E.3// define bit SSPIF bandera de transmision SPI
#define DAC_CS PIN_B7
#define LDAC PIN_B6
#define MODO PIN_B2
#define SHDN PIN_D3
#define CLR PIN_C6

     // rutina para inicializar el DAC
void Init_DAC (int1 s) {
     
      if(s){
      output_high(MODO); // modo unipolar
      }else{
      output_low(MODO);//modo bipolar
      }

      output_high(SHDN);// desactiva shotdown
      output_low(CLR);// borrar registros
      delay_us(9);
      output_high(CLR);
      output_high(LDAC);// desactiva pin de load     
   }

     // rutina de enviar datos al DAC...
   void SPI_out16(int16 dataout) {
     
      int8 h=make8(dataout,1);// MSB
      int8 l=make8(dataout,0);// LSB
     
      output_low(DAC_CS);     // activa el dispositivo
      delay_cycles(9);
     
           
         spi_write(h);           // envia primeros 8bits MSB
     
            if(flag){               // si primera transmision termino
           
            spi_write(l);           // envia segundos 8bits LSB
            output_high(DAC_CS);    // desactiva el despositivo
            delay_cycles(9);
           
               }         
   }

para verificar si funciona implemente el adc y visualizo la salida que obtengo en una LCD
me disculpo por el post tan largo y espero que alguien pueda darme una mano...


 

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:problema comunicacion SPI y MAX5312
« Respuesta #1 en: 17 de Diciembre de 2015, 02:23:38 »
Se que el tema es viejo, pero he comenzado a trabajar con este mismo chip (DAC), y estoy en las mismas que el compañero xsagas, no obtengo ningún voltaje en la salida del DAC, si alguien lo ha podido hacer funcionar, se agradecería que nos echen una mano.

Gracias, seguiré intentando
Nunca se deja de aprender

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:problema comunicacion SPI y MAX5312
« Respuesta #2 en: 18 de Diciembre de 2015, 02:32:13 »
Hola a todos, pues sigo intentando resolver el problema con el MAX5312, hasta ahora esto es lo que he probado:

1.- He leido un par de veces la datasheet, y no veo donde especifique el modo o modos en los que puede trabajar en SPI, por lo cual, he probado con todos sin resultados.

2.- He usado tanto #use spi, como, setup_spi() para intentar configurar el SPI, sin resultados

3.- He cambiado el parametro SPI_CLK_DIV_X en todos los valores disponibles sin resultados (repito, no veo en el datasheet o no identifico estos parametros)

4.- Esta armado en protoboard, en la datasheet menciona como no recomendable este metodo, pero considero que si al menos no logro controlarlo en protoboard pues una PCB no tendria mucho sentido

5.- Me he guiado del esquematico de la placa de prueba de Maxim que usa este chip para agregar los elementos recomendados, capacitores y demas, sin resultados.

6.- He enviado los datos en dos partes (8 bits a la vez) empezando por el MSB e incluso a la inversa, empezando con el LSB, sin resultados

7.- He enviado los datos en una sola parte (16 bits) sin resultados

8.- He probado a poner el SS siempre en bajo, pensando que talves no se esta seleccionando, y colocando en setup_spi, SPI_SS_C3 (tengo el SS en PIN_C3), sin resultados en ambas opciones

9.- Siempre obtengo la misma lectura en todos los casos, 2.0mv

10.- Estoy usando el siguiente comando (sin resultados) solamente:

 0 1 0 0 12-bit DAC data Load input and DAC registers from shift register; DAC output updated.

Puede que no este aplicando el protocolo SPI adecuadamente, estoy mas acostumbrado al I2C, no cuento con un dispositivo que use SPI propiamente (poner un PIC como esclavo no tiene sentido porque tengo dudas de si estoy usando adecuadamente el protocolo), asi que lo que hare por el momento es leer mas hacerca del mismo para estar bien seguro que no estoy metiendo la pata.

Alguna idea??? Deseas sacarme de mi ignorancia??? perfecto soy todo ojos jajaja
Se agradecen los comentarios y sugerencias, muchas gracias.

Nunca se deja de aprender

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema comunicacion SPI y MAX5312
« Respuesta #3 en: 18 de Diciembre de 2015, 09:19:01 »
No hay mucho para decir por que el SPI es el protocolo mas simple que hay.

- Solo para ver que estamos en la misma sintonia (con el mismo circuito en mente), Conecciones:

UNI/BIP : Esto a VCC a no ser que lo alimentes con -Vee +Vcc , si tenes una fuente simple directamente a VCC
SHDN: a VCC
LDAC: a VCC
CLR: a VCC
DOUT: no conectado
DIN: Entrada del SPI
SCLK: Clock del SPI
Lo demas como alimentaciones salidas etc no lo agrego

- Y aca viene lo que puede estar fallando, normalmente como los SPI del PIC son de 8 bits el CS no lo mantienen por siempre. Sino lo que hacen por 8 bits. asi que intenta hacer algo asi:

output_low(PIN_CS);
spi_send16( dato aca a enviar );
output_high(PIN_CS);

El dato lo debes enviar en este orden (las X son el valor a enviar, los 12 bits del DAC):

0100XXXX
XXXXXXXX

- Maxima frecuencia 10Mhz de CLK en el SPI

Proba esto, si no funciona ya alguien que sepa mas sobre CCS te podria indicar exactamente como configurarlo, ya que yo no me manejo con este, y por mi seria cargar el valor en el registro .
« Última modificación: 18 de Diciembre de 2015, 09:43:34 por KILLERJC »

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:problema comunicacion SPI y MAX5312
« Respuesta #4 en: 18 de Diciembre de 2015, 12:52:24 »
Hola KillerJC, pues si, sintonia confirmada  :D, tengo todo conectado como has dicho, las alimentaciones como lo recomienda en la datasheet y en la placa de desarrollo que vende Maxim, con sus capacitores en las alimentaciones y demas chuches.

En cuanto a lo del firmware que comentas, yo activo el CS, es decir, lo mando a bajo, pero lo hago todo el tiempo, es decir, cuando inicializo mi PIC dejo en bajo (GND) permanentemente esa linea, probare como me dices.

El comando que yo uso me parece correcto, porque al final con el cargas el registro de entrada y el del DAC con lo que llega al shift register, y la salida debe actualizarse, el compañero que inicio el post, en mi opinion tiene un comando de mas, o talves asi deba ser, pero en el datasheet no se ve ninguna secuencia de ejemplo, como lo hay por ejemplo en los I2C. Si existe un diagrama general de como deben llegar pero no un "Para actualizar la salida del DAC....tal" no la hay.

Envio primero el MSB junto con el Comando, y despues el LSB, justo como mencionas.

Lo que si no me aclaro mucho aun (sigo leyendo) es eso de los 10Mhz, yo tengo un cristal de 32Mhz, con un PIC16F1824 (creo que por ahi debi empezar, lo siento chicos la edad ya me pega), si tengo las opciones de divisores de 4,16 y 64, supongo que poniendo el de 4 o 16 esta bien, o no??

Y otra cosa que no veo y sigo sin ver como ya mencione antes es en que endemoniado modo debo poner el SPI para comunicarme, porque si bien tengo entendido, si el esclavo no soporta el modo en el que te estas comunicando ni haciendo la danza de la lluvia a tlaloc haces que responda.

No me doy por vencido, no me va a ganar este bicho.

Saludos amigos

Nunca se deja de aprender

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:problema comunicacion SPI y MAX5312
« Respuesta #5 en: 18 de Diciembre de 2015, 14:12:21 »
Voy contestando por parte

Citar
Lo que si no me aclaro mucho aun (sigo leyendo) es eso de los 10Mhz, yo tengo un cristal de 32Mhz, con un PIC16F1824 (creo que por ahi debi empezar, lo siento chicos la edad ya me pega), si tengo las opciones de divisores de 4,16 y 64, supongo que poniendo el de 4 o 16 esta bien, o no??

Vamos al datasheet, seccion SPI ( MSSP ) ahi tenemos el diagrama. se observa que la salida SCLK puede tener como fuente el oscilador, el timer, o un generador de baudios que se configura con el registro SSP1ADD.
Vamos a ir por la mas simple que es la del oscilador, estas trabajandolo a 32Mhz, por lo cual ahi donde dice Fosc estan tus 32Mhz, si lo dividis por 4, la señal de CLK variaria en 8Mhz. Asi que esta dentro de todo en el valor correcto.

Citar
Y otra cosa que no veo y sigo sin ver como ya mencione antes es en que endemoniado modo debo poner el SPI para comunicarme, porque si bien tengo entendido, si el esclavo no soporta el modo en el que te estas comunicando ni haciendo la danza de la lluvia a tlaloc haces que responda.

En el SPI puede ser un poco medio confuso el tema de modos, en el datasheet habla sobre maestro/esclavo, en otros dispositivos por ahi habla de la polaridad de clk y de cuando se toman los datos.

Con respecto a esclavo y maestro, el maestro es el que tiene control sobre el reloj. Es decir que si lo tenes como maestro al PIC este va a mandar la señal de CLK + datos ( lo que necesitamos ). Mientras que si lo tenes como esclavo, espera el CLK de un maestro, solo van a salir los datos cuando algun dispositivo externo conectado como maestro envie los pulsos de CLK.

Respecto a los modos, se trata de la polaridad de CLK y de cuando se debe cambiar los datos. Observaras esto en la pagina 248, figura 24-6 del datasheet del PIC. donde cambia la forma del clock y del flanco de cuando se toma el dato segun los bits de registro CPK y CKE, esto debe ser coincidente con el dispositivo MAX5312.

Si miras la imagen del datasheet del MAX5312, pagina 14, figura 2, veras que el CLK esta en bajo mientras no se envia. Eso te obliga a que CKP debe ser 0 segun el datasheet del PIC, y los datos se toman en los flancos ascendentes, por lo cual CKE=1. No se como se configura esto en CCS realmente.

Citar
En cuanto a lo del firmware que comentas, yo activo el CS, es decir, lo mando a bajo, pero lo hago todo el tiempo, es decir, cuando inicializo mi PIC dejo en bajo (GND) permanentemente esa linea, probare como me dices.

Algo a notar es que en el grafico que nombre antes del MAX5312 indica que cuando se produce el flanco ascendente del CS es cuando se procesa la señal, indicada por una flecha que dice "COMMAND EXECUTED"

Y espero que esto te resuelva tus dudas y te funcione el programa. Lamento no poder ser mas de ayuda con CCS, alguien podra hacerlo, o sino me tocara ver el manual del mismo.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re:problema comunicacion SPI y MAX5312
« Respuesta #6 en: 19 de Diciembre de 2015, 02:43:53 »
Te agradezco mucho el tiempo que te has tomado en responderme KillerJC, muchísimas gracias por la explicación, se me aclaran muchas dudas, haré los cambios en cuanto al manejo del CS y del divisor del reloj, probare y te comento como me fue.

Saludos y muchas gracias de nuevo.
Nunca se deja de aprender