SPI без пауз между байтами, возможен ли?
Добавлено: Чт авг 26, 2021 16:13:29
Пытаюсь наладить общение между Attiny1607 и дисплеем SHARP LCD LS012B7DD01 по SPI.
Возможно ли сделать посылку байт по SPI без пауз?
Видимо мой дисплей только такую понимает. Сейчас не воспринимает первый бит в каждом байте.
Такой код должен закрасить верхнуюю половину экрана. а на самом деле рисует вот так.

На осциллографе тем временем:

Розовое - sclk
Желтое - байты (0x00)
Возможно ли сделать посылку байт по SPI без пауз?
Видимо мой дисплей только такую понимает. Сейчас не воспринимает первый бит в каждом байте.
Код: Выделить всё
unsigned char SPI0_exchangeData(unsigned char data)
{
SPI0.DATA = data;
while (!(SPI0.INTFLAGS & SPI_IF_bm)) /* waits until data is exchanged*/
{ ;}
return SPI0.DATA;
}
void SPI_Init()
{
SPI0.CTRLA = SPI_DORD_bm /* LSB is transmitted first */
| SPI_ENABLE_bm /* Enable module */
| SPI_CLK2X_bm /* double-speed on*/
| SPI_MASTER_bm /* SPI module in Master mode */
| SPI_PRESC_DIV64_gc; /* System Clock divided by 64 */ //надо f SCLK ~0.5МГц < 1Mhz 20Мгц/64*2 = 0,312МГц *2 = 0,625МГц
SPI0.CTRLB = SPI_MODE1_bm |SPI_SSD_bm |SPI_BUFEN_bm;
}
void drow_line(unsigned char numline, unsigned char line[23])
{
unsigned char i;
retdata = SPI0_exchangeData(numline);
for (i=0; i<23; i++)
SPI0_exchangeData(line[i]);
retdata = SPI0_exchangeData(0x00); //dummy data
retdata = SPI0_exchangeData(0x00);
}
void main()
{
unsigned char line[23], i;
...
SPI_Init();
while(1)
{
for (i=0;i<23;i++)
line [i] = 0x00; //Black;
// line [i] = 0xFF;// White;
SS_ON;//SS_OFF;
retdata = SPI0_exchangeData(UpdateMode);
for (i=1; i<=15; i++)
drow_line (i, line);
retdata = SPI0_exchangeData(0x00); //dummy data
WaitIniDisp = 1;
while(WaitIniDisp); //ждем 1мс
SS_OFF;//SS_ON;
}
}
На осциллографе тем временем:
Розовое - sclk
Желтое - байты (0x00)