Attiny3216 ubicacion del SPI0 (SPI location)

Estoy usando un Attiny3216 para un proyecto en el cual necesito 6 adc, por lo que quiero cambiar la ubicacion de los pines SPI de PA1 - PA4 por PC0 - PC3.
1- un modulo can bus con la libreria: GitHub - sandeepmistry/arduino-CAN: An Arduino library for sending and receiving data using CAN bus.
2- al utilizarlo con los pines SPI de PA1 - PA4 todo funciona correctamente.
3- no se como configurar la multiplexacion del spi para poder usar SPI de PC0 - PC3

El codigo utilizado para el SPI por default es el siguiente.

#include <avr/io.h>
#include <util/delay.h>
#include <CAN.h>


// ----- CONSTANTES 
const int ledPin = 6;   // Pin del LED PB3
const int buttonPin = 7; // Pin del botón conectado a PB2
const uint8_t dac_values[] = {0x00, 0x20, 0x3F, 0x7F, 0xC8, 0xFF};

// ----- VALORES
float vfloat = 36.38;



void setup() {

    // Inicialización del SPI con los nuevos pines
    Serial.begin(115200);    
    while (!Serial);
    CAN.setPins(0, 13); // (CS, INT)
    Serial.println("CAN Sender");

    if (!CAN.begin(500E3)) {
    Serial.println("Starting CAN failed!");
    while (1);
    }
}

void loop () {

  // send packet: id is 11 bits, packet can contain up to 8 bytes of data
  Serial.print("Sending packet ... ");

  byte floatBytes[4];
  // Convertir el flotante a bytes
  memcpy(floatBytes, &vfloat, 4);
  
  CAN.beginPacket(0x12);
  // 4 Valores para corriente de una fase
  CAN.write(floatBytes[3]);
  CAN.write(floatBytes[2]);
  CAN.write(floatBytes[1]);
  CAN.write(floatBytes[0]);
  // 4 Valores para tension de una fase
  CAN.write(floatBytes[3]);
  CAN.write(floatBytes[2]);
  CAN.write(floatBytes[1]);
  CAN.write(floatBytes[0]);
      
  CAN.endPacket();

  Serial.println("done");
  
  delay(1000);
 }

La imagen de recepcion de lo que manda el attiny3216 a traves del can bus es:

recibido

Gracias.

He echado un vistazo por que no conocía la placa y he encontrado esto:

On all parts except the 14-pin parts, the SPI pins can be moved to an alternate location (note: On 8-pin parts, the SCK pin cannot be moved). This is configured using the SPI.swap() or SPI.pins() methods. Both of them achieve the same thing, but differ in how you specify the set of pins to use. This must be called before calling SPI.begin().

Es decir, para cambiar el puerto SPI de lugar tienes que llamar a la función swap() antes de realizar el begin(). Como es la libería can la que utiliza el puerto SPI deberás modificarla. En el fichero MCP2515.cpp encontrarás la implementación de la función begin y el SPI.begin(), coloca antes el SPI.swap.

La información la he obtenido del .md del megaTinyCore.

1 Like