Witam!
Chciałem połączyć poprzez SPI ATmegę8 i AtMegę16 gdzie 8 jest masterem a 16 slavem. Jednak 16 nie wykazuję, żeby dostawała jakiekolwiek dane. Poniżej zamieszczam kod. Procki mają połączone ze sobą MISO, MOSI, SCK i SS.
Master[ATMega8]:
Slave[ATMega16]
Chciałem połączyć poprzez SPI ATmegę8 i AtMegę16 gdzie 8 jest masterem a 16 slavem. Jednak 16 nie wykazuję, żeby dostawała jakiekolwiek dane. Poniżej zamieszczam kod. Procki mają połączone ze sobą MISO, MOSI, SCK i SS.
Master[ATMega8]:
#define F_CPU 14318000ul
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
void SPI_MasterInit(void)
{
/* Set MOSI, SCK and SS output, all others input */
DDRB = (1<<DDB3)|(1<<DDB5)|(1<<DDB2);
/* Enable SPI, Master, set clock rate fck/16 */
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}
void main()
{
SPI_MasterInit();
while(1)
{
_delay_ms(1000);
PORTB &= ~(1<<PB2);
SPI_MasterTransmit('Y');
PORTB |= (1<<PB2);
}
}
Slave[ATMega16]
#define F_CPU 1000000ul
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <util/delay.h>
#include <string.h>
#include <avr/interrupt.h>
#include "lcd.h"
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDRB = (1<<DDB6);
/* Enable SPI */
SPCR = (1<<SPE)| (1<<SPIE);
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
PORTC = 0x01;
while(!(SPSR & (1<<SPIF)));
/* Return data register */
PORTC = 0x00;
return SPDR;
}
int main(void){
DDRA = 0xff;
DDRD = 0X07;
PORTA = 0x00;
DDRC = 0x01;
PORTC = 0x00;
_delay_ms(200);
sei();
initLCD();
clearLCD();
SPI_SlaveInit();
while(1)
{
}
return 0;
}
ISR(SPI_STC_vect)
{
putLCD(SPI_SlaveReceive());
}