SPI

Started by RUDY CEPEDA February 13, 2006
Hi all.
   
  I'm trying to comunicate a HC912B32 with an Analog Devices ADIS16003
Accelerometer through SPI. I wrote the code that follows, for the initialization
of the SPI and comunication woth de peripheral:
   
  void inicia_SPI(void){
 /***************************************************
  * Funci de inicializaci del mulo SPI, act * 
  * sobre los registros de control del SPI para     *
  * ajustarlos a los valores deseados               *
  ***************************************************/
 //Registro de control 1
 SP0CR100011000;
 //       ||||||||_____Modo de Env: MSB Primero
 //       |||||||______Salida /SS: Inhabilitada
 //       ||||||_______Fase del Reloj Serial: 0
 //       |||||________Polaridad del Reloj: Invertida
 //       ||||_________Modo del SPI: Maestro
 //       |||__________Modo WIRED-OR: Encendido
 //       ||___________Habilitar SPI: Inhabilitado
 //       |____________Interrupciones del SPI: Inhabilitadas
 //Registro de control 2
 SP0CR200001100;
 //       ||||||||_____Modo de operaci de los Pines: Normal
 //       |||||||______Siempre Cero
 //       ||||||_______Manejo de Corriente Bajo: Habilitado
 //       |||||________Habilitar Pull-Up: Habilitados
 //       ||||
 //       |____________Estos Bits Siempre son Cero
 //Registro de Tasa de Datos
 SP0BR=0; //Transmisi a 4MHz 
 DDRS=6;
 SPE=1;//Habilita el SPI
}
//*********************************************************
  int transmision(char acr){
 /**************************************************************
  * Esta funci efect una comunicaci con el aceleretro  *
  * El paretro de entrada contiene la informaci a ser      *
  * escrita en el registro de control del ADIS16003. La salida *
  * es el valor de la aceleraci.                             *
  **************************************************************/
  int dato;
  char a,b;
  SP0SR;//Limpiar Bandera de transmisi completa
  SP0DRr;//Escribir al Registro de datos e Iniciar transmisi
  while(SPIF==0){};//Esperar hasta que la transmisi finalice
  a=SP0DR;//Recoger los primeros ocho bits del aceleretro
  SP0SR;//Limpiar Bandera de transmisi completa
  SP0DR=0;//Escribir al Registro de datos e Iniciar transmisi 
  while(SPIF==0){};//Esperar hasta que la transmisi finalice
  b=SP0DR;//Recoger los segundos ocho bits del aceleretro
  dato%6*a+b;//Ajustar 
  return dato;  
}
   
  The comunication has to be performed twice because the ADIS16003 has a 16bit
length SPI.
   
  The code seems to be right, but when I try to debug it in the target, the SPIF
flag never sets.
   
  I'm using CodeWarrior 3.1 and P&E Multilink for debug.
   
  Can somebody help me?
   
  Thanks
	"Son las palabras, por supuesto, la droga mas poderosa usada por la mente
humana"
Rudy Cepeda Gez
Ingeniero Electrico (C) - UIS
	---------------------------------

LLama Gratis a cualquier PC del Mundo.
Llamadas a fijos y miles desde 1 ctimo por minuto.
http://es.voice.yahoo.com


	
Bit 6, the SPI enable bit in control register one is not
set - it needs to be for the SPI to work or at least it does
in the 9s12 variant that I use. 
  ----- Original Message ----- 
  From: RUDY CEPEDA 
  To: 68hc12@68hc... 
  Sent: Monday, February 13, 2006 12:53 PM
  Subject: [68HC12] SPI
	  Hi all.
     
    I'm trying to comunicate a HC912B32 with an Analog Devices ADIS16003
Accelerometer through SPI. I wrote the code that follows, for the initialization
of the SPI and comunication woth de peripheral:
     
    void inicia_SPI(void){
  /***************************************************
    * Funci de inicializaci del mulo SPI, act * 
    * sobre los registros de control del SPI para     *
    * ajustarlos a los valores deseados               *
    ***************************************************/
  //Registro de control 1
  SP0CR100011000;
  //       ||||||||_____Modo de Env: MSB Primero
  //       |||||||______Salida /SS: Inhabilitada
  //       ||||||_______Fase del Reloj Serial: 0
  //       |||||________Polaridad del Reloj: Invertida
  //       ||||_________Modo del SPI: Maestro
  //       |||__________Modo WIRED-OR: Encendido
  //       ||___________Habilitar SPI: Inhabilitado
  //       |____________Interrupciones del SPI: Inhabilitadas
  //Registro de control 2
  SP0CR200001100;
  //       ||||||||_____Modo de operaci de los Pines: Normal
  //       |||||||______Siempre Cero
  //       ||||||_______Manejo de Corriente Bajo: Habilitado
  //       |||||________Habilitar Pull-Up: Habilitados
  //       ||||
  //       |____________Estos Bits Siempre son Cero
  //Registro de Tasa de Datos
  SP0BR=0; //Transmisi a 4MHz 
  DDRS=6;
  SPE=1;//Habilita el SPI
  }
  //*********************************************************
    int transmision(char acr){
  /**************************************************************
    * Esta funci efect una comunicaci con el aceleretro  *
    * El paretro de entrada contiene la informaci a ser      *
    * escrita en el registro de control del ADIS16003. La salida *
    * es el valor de la aceleraci.                             *
    **************************************************************/
    int dato;
    char a,b;
    SP0SR;//Limpiar Bandera de transmisi completa
    SP0DRr;//Escribir al Registro de datos e Iniciar transmisi
    while(SPIF==0){};//Esperar hasta que la transmisi finalice
    a=SP0DR;//Recoger los primeros ocho bits del aceleretro
    SP0SR;//Limpiar Bandera de transmisi completa
    SP0DR=0;//Escribir al Registro de datos e Iniciar transmisi 
    while(SPIF==0){};//Esperar hasta que la transmisi finalice
    b=SP0DR;//Recoger los segundos ocho bits del aceleretro
    dato%6*a+b;//Ajustar 
    return dato;  
  }
     
    The comunication has to be performed twice because the ADIS16003 has a 16bit
