Обсуждаем контроллеры компании Atmel.
Ответить

SPI без пауз между байтами, возможен ли?

Чт авг 26, 2021 16:13:29

Пытаюсь наладить общение между Attiny1607 и дисплеем SHARP LCD LS012B7DD01 по SPI.

Возможно ли сделать посылку байт по 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)

Re: SPI без пауз между байтами, возможен ли?

Чт авг 26, 2021 17:23:45

Lilia писал(а):Возможно ли сделать посылку байт по SPI без пауз?

На Attiny1607 бывшей компании Atmel... Нет))
На STM32 можно ))
https://habr.com/ru/post/276605/
:tea:

Re: SPI без пауз между байтами, возможен ли?

Чт авг 26, 2021 17:28:06

На Attiny1607 бывшей компании Atmel... Нет))

По идее можно, на новых AVR SPI с буферизацией. Дисплею работающему по SPI в любом случае должно быть без разница есть там пауза или нет.

Re: SPI без пауз между байтами, возможен ли?

Чт авг 26, 2021 17:32:12

у меня как раз буферизация включена, а вот дисплею не все равно(

Re: SPI без пауз между байтами, возможен ли?

Чт авг 26, 2021 17:36:23

у меня как раз буферизация включена, а вот дисплею не все равно(

Мало включить буферизацию, нужно еще код написать так чтобы она вообще задействовалась, потому что многие отправляют байт и ждут окончания отправки, чтобы прочитать ответ, кроме того еще и по скорости нужно вписаться. С буферизацией твой SPI0_exchangeData() сначала должен проверять есть в буфере место и только потом отправлять байт и никаких ожиданий в конце, потому что пока идет передача нужно успеть в буфер новые данные добавить.

Re: SPI без пауз между байтами, возможен ли?

Чт авг 26, 2021 18:27:31

Reflector писал(а):на новых AVR SPI с буферизацией.

Точно))
В старых AVR есть только буфер SPI на приём...
Screenshot_1.jpg
(56.72 KiB) Скачиваний: 79

В новых AVR есть буфер SPI и на передачу...
Screenshot_2.jpg
(62.47 KiB) Скачиваний: 80

Хм... :roll:

Re: SPI без пауз между байтами, возможен ли?

Чт авг 26, 2021 19:04:46

Сейчас не воспринимает первый бит в каждом байте.

Не верно выставлена фаза тактового сигнала.

Добавлено after 2 minutes 44 seconds:
а вот дисплею не все равно(

дисплею всё равно - он тактируется хостом. И уж точно не отмеряет паузы между посылками.
Вы даже можете посередине передачи пакета отвлечься на что-то, а затем вернуться и продолжить передачу пакета. В этом и состоит вся прелесть синхронных интерфейсов.

Re: SPI без пауз между байтами, возможен ли?

Пт авг 27, 2021 14:21:53

Всем спасибо, проблема решилась!

Если убрать ожидающий while, действительно работает без пауз. Но проблема оказалась не в этом.

Похоже действительно дело было в режиме SPI, хотя я много раз пробовала до этого менять его. Просто magic :shock: :)) ...

Re: SPI без пауз между байтами, возможен ли?

Пт авг 27, 2021 16:34:20

фото в студию))

Re: SPI без пауз между байтами, возможен ли?

Пт авг 27, 2021 17:31:13

Фото дисплея?
Вот :)

Изображение

Re: SPI без пауз между байтами, возможен ли?

Пт авг 27, 2021 17:52:03

Интересно вот это фото - SPI без паузы.
Screenshot_1.jpg
(11.89 KiB) Скачиваний: 74

Есть сомнения что SPI будет работать без паузы.
Дело в том что в SPI один сдвиговый регистр который работает на передачу и приём.
Как пишут в даташите... перед отправкой следующего байта по SPI сначала считается значение из сдвигового регистра в приёмный буфер и только потом записывается новое значение из передающего буфера в сдвиговый регистр.
Выходи что чтение и запись сдвигового регистра происходит в один такт процессора ? это вызывает сомнения))
:tea:
Хотя в нормальном режиме SPI работает на 1/4 тактовой частоте.
А в ускоренном режиме SPI работает на 1/2 тактовой частоте.
Если так, то возможно нужен один такт на чтение сдвигового регистра и один такт на запись сдвигово регистра.
Но это не точно))
:tea:
Вот так должна выглядеть работа SPI без паузы.
Screenshot_2.jpg
(14.57 KiB) Скачиваний: 75

Это SCK.
:tea:

Re: SPI без пауз между байтами, возможен ли?

Пт авг 27, 2021 18:03:11

Ну дисплей у меня без пауз рисует только одну верхнюю строчку.

А отправка без пауз работает

Изображение

Re: SPI без пауз между байтами, возможен ли?

Пт авг 27, 2021 19:56:17

Ну вот. Другое дело))
Теперь видно что SPI работает без пауз.

А у меня ATmega128 как не старайся работает с паузой. Даже если писать на Ассемблере с точностью до такта))
Screenshot_1_cr.jpg
(9.53 KiB) Скачиваний: 73

У меня по SPI рисует кучу экранов)).
Screenshot_1.jpg
(67.56 KiB) Скачиваний: 73

А TFT Nokia 6300 (контроллер MC2PA8201) 320x240 работает в режиме Parallel.
Там проблем нет))
1.jpg
(83.74 KiB) Скачиваний: 64


Итого.
Мы выяснили что в новых AVR блок SPI может работать без пауз.
Всем спасибо.
Теперь буду знать))
:tea:
Ответить