ATtiny2313 SPI por software.

Hola, tratando de encontrar información sobre como implementar el bus SPI en micros AVR encontré mucha información interesante y muy documentada con librerías dedicadas y demás. Ahora las implementaciones que he encontrado son solo para micros con módulo SPI integrado, mirando la hoja de datos del ATtiny2313 me he encontrado que no tiene módulo SPI dedicado sino que lo implementa en la USI (Universal Serial Interface).

Alguien del foro ha implementado el bus SPI por software o tiene alguna nota de aplicación de como podría realizarse ??

Estoy programando en AVR GCC :rolleyes:

Saludos (y)
 
Yo lo implementé una vez por SW puro y duro, de manera muy sencilla, pero he perdido el código. Como máster solo, ojo, que es más sencillo.

Hay notas de aplicación (en inglés, claro) de Atmel que explican como usar el USI para hacer SPI. Creo recordar que no era muy difícil.
 
Ya estoy en proceso de investigación, ahora otro drama que se me ha apararecido es el tema de que el bus SPI comparte el bus de datos con ISP en la programación y hay que aislar el ISP de los demás dispositivos conectados por SPI....es todo un tema pero de a poco lo estoy solucionando.
 
Creo recordar que el truco para aislarlo era poner directamente el SPI a los pines del ISP, y los periféricos SPI conectarlos con resistencias de 100 ohmios o similares a las líneas de MISO, MOSI y SCK.
 
Según el valor de las resistencias la velocidad de comunicación varía. Resistencias más grandes significan velocidad de transmisión más pequeña.

Aún así, si se hace por SW, la velocidad real conseguida es bastante pequeña, del orden de 1Mbps o algo más, dependiendo del reloj del sistema.
 
Bueno después de unos días pude hacer andar mi potenciómetro digital MCP41010 con el ATtiny2313 mediante SPI.
Para los que les interese el código se los dejo acá:
Código:
/***************************************************************** 
   Fecha: Setiembre del 2010.
   Programa: Setea un valor en un potenciómetro digital MCP41010.
   Cristal:  4Mhz.
   Programador: PK2-ISP.
 *****************************************************************/
#include <avr/io.h>     // Definiciones de hardware.
#include <util/delay.h>

// Declaramos funciones utilizadas.
void    spi_init(uint8_t velocidad);  // Inicia el bus SPI y setea velocidad de trabajo. 
uint8_t spi_write(uint8_t dato);      // Escribe un dato en el bus SPI.

// Definimos los pines para la comunicación SPI.
#define SDI PINB6  // Pin B5 como MOSI.
#define SDO PINB5  // Pin B4 como MISO.
#define SCK PINB7  // Pin B7 como SCK.

void spi_init(uint8_t velocidad) {

 if (velocidad==1) { // Si velocidad = 1, la velocidad del bus es máxima.
        PORTB |= (1<<SDO)|(1<<PINB4);       
        DDRB = (1<<SCK)|(1<<SDI)|(1<<PINB4);
        USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK);
        PORTB &= ~(1<<PINB4);    // Habilitamos esclavo.
    } else { // Si velocidad es 0....
        PORTB |= (1<<PINB4);     // Deshabilitamos esclavo.
        DDRB &= ~((1<<SCK)|(1<<SDO)|(1<<SDI)|(1<<PINB4));
        USICR = 0;
    }
}

uint8_t spi_write(uint8_t dato) {

 USIDR = dato; // Carga el dato a enviar.
    USISR = (1<<USIOIF);
    do {
        USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC); // Configuramos la USI.
    } while ((USISR & (1<<USIOIF)) == 0); // En caso de que termine de enviar el dato, retorna el valor
                                           // De USIDR.
    return USIDR;    
}


int main(void) {

 DDRB = 0x07; // PB0--PB3 como salidas.
 PORTB = 0x00; // Limpiamos el puerto B.

  
 
    spi_init(1);     // Iniciamos las comunicaciones con el esclavo MCP41010.
    spi_write(0x11); // Cargamos byte de comando.
      
     spi_write(0x45); // Seteamos valor del potenciómetro digital.
     
    _delay_ms(3000);
     spi_init(0); // Apagamos el potenciometro.
   
   }
 
bueno amigos, soy nuevo en avr, en la escuela tome la materia de microcontroladores con avr, vamos a trabar con atmega32. la cuestión es tengo un display serial que funciona con el puerto spi, pero el cargador de micro es un cargador por isp. puedo usar el puerto para programar y para el display?. y otra cosa yo uso bascoavr para los programas. que otros copiladores puedo usar?. y cual es el compilador en c que usan(avr)? gracias por todo.
 
Si se puede de esta forma:
AVR-SPI.jpg


y otra cosa yo uso bascoavr para los programas. que otros copiladores puedo usar?

Depende del lenguaje de programación que quieras usar..

y cual es el compilador en c que usan(avr)? gracias por todo.

Todo el mundo usa para sus proyectos AVR - GCC (yo lo uso). Pero si quieres algo con más facilidades...podés usar Codevision AVR.
 
Atrás
Arriba