length SPI.
     
    The code seems to be right, but when I try to debug it in the target, the
SPIF flag never sets.
     
    I'm using CodeWarrior 3.1 and P&E Multilink for debug.
     
    Can somebody help me?
     
    Thanks
	  "Son las palabras, por supuesto, la droga mas poderosa usada por la
mente humana"
  Rudy Cepeda Gez
  Ingeniero Electrico (C) - UIS
	  ---------------------------------

  LLama Gratis a cualquier PC del Mundo.
  Llamadas a fijos y miles desde 1 ctimo por minuto.
  http://es.voice.yahoo.com

  
	  SPONSORED LINKS Microcontrollers  Technical support  Intel microprocessors  
        Pic microcontrollers
	------
  YAHOO! GROUPS LINKS 

    a..
	------
	------
	  No virus found in this incoming message.
  Checked by AVG Free Edition.
  Version: 7.1.375 / Virus Database: 267.15.6/257 - Release Date: 2/10/06
	
	
Thanks Vernon, but the statement "SPE=1;//Habilita el SPI", the
last line in the initialization function sets the bit 6 in SP0CR1.
   
  Any other suggest?

Vernon Lermond <VERNON9998@VERN...> escribi
  Bit 6, the SPI enable bit in control register one is not
set - it needs to be for the SPI to work or at least it does
in the 9s12 variant that I use. 
----- Original Message ----- 
From: RUDY CEPEDA 
To: 68hc12@68hc... 
Sent: Monday, February 13, 2006 12:53 PM
Subject: [68HC12] SPI
	Hi all.

I'm trying to comunicate a HC912B32 with an Analog Devices ADIS16003
Accelerometer through SPI. I wrote the code that follows, for the initialization
of the SPI and comunication woth de peripheral:

void inicia_SPI(void){
/***************************************************
* Funci de inicializaci del mulo SPI, act * 
* sobre los registros de control del SPI para *
* ajustarlos a los valores deseados *
***************************************************/
//Registro de control 1
SP0CR100011000;
// ||||||||_____Modo de Env: MSB Primero
// |||||||______Salida /SS: Inhabilitada
// ||||||_______Fase del Reloj Serial: 0
// |||||________Polaridad del Reloj: Invertida
// ||||_________Modo del SPI: Maestro
// |||__________Modo WIRED-OR: Encendido
// ||___________Habilitar SPI: Inhabilitado
// |____________Interrupciones del SPI: Inhabilitadas
//Registro de control 2
SP0CR200001100;
// ||||||||_____Modo de operaci de los Pines: Normal
// |||||||______Siempre Cero
// ||||||_______Manejo de Corriente Bajo: Habilitado
// |||||________Habilitar Pull-Up: Habilitados
// ||||
// |____________Estos Bits Siempre son Cero
//Registro de Tasa de Datos
SP0BR=0; //Transmisi a 4MHz 
DDRS=6;
SPE=1;//Habilita el SPI
}
//*********************************************************
int transmision(char acr){
/**************************************************************
* Esta funci efect una comunicaci con el aceleretro *
* El paretro de entrada contiene la informaci a ser *
* escrita en el registro de control del ADIS16003. La salida *
* es el valor de la aceleraci. *
**************************************************************/
int dato;
char a,b;
SP0SR;//Limpiar Bandera de transmisi completa
SP0DRr;//Escribir al Registro de datos e Iniciar transmisi
while(SPIF==0){};//Esperar hasta que la transmisi finalice
a=SP0DR;//Recoger los primeros ocho bits del aceleretro
SP0SR;//Limpiar Bandera de transmisi completa
SP0DR=0;//Escribir al Registro de datos e Iniciar transmisi 
while(SPIF==0){};//Esperar hasta que la transmisi finalice
b=SP0DR;//Recoger los segundos ocho bits del aceleretro
dato%6*a+b;//Ajustar 
return dato; 
}

The comunication has to be performed twice because the ADIS16003 has a 16bit
length SPI.

The code seems to be right, but when I try to debug it in the target, the SPIF
flag never sets.

I'm using CodeWarrior 3.1 and P&E Multilink for debug.

Can somebody help me?

Thanks
	"Son las palabras, por supuesto, la droga mas poderosa usada por la mente
humana"
Rudy Cepeda Gez
Ingeniero Electrico (C) - UIS
	"Son las palabras, por supuesto, la droga mas poderosa usada por la mente
humana"
Rudy Cepeda Gez
Ingeniero Electrico (C) - UIS
	---------------------------------

LLama Gratis a cualquier PC del Mundo.
Llamadas a fijos y miles desde 1 ctimo por minuto.
http://es.voice.yahoo.com