Передача данных через SPI ATmega8
Добавлено: Пт янв 07, 2022 22:15:54
Доброго времени суток. При написании курсовой возникла проблема. Мне нужно передать двумерный массив по шине SPI на матрицу из WS2812. Передача идет, но загорается только первый светодиод, причем даже не тем цветом каким должен. Код прикреплю тут, также архив с проектом авр и протеус тоже прикреплю. Код написан на си
Код: Выделить всё
#define F_CPU 16000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int picture_1[64][3] =
{
{0, 0, 0},//black
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{161, 141, 103},//koga
{0, 0, 0},//line 1
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{0, 0, 0},
{255, 0, 0},//red
{0, 0, 0},
{0, 0, 0},//line 2
{0, 0, 0},
{0, 0, 0},
{51, 23, 3},//haire
{51, 23, 3},
{0, 0, 0},
{255, 0, 0},
{0, 0, 255},
{51, 23, 3},//line 3
{255, 0, 0},
{255, 0, 0},
{161, 141, 103},
{161, 141, 103},
{51, 23, 3},
{251, 255, 0},//yellow
{0, 0, 255},//blue
{0, 0, 0,},//line 4
{255, 0, 0},
{255, 0, 0},
{51, 23, 3},
{161, 141, 103},
{161, 141, 103},
{0, 0, 255},
{0, 0, 255},
{0, 0, 0},//line 5
{255, 0, 0},
{255, 0, 0},
{0, 0, 0},
{51, 23, 3},
{161, 141, 103},
{0, 0, 255},
{0, 0, 255},
{0, 0, 0},//line 6
{255, 255, 255},//white
{255, 0, 0},
{161, 141, 103},
{51, 23, 3},
{161, 141, 103},
{251, 255, 0},
{0, 0, 255},
{51, 23, 3},//line 7
{0, 0, 0,},
{255, 0, 0},
{0, 0, 0},
{161, 141, 103},
{0, 0, 0},
{0, 0, 0},
{0, 0, 255},
{0, 0, 0}//line 8
};
void USART_init()
{
UBRRL = 31;
UCSRB = (1<<TXEN) | (1<<RXEN);
UCSRC = (1 << URSEL) | (3<<UCSZ0);
}
void SPI_init()
{
DDRD |= (1<<5);
PORTD |= (1<<5);
DDRB |= (1<<3) | (1<<5) | (1<<4) | (1<<1) | (1<<2);
PORTB |= (1<<0) | (1<<1) | (1<<2);
SPCR |= (1<<SPE) | (1<<MSTR) | (1<<CPHA);
SPSR |= (1<<SPI2X);
SPDR = 0;
}
void Write()
{
unsigned int element;
for (int i = 0; i < 64; i++)
{
for (int o = 0; o < 3; o++)
{
element = picture_1[i][o];
SPDR = element;
while(!(SPSR & (1<<SPIF)));
}
}
}
int main(void)
{
USART_init();
SPI_init();
while(1)
{
Write();
}
}