CooCox + STM32 + дисплей от S65 = не запускается

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

CooCox + STM32 + дисплей от S65 = не запускается

Сообщение mr_smit »

Приветствую всех. Прикупил я тут себе плату STM32Discavery. Поморгал светодиодами. Решил подключить дисплей от S65 (LS020). Дабы убедиться что дисплей целый подключил его к ATMega8. Дисплей работает. Алгоритм отработан. Засел за учебники...

Итак:

RS -> PA1
RESET -> PA2
CS -> PA3
CLK -> PA5
DATA -> PA7

питание к 3V3 и GND платы

Включил тактирование нужных пинов, настроил и включил SPI. Запускаю инициализацию дисплея, а он молчит... Возникло у меня 2 вопроса:

1. Нужно ли настраивать пины аппаратного SPI дополнительно? Или при включении SPI они инициализируются правильным образом?
2. Указал в настройке SPI_DataSize_16b и заталкиваю в порт на передачу двухбайтное число. Правильно ли это? Или по одному байту надо слать?

Ну и сам код. В прикрепленном архиве проект для CooCox.

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

#include <stm32f10x.h>
#include <stm32f10x_conf.h>

#include <stm32f10x_gpio.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_spi.h>

#define RS_Hi (GPIOA->ODR |= GPIO_ODR_ODR1);        // RS = 1
#define RS_Low (GPIOA->ODR &= ~GPIO_ODR_ODR1);      // RS = 0
#define RESET_Hi (GPIOA->ODR |= GPIO_ODR_ODR2);     // RESET = 1
#define RESET_Low (GPIOA->ODR &= ~GPIO_ODR_ODR2);   // RESET = 0
#define CS_Hi (GPIOA->ODR |= GPIO_ODR_ODR3);        // CS = 1
#define CS_Low (GPIOA->ODR &= ~GPIO_ODR_ODR3);      // CS = 0

uint16_t LCD_Init_1[12] = {0xFDFD,0xFDFD,0xEF00,0xEE04,0x1B04,0xFEFE,0xFEFE,0xEF90,0x4A04,0x7F3F,
      0xEE04,0x4306};

uint16_t LCD_Init_2[25] = {0xEF90,0x0983,0x0800,0x0BAF,0x0A00,0x0500,0x0600,0x0700,0xEF00,0xEE0C,
      0xEF90,0x0080,0xEFB0,0x4902,0xEF00,0x7F01,0xE181,0xE202,0xE276,0xE183,0x8001,0xEF90,0x0504,0x0600,0x0700};

void delay_ms(uint32_t ms) {
   volatile uint32_t nCount;
   RCC_ClocksTypeDef RCC_Clocks;
   RCC_GetClocksFreq (&RCC_Clocks);
    nCount = (RCC_Clocks.HCLK_Frequency/10000)*ms;
    for (; nCount != 0; nCount--);
}

void SPI_Send (uint16_t SPI_Data) {
   while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
   SPI_I2S_SendData(SPI1,SPI_Data);
}

void LCD_CMD(uint16_t data) {
  CS_Low;
  RS_Hi;
  SPI_Send(data);
  CS_Hi;
}

void LCD_DATA(uint16_t data) {
  CS_Low;
  RS_Low;
  SPI_Send(data);
  CS_Hi;
}

void LCD_init(void) {
  int i;
  RESET_Low;
  delay_ms(20);
  RESET_Hi;

  for (i=0;i<12;i++) {
     LCD_CMD(LCD_Init_1[i]);
  }

  delay_ms(5);

  for (i=0;i<25;i++) {
       LCD_CMD(LCD_Init_2[i]);
    }
}

int main(void) {

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 , ENABLE);

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_5 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init( GPIOA , &GPIO_InitStructure);

    SPI_I2S_DeInit(SPI1);
    SPI_InitTypeDef SPI_InitStructure;
    SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_Init(SPI1,&SPI_InitStructure);
    SPI_I2S_ClearFlag(SPI1,SPI_I2S_FLAG_TXE);
    SPI_Cmd(SPI1, ENABLE);

    LCD_init();

    while (1) {

    }

    return 0;
}


S65_Display_.rar
(146.32 КБ) 370 скачиваний
Нельзя всё знать, достаточно понимать.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение HHIMERA »

Проверьте функцию задержки... ИМХО там 1000, а не 10000 должно быть...
Дальше...
void SPI_Send (uint16_t SPI_Data) {
while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1,SPI_Data);
}

Должно быть...
void SPI_Send (uint16_t SPI_Data) {
// while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1,SPI_Data);

__NOP(); __NOP();
while(SPI1->SR & SPI_SR_BSY); // Wait for SPI Tx Buffer Empty
}


или...

void SPI_Send (uint16_t SPI_Data) {
// while (SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE) == RESET);
SPI_I2S_SendData(SPI1,SPI_Data);

while((SPI1->SR & SPI_SR_RXNE) == RESET);
SPI1->DR;
}

Потому что у вас после
SPI_Send(data);
идёт

CS_Hi;
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение mr_smit »

HHIMERA писал(а):Проверьте функцию задержки... ИМХО там 1000, а не 10000 должно быть...

Примерно посередине статьи:
http://we.easyelectronics.ru/GYUR22/prostoy-start-stm32-taktirovanie-i-zaderzhka.html

HHIMERA писал(а):Потому что у вас после
SPI_Send(data);
идёт

CS_Hi;

Спасибо, не доглядел. Но всё равно не работает
Нельзя всё знать, достаточно понимать.
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение mr_smit »

Достал осциллограф. Проверил функцию delay_ms(). Дает четкие заданные интервалы (вывел меандр на один из пинов). Так же посмотрел CLK и MOSI. При старте на них тишина.... Чего то я, наверное, не включил... :(
Нельзя всё знать, достаточно понимать.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение HHIMERA »

Похоже...

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

  /* Configure SPI1 pins: SCK and MOSI ----------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение mr_smit »

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

  /*----- Configure SPI1 pins: SCK and MOSI -----*/
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

Заработало. Спасибо HHIMERA!!!

И ещё.

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

SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;

У меня сейчас частота SPI я так понимаю 12 МГц. Правильно? Процессор работает на 24 МГц

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

#define SYSCLK_FREQ_24MHz  24000000


А как мне включить максимально возможную для данного контроллера скорость SPI? SPI_BaudRatePrescaler_1 не существует
Нельзя всё знать, достаточно понимать.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение HHIMERA »

12 MHz и есть максимальная частота SPI для данного МК...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение mr_smit »

Ну и последние 2 вопроса.

1. CooCox при компиляции выдает:

Program Size:
text data bss dec hex filename
49816 84 1028 50928 c6f0 S65_Display.elf

BUILD SUCCESSFUL
Total time: 0 seconds


Как понять сколько flash из общего объема 128 Кб занято? 50928 байт? И что за поля text и data ?

P.S. Просто CodeVisionAVR пишет прям в процентах. Например 62% flash занято

2. Как объявить массив с картинкой во flash. Что он RAM не забивал?

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

...
const uint16_t picture[23232] = {
0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6 ...};
...
void LCD_Picture(uint8_t x, uint8_t y, uint8_t w, uint8_t h, const uint16_t *pic)

Этого достаточно?

P.S. Вроде компилируется и картинка на экран выводится.
Нельзя всё знать, достаточно понимать.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение HHIMERA »

mr_smit писал(а):Как понять сколько flash из общего объема 128 Кб занято? 50928 байт?

А что вы хотели... АРМ не любит uint16_t ...
Ваша картинка и данные инициализации дисплея помножились на два, т. к. хранятся во флэше как uint32_t ...
Не применяйте без надобности uint16_t вообще... Это раздувает код и снижает скорость выполнения...
И что за поля text и data ?

Читайте мануал к Кокосу...
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение mr_smit »

HHIMERA писал(а):А что вы хотели... АРМ не любит uint16_t ...
Ваша картинка и данные инициализации дисплея помножились на два, т. к. хранятся во флэше как uint32_t ...
Не применяйте без надобности uint16_t вообще... Это раздувает код и снижает скорость выполнения...

Так как же тогда правильно объявить массив с картинкой?
Нельзя всё знать, достаточно понимать.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение uk8amk »

Небольшое уточнение: Классический ARM в режиме ARM действительно плохо переваривает не 32-битные числа. А у Cortex с этим уже лучше. Поправьте если я не прав.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение HHIMERA »

Лучше... но даже в этом конкретном случае очевидно, что

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

const uint16_t picture[23232] = {
0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6, 0xEAC6 ...};

... лучше заменить на

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

const uint32_t picture[] = {
0xEAC6EAC6, 0xEAC6EAC6, 0xEAC6EAC6, 0xEAC6EAC6 ...};

...
Данные инициализации можно оставить как uint16_t ... их немного... потери невелики... да и наглядность лучше...
"Я не даю готовых решений, я заставляю думать!"(С)
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение uk8amk »

HHIMERA писал(а):

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

const uint32_t picture[] = {0xEAC6EAC6, 0xEAC6EAC6, 0xEAC6EAC6, 0xEAC6EAC6 ...};

Сюда так и напрашивается компрессор типа RLE...
Аватара пользователя
mr_smit
Вымогатель припоя
Сообщения: 651
Зарегистрирован: Пн мар 23, 2009 09:25:58
Откуда: Самара

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение mr_smit »

uk8amk писал(а):Сюда так и напрашивается компрессор типа RLE...

"Алгоритм рассчитан на деловую графику - изображения с большими об­ластями повторяющегося цвета. Ситуация, когда файл увеличивается, для этого простого алгоритма не так уж редка." Принцип алгоритма понятен, но это не лучший вариант для картинок.
HHIMERA писал(а):... лучше заменить на

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

const uint32_t picture[] = {
0xEAC6EAC6, 0xEAC6EAC6, 0xEAC6EAC6, 0xEAC6EAC6 ...};

А функция отправки при этом как изменится? Размер пакета указан же 16 бит

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

...
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
...
void SPI_Send (uint16_t SPI_Data) {
   SPI_I2S_SendData(SPI1,SPI_Data);
   __NOP(); __NOP();
   while (SPI1->SR & SPI_SR_BSY);
}

Или отправлять сначала старшую часть потом младшую:

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

void SPI_Send (uint32_t SPI_Data) {

   SPI_I2S_SendData(SPI1, SPI_Data >> 16);
   while (SPI1->SR & SPI_SR_BSY);

        SPI_I2S_SendData(SPI1, SPI_Data & 0xFFFF);
   while (SPI1->SR & SPI_SR_BSY);
}

?
Нельзя всё знать, достаточно понимать.
makser
Открыл глаза
Сообщения: 71
Зарегистрирован: Пт апр 24, 2009 11:25:34
Откуда: Rus

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение makser »

Для Cortex без разницы 8 или 16 или 32 бит числа, потери памяти нет и доступ не медленнее, это одно из достоинств архитектуры.
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение uk8amk »

В функцию отправки данных можно скормить указатель на массив картинки, приведенный к 16-битному типу.
Типа этого:
uint16_t * pic_ptr;
pic_ptr=(*uint16_t)my_picture;//получить адрес картинки
spi_send(*pic_ptr++);//за каждый проход будет считываться по 16 бит
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение uk8amk »

Да еще вот что. Функцию отправки данных inline-ить или ее потроха вставить в код. Заработает быстрее т.к. не будет накладных расходов на вызов. А еще правильнее DMA использовать.
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение HHIMERA »

makser писал(а):Для Cortex без разницы 8 или 16 или 32 бит числа, потери памяти нет и доступ не медленнее, это одно из достоинств архитектуры.

Да неужели??? :)))
Или тебе симулятором и отладчиком по приговору суда запретили пользоваться??? :))) :)))
А ну быстренько скомпилировать кусочек кода... "по исполнению доложить немедленно!"... :))

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

int main(void) 
{
uint32_t i, ii;  // Вариант 1
//uint16_t i, ii;  // Вариант 2

__NOP();

    for(i=0; i<60000; i++)
      {
        ii++;
      }

__NOP();

  while(1);
}


Хотя... не напрягайся... с uint32_t код на 4-е байта короче и работает быстрее... :)))
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение HHIMERA »

uk8amk писал(а):Да еще вот что. Функцию отправки данных inline-ить или ее потроха вставить в код. Заработает быстрее т.к. не будет накладных расходов на вызов. А еще правильнее DMA использовать.

Чтобы было быстрее... там всё заново переписывать надобно...
"Я не даю готовых решений, я заставляю думать!"(С)
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: CooCox + STM32 + дисплей от S65 = не запускается

Сообщение HHIMERA »

HHIMERA писал(а): и работает быстрее... :)))

на 17% ... :))
"Я не даю готовых решений, я заставляю думать!"(С)
Ответить

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