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

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Сообщение Lilia »

Пытаюсь наладить общение между 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)
Реклама
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Lilia писал(а):Возможно ли сделать посылку байт по SPI без пауз?
На Attiny1607 бывшей компании Atmel... Нет))
На STM32 можно ))
https://habr.com/ru/post/276605/
:tea:
Реклама
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="roman.com",url="/forum/viewtopic.php?p=4081867#p4081867"]На Attiny1607 бывшей компании Atmel... Нет))[/uquote]
По идее можно, на новых AVR SPI с буферизацией. Дисплею работающему по SPI в любом случае должно быть без разница есть там пауза или нет.
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Сообщение Lilia »

у меня как раз буферизация включена, а вот дисплею не все равно(
Реклама
Эиком - электронные компоненты и радиодетали
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Сообщение Reflector »

[uquote="Lilia",url="/forum/viewtopic.php?p=4081877#p4081877"]у меня как раз буферизация включена, а вот дисплею не все равно([/uquote]
Мало включить буферизацию, нужно еще код написать так чтобы она вообще задействовалась, потому что многие отправляют байт и ждут окончания отправки, чтобы прочитать ответ, кроме того еще и по скорости нужно вписаться. С буферизацией твой SPI0_exchangeData() сначала должен проверять есть в буфере место и только потом отправлять байт и никаких ожиданий в конце, потому что пока идет передача нужно успеть в буфер новые данные добавить.
Реклама
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Reflector писал(а):на новых AVR SPI с буферизацией.
Точно))
В старых AVR есть только буфер SPI на приём...
Screenshot_1.jpg
(56.72 КБ) 107 скачиваний
В новых AVR есть буфер SPI и на передачу...
Screenshot_2.jpg
(62.47 КБ) 106 скачиваний
Хм... :roll:
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

[uquote="Lilia",url="/forum/viewtopic.php?p=4081843#p4081843"]Сейчас не воспринимает первый бит в каждом байте.[/uquote]
Не верно выставлена фаза тактового сигнала.

Добавлено after 2 minutes 44 seconds:
[uquote="Lilia",url="/forum/viewtopic.php?p=4081877#p4081877"]а вот дисплею не все равно([/uquote]
дисплею всё равно - он тактируется хостом. И уж точно не отмеряет паузы между посылками.
Вы даже можете посередине передачи пакета отвлечься на что-то, а затем вернуться и продолжить передачу пакета. В этом и состоит вся прелесть синхронных интерфейсов.
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Сообщение Lilia »

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

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

Похоже действительно дело было в режиме SPI, хотя я много раз пробовала до этого менять его. Просто magic :shock: :)) ...
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

фото в студию))
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Сообщение Lilia »

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

Изображение
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

Интересно вот это фото - SPI без паузы.
Screenshot_1.jpg
(11.89 КБ) 102 скачивания
Есть сомнения что SPI будет работать без паузы.
Дело в том что в SPI один сдвиговый регистр который работает на передачу и приём.
Как пишут в даташите... перед отправкой следующего байта по SPI сначала считается значение из сдвигового регистра в приёмный буфер и только потом записывается новое значение из передающего буфера в сдвиговый регистр.
Выходи что чтение и запись сдвигового регистра происходит в один такт процессора ? это вызывает сомнения))
:tea:
Хотя в нормальном режиме SPI работает на 1/4 тактовой частоте.
А в ускоренном режиме SPI работает на 1/2 тактовой частоте.
Если так, то возможно нужен один такт на чтение сдвигового регистра и один такт на запись сдвигово регистра.
Но это не точно))
:tea:
Вот так должна выглядеть работа SPI без паузы.
Screenshot_2.jpg
(14.57 КБ) 111 скачиваний
Это SCK.
:tea:
Родился
Сообщения: 19
Зарегистрирован: Чт янв 14, 2021 10:25:57

Сообщение Lilia »

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

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

Изображение
Друг Кота
Сообщения: 9175
Зарегистрирован: Вт мар 13, 2012 12:16:13
Откуда: .ru

Сообщение roman.com »

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

А у меня ATmega128 как не старайся работает с паузой. Даже если писать на Ассемблере с точностью до такта))
Screenshot_1_cr.jpg
(9.53 КБ) 102 скачивания
У меня по SPI рисует кучу экранов)).
Screenshot_1.jpg
(67.56 КБ) 106 скачиваний
А TFT Nokia 6300 (контроллер MC2PA8201) 320x240 работает в режиме Parallel.
Там проблем нет))
1.jpg
(83.74 КБ) 91 скачивание
Итого.
Мы выяснили что в новых AVR блок SPI может работать без пауз.
Всем спасибо.
Теперь буду знать))
:tea:
Ответить

Вернуться в «AVR»