Autor Tema: Comunicacion SPI con PIC y MCP2515  (Leído 970 veces)

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

Desconectado Albertroski

  • PIC10
  • *
  • Mensajes: 3
Comunicacion SPI con PIC y MCP2515
« en: 12 de Marzo de 2015, 15:12:24 »
Buenas,

Estoy diseñando un circuito en el que metemos una señal CAN a un PIC 18F2580, para convertirla a SPI y llevarla a un MCP2515 volver a convertirla a CAN colocando un MCP 2551 al final. El problema que tengo es que no consigo configurar el MCP 2515 en modo normal, de tal forma que no consigo que este me saque la señal que quiero (solamente me saca 5V en continua en la pata TX   :5] :5]).

Las funciones que utilizo para configurar el MCP 2515 son las siguientes:


int1 MCP2515_initCAN(int16 baudConst)
{
  int8 mode;
 
 
  output_bit(SLAVESELECT,LOW);
  spi_write(RESET); //Reset cmd
  output_bit(SLAVESELECT,HIGH);
  //Read mode and make sure it is config
  delay_ms(100);
  mode = readReg(CANSTAT) >> 5;
  if(mode != 0b100)
    return false;
   
  return(MCP2515_setCANBaud(baudConst));

}

int1 MCP2515_setCANBaud(int16 baudConst)
{
  int8 brp;
 
  //BRP<5:0> = 00h, so divisor (0+1)*2 for 125ns per quantum at 16MHz for 500K   
  //SJW<1:0> = 00h, Sync jump width = 1
  switch(baudConst)
  {
    case CAN_BAUD_500K: brp = 0; break;
    case CAN_BAUD_250K: brp = 1; break;
    case CAN_BAUD_125K: brp = 3; break;
    case CAN_BAUD_100K: brp = 4; break;
    default: return false;
  }
  output_bit(SLAVESELECT,LOW);
  spi_write(WRITE);
  spi_write(CNF1);
  spi_write(brp & 0b00111111);
  output_bit(SLAVESELECT,HIGH); 
 
  //PRSEG<2:0> = 0x01, 2 time quantum for prop
  //PHSEG<2:0> = 0x06, 7 time constants to PS1 sample
  //SAM = 0, just 1 sampling
  //BTLMODE = 1, PS2 determined by CNF3
  output_bit(SLAVESELECT,LOW);
  spi_write(WRITE);
  spi_write(CNF2);
  spi_write(0b10110001);
  output_bit(SLAVESELECT,HIGH);
 
  //PHSEG2<2:0> = 5 for 6 time constants after sample
  output_bit(SLAVESELECT,LOW);
  spi_write(WRITE);
  spi_write(CNF3);
  spi_write(0x05);
  output_bit(SLAVESELECT,HIGH);
 
  //SyncSeg + PropSeg + PS1 + PS2 = 1 + 2 + 7 + 6 = 16
 
  return true;
}

int1 MCP2515_setCANNormalMode(int1 singleShot)
{
  //REQOP2<2:0> = 000 for normal mode
  //ABAT = 0, do not abort pending transmission
  //OSM = 0, not one shot
  //CLKEN = 1, disable output clock
  //CLKPRE = 0b11, clk/8
 
  int8 settings;
  int8 mode;
 
  settings = 0b00000111 | (singleShot << 3);
 
  writeReg(CANCTRL,0x00);
  //Read mode and make sure it is normal
  mode = readReg(CANSTAT) >> 5;
  if(mode != 0)
    return false;
   
  return true;
 
}



Alguien me podría decir si lo estoy haciendo bien o si tengo que cambiar algo de código?

Muchas gracias de antemano y un saludo!!!!!! ((:-)) ((:-)) ((:-))