Wiatm!!!
Mam problem z przesyłaniem kilki bajtów po SPI. Pierwszy Bajt jest wysyłany prawidłowo. Ale podczas wysyłania drugiego dzieją się dziwne rzeczy. Po powtórnej inicjalizacji SPI, wpisuje do SPDR kolejne dane do wysłania, w tym momenicie kasuje się mi flaga SPIF i tyransmisja się zawiesza. Co z tym jest nie tak??
Dodano po 28 [minuty]:
Już sobie z tym poradziłem:) Brakowało magicznej linijki:
Zamykam temat
Mam problem z przesyłaniem kilki bajtów po SPI. Pierwszy Bajt jest wysyłany prawidłowo. Ale podczas wysyłania drugiego dzieją się dziwne rzeczy. Po powtórnej inicjalizacji SPI, wpisuje do SPDR kolejne dane do wysłania, w tym momenicie kasuje się mi flaga SPIF i tyransmisja się zawiesza. Co z tym jest nie tak??
#include <avr/io.h>
#include <util/delay.h>
#define DD_MOSI PINB3
#define DD_SCK PINB5
#define DD_SS PINB2
#define SPI_DDR PORTB
volatile char vs_data = 0;
int cs = 0;
void SPI_Init(int cs);
void SPI_Send(volatile char vs_data);
char SPI_Read(volatile char vs_data);
int main(void)
{
DDRD = 0x03;
PORTD = 0x02;
vs_data = 0x53;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0xef;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x6e;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x62;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x00;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x00;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x00;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x00;
SPI_Init(0);
SPI_Send(vs_data);
/*_delay_ms(2000);
vs_data = 0x45;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x78;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x69;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x74;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x00;
SPI_Init(0);
SPI_Send(vs_data);
vs_data = 0x00;
SPI_Init(0);
SPI_Send(vs_data);
*/
return 0;
}
void SPI_Init(int cs)
{
//Set MOSI, SCK and SS output, all others input
SPI_DDR = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
//Enable SPI, Master, set clock rate fck/16
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
//Wybór urządzenia odbierającego dane
PORTD = (1<<cs);
}
void SPI_Send(volatile char vs_data)
{
/* Start transmission */
SPDR = vs_data;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
_delay_us(6);
PORTD = (0<<cs);
}
char SPI_Read(volatile char vs_data)
{
/* Start transmission */
SPDR = vs_data;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
return SPDR;
}
Dodano po 28 [minuty]:
Już sobie z tym poradziłem:) Brakowało magicznej linijki:
SPI_PORT = (1<<DD_MOSI)|(1<<DD_SCK)|(1<<DD_SS);
Zamykam temat