SPI.h para ATTiny

5

¿Existe alguna implementación diferente de la biblioteca SPI de Arduino que pueda usarse para la serie ATTinyX5? Supongo, en parte porque creo que el SPI de ATTiny se proporciona a través de USI ... Obtuve la configuración del entorno usando las instrucciones aquí pero cuando intento compilar cualquier cosa con SPI.h incluido, solo se producen todo tipo de errores:

C:\Program Files (x86)\arduino\libraries\SPI/SPI.h: In static member function 'static byte SPIClass::transfer(byte)':
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h:56: error: 'SPDR' was not declared in this scope
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h:57: error: 'SPSR' was not declared in this scope
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h:57: error: 'SPIF' was not declared in this scope
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::attachInterrupt()':
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h:63: error: 'SPCR' was not declared in this scope
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h:63: error: 'SPIE' was not declared in this scope
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h: In static member function 'static void SPIClass::detachInterrupt()':
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h:67: error: 'SPCR' was not declared in this scope
C:\Program Files (x86)\arduino\libraries\SPI/SPI.h:67: error: 'SPIE' was not declared in this scope

En la misma línea, ¿hay algo que deba hacerse para codificar que use hardware SPI para que funcione en ATTiny? Pude hacerlo funcionar con una implementación de bit banging pero SPI de hardware sería bueno.

    
pregunta Adam Haile

2 respuestas

2

No dijo si está utilizando el tinyx5 como maestro o esclavo ... si es un esclavo, entonces sugiero que conecte la línea de selección de esclavos a una interrupción de hardware para activar la operación de lectura y escritura basada en la entrada de reloj. Si el tinyx5 se utilizará como maestro, es muy fácil utilizar una solución de software. No uso Arduino en absoluto, pero estoy muy familiarizado con los dispositivos AVR.

Cuando el USI está involucrado, puede complicarse un poco. De manera realista, puede ser más efectivo usar una solución bit-bang que usar el USI como SPI para la mayoría de las necesidades. Los errores que usted ve surgen porque los registros SPI descritos en el archivo de encabezado no tienen el mismo nombre en todos los dispositivos (si es que existen). En el caso del dispositivo ATtiny, no existen, ya que utiliza el módulo USI para actuar como SPI. Podría intentar que la USI funcione como SPI, pero recomendaría probar esta solución de software simple primero para ver si se ajusta a sus necesidades. Todas las variables de capital deben definirse en su proyecto como los datos SPI y los pines de reloj apropiados. Por ejemplo:

#define _USI_SPI_PORT PORTB
#define _U_DO         (1<<PB0)  // Or _BV(PB0)

Haga esto para DO (MOSI), DI (MISO) y SCK. Luego use esta función para transferir un byte:

unsigned char SPI_transferByte(unsigned char data)
{
  unsigned char bit = 0;

  _U_SPI_PORT &= ~_U_SS                 // Need to manually Lower the SS line first

  for(bit = 0; bit < 8; bit++)          // Loop through 8 bits
  {  
    if(data & 0x80) _U_SPI_PORT |= _U_DO;   // If bit(7) of "data" is high
    else _U_SPI_PORT &= ~_U_DO;          // if bit(7) of "data" is low
    _U_SPI_PORT |= _U_SCK;                  // Serial Clock Rising Edge 
    data <<= 1;                             // Shift "data" to the left by one bit
    if(_U_SPI_PIN & _U_DI) data |= 0x01;    // If bit of slave data is high
    else data &= ~0x01;                  // if bit of slave data is low
    _U_SPI_PORT &= ~_U_SCK;              // Serial Clock Falling Edge
  }
  _U_SPI_PORT |= _U_SS                 // Need to manually Raise the SS line Last

  return data;                      // Returns shifted data in value
}

Se podría crear otra función para llamar repetidamente a esta función para transferir paquetes de datos más grandes. Solo en el caso de la transferencia de datos grandes es útil usar el módulo de hardware, ya que podría ser accionado por interrupciones, dejando el programa principal libre para hacer otras cosas mientras se transfieren los datos. Pero si solo se transfieren unos pocos bytes a la vez, este método de software es muy efectivo.

    
respondido por el Kurt E. Clothier
0

Por favor, eche un vistazo a Atmel App Note AVR319 y el software que lo acompaña.

Debería poder usar esos materiales para realizar los cambios necesarios en la biblioteca Arduino.

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas