STM32, не удается портирование проекта с AVR

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Какой чип?
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

Дисплей LPH9157-2, зеленый текстолит. Вообщем описался я, это марка дисплея. Контроллер который там стоит не известен, но похож на ILI9163, команды совпадают. http://we.easyelectronics.ru/lleeloo/lc ... denie.html
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Я о STM32.
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

у меня STM32F103C8.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Сразу предупреждаю - код с дерганьем CS после каждой транзакции .
Пины SPI настраиваем как AF , CS выход с паш-пул.
Далее можно настроить и на 16 битные транзакции.
Да и вообще потоком без дерганья CS , но это если контроллер дисплея позволит.

Код: Выделить всё

void Spi_init(void) //
  {
    
    
    
        RCC->APB2ENR |= RCC_APB2ENR_SPI1EN; // 
        SPI1->CR1     = 0x0000;             //
        SPI1->CR2     = 0x0000;             //
        
     
        SPI1->CR1    |= SPI_CR1_MSTR| SPI_CR1_BR_0|SPI_CR1_SSI | SPI_CR1_SSM| SPI_CR1_SPE; 

  }

    uint8_t Spi_send (uint8_t data)
      { 
     
        SPI1->DR = data;                       
        while (!(SPI1->SR & SPI_SR_RXNE));    
        
        return (SPI1->DR);		        
      }

При переброске массива юзать сие

Код: Выделить всё

	for (line=0; line<n; line++)
{
			
	 while(!(SPI1->SR & SPI_SR_TXE)); 
   SPI1->DR =data;	
		
  }
	while((SPI1->SR & SPI_SR_BSY)); 


Реклама
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

понятно спасибо за инфу. А под дерганьем CS имеется ввиду вот это?

Код: Выделить всё

 
//RS=0; //передаем команду
//RS=1; //передаем данные
CS=0;
Spi_send (uint8_t data);
CS=1;
 
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Угу . Но не обязательно каждую транзакцию .
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

понятно, вообщем вскоре отпишусь что получилось.
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

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

Код: Выделить всё

 
//#define LCD_CS 		PORTB.0 //Выбор чипа
//#define LCD_RESET 	PORTB.1 //Сброс
//#define LCD_RS 		PORTB.12//CD - тип передаваемых данных


#define LCD_CS0 		 GPIOB->BRR  =  1<<0;
#define LCD_RESET0             GPIOB->BRR  =  1<<1;
#define LCD_RS0 		 GPIOB->BRR  =  1<<12;


#define LCD_CS1 		 GPIOB->BSRR  =  1<<0;
#define LCD_RESET1 	     GPIOB->BSRR  =  1<<1;
#define LCD_RS1 		 GPIOB->BSRR  =  1<<12;


//*************************************************************
char RS_old;

uint8_t Send_to_lcd (uint8_t data)
       {

         SPI1->DR = data;
         while (!(SPI1->SR & SPI_SR_RXNE));
         return (SPI1->DR);
       }


     // Посылка данных дисплею (16 бит режим)
     void send_data(unsigned long int dat)
     {
      LCD_CS0;
      LCD_RS0;
      Send_to_lcd((dat >> 8));
      Send_to_lcd(dat);
      LCD_RS1;
      delay_ms(1);
      LCD_RS1;
     }

     // Посылка данных дисплею (8 бит режим)
     void send_data8(int dat)
     {
    LCD_CS0;
    LCD_RS0;
    Send_to_lcd(dat);
    LCD_RS1;
    delay_ms(1);
    LCD_CS1;
     }

   // Посылка комманды дисплею
   void send_cmd(unsigned long int cmd)
    {
    LCD_CS0;
    LCD_RS1;
    Send_to_lcd((cmd >> 8));
    Send_to_lcd(cmd);
    LCD_RS0;
    delay_ms(1);
    LCD_CS1;
    }

 //=========
 //                        ИНИЦИАЛИЗАЦИЯ
 //=========
     void LCD_init(void)
     {
      LCD_RESET0;
      delay_ms(500);
      LCD_RESET1;

      delay_ms(500);
      send_cmd(0x01);

      send_cmd(0x36);
      send_data8(0x00);

      send_cmd(0x11);

      delay_ms(20);

      send_cmd(0x3a);
      #ifdef _8_BIT_COLOR
      send_data8(0x02);
      #else
      send_data8(0x05);
      #endif
      delay_ms(20);
      send_cmd(0x29);
     }

     void SetArea(char x1, char x2, char y1, char y2)
     {
       //задаем область по X
      send_cmd(0x2A);
         //начальная
      send_data8(x1);
        //конечная
      send_data8(x2);
        //задаем область по Y
      send_cmd(0x2B);
          //начальная
      send_data8(y1);
          //конечная
      send_data8(y2);
        //отправляем команду на начало записи в память и начинаем посылать данные
      send_cmd(0x2C);
     }

     //=========
     //                          Рисуем точку
     //=========
     void Put_Pixel (char x, char y, unsigned int color)
     {
      signed char i;
      SetArea( x, x, y, y );
      LCD_RS1;
      #ifdef _8_BIT_COLOR	//(8-ми битовая цветовая палитра (256 цветов))

      send_data8(color);
      #else			        //(16-ти битовая цветовая палитра (65536 цветов))
      send_data(color);
      #endif
     }







 //int random ( int x){return rand() %x;}
 //int randomv ( int v){return rand() %v;}


int main(void)
{
 //spi 1
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
	        SPI1->CR1     = 0x0000;
	        SPI1->CR2     = 0x0000;

SPI1->CR1    |= SPI_CR1_MSTR| SPI_CR1_BR_0|SPI_CR1_SSI | SPI_CR1_SSM| SPI_CR1_SPE;

//timer
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
	 TIM2->PSC     = 8000-1;
	 TIM2->CR1     = TIM_CR1_OPM;



GPIO_InitTypeDef  GPIO_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

	 	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_14;
	 	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOC, &GPIO_InitStructure);


RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //включить тактирование порта

   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //включить тактирование порта

        GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_12;
	 	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;
	 	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);




     LCD_init();
     GPIOC->BSRR  =  1<<14; // proverka
     while(1)
     {
    	 Put_Pixel (34, 34, 0xF800);
     }
}
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

6Н23П писал(а): а SPI молчит...
Чем проверяется ? И как реализовано сие -delay_ms ?
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

проверяется тестером, тупо меряю напругу на ногах спи.


задержка вот как запилена
Спойлер

Код: Выделить всё

 
//timer
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;
	 TIM2->PSC     = 8000-1;
	 TIM2->CR1     = TIM_CR1_OPM;

void delay_ms(uint16_t value)
{
  TIM2->ARR = value;                  
  TIM2->CNT = 0;
  TIM2->CR1 = TIM_CR1_CEN;	      
  while((TIM2->SR & TIM_SR_UIF)==0){} 
  TIM2->SR &= ~TIM_SR_UIF;	      
}

Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

6Н23П писал(а):проверяется тестером, тупо меряю напругу на ногах спи.
И что ожидается там увидеть на 12МГц ? :)))

Это пользуй - должен обязательно быть подключен стартап и system_stm32f10x.c

Код: Выделить всё

//========================
void SysTick_Handler(void) {
	if (TimingDelay) {
		TimingDelay--;
     
	}
}

//========================
void Delay_mS(uint32_t nTime) {

	TimingDelay = nTime;
	while (TimingDelay)
		;
}
В main инициализируем :

Код: Выделить всё

SysTick_Config(SystemCoreClock / 1000);
Пользуем:

Код: Выделить всё

Delay_mS(10); 
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

О спасибо. А как вообще узнать работает ли SPI?
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1433
Зарегистрирован: Вс дек 02, 2012 03:13:48
Откуда: Калининград

Сообщение balmer »

Самый надежный способ - посмотреть осциллографом. Включаешь "Запуск по фронту сигнала" и смотришь.
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Или логический анализатор - на китайских аукционах их по 300р. как грязи.
И собственно анализатор и осциллограф крайне желательно иметь в своей лаборатории.
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

Все заработало !!! Оказывается я CLK не туда подключал, перепутал с MISO... И еще который код тут приведен он с ошибками,недавно обнаружил их.. Кароче в итоге инициализация проходит, на экране мусор появился.Щас буду остальные функции переписывать.


По поводу осциллографа то не помешал бы, но нету... Хотя есть мысля собрать чтото типа приставки к компу или просто на контроллере с АЦП и экраном...
Спасибо за помощь!!!
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

логический анализатор это типа вот такого ? http://ru.aliexpress.com/item/Free-Ship ... 39465.html
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

Он и есть.
Для своих поделок на МК есть бюджетный вариант осциллографа - DSO QUAD .
2 канала аналоговых ,два цифровых , встроенный генератор . Цена ~ 4800р. с доставкой.

Есть так же.
Логический анализатор OLS -16+16 каналов до 200 Мгц . Цена 50$ с доставкой .
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

А как можно увеличить скорость SPI, а то скорость отрисовки медленнее чем на AVR. Пробовал менять коэффициент деления в регистре, эффект нулевой. Значит потом пробовал изменять частоту тактирования камня, ставил 72МГц, эффект тоже нулевой. Может быть кто знает как скорость повысить? Если сравнивать с програмным то у програмного скорость была оочень высокой, там отрисовка была моментальной....
Друг Кота
Аватара пользователя
Сообщения: 3604
Зарегистрирован: Пн июл 28, 2008 22:12:01

Сообщение dosikus »

dosikus писал(а):

При переброске массива юзать сие

Код: Выделить всё

	for (line=0; line<n; line++)
{
			
	 while(!(SPI1->SR & SPI_SR_TXE)); 
   SPI1->DR =data;	
		
  }
	while((SPI1->SR & SPI_SR_BSY)); 


Я выше кому и зачем это писал ?
Далее можно юзать 16битные посылки.
Ну и поднять скорость SPI :


Код: Выделить всё

  SPI1->CR1    |= SPI_CR1_MSTR| SPI_CR1_SSI | SPI_CR1_SSM| SPI_CR1_SPE; 
И не забудь выложить код .
Ответить

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