STM32, не удается портирование проекта с AVR
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
- Реклама
Дисплей LPH9157-2, зеленый текстолит. Вообщем описался я, это марка дисплея. Контроллер который там стоит не известен, но похож на ILI9163, команды совпадают. http://we.easyelectronics.ru/lleeloo/lc ... denie.html
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Сразу предупреждаю - код с дерганьем CS после каждой транзакции .
Пины SPI настраиваем как AF , CS выход с паш-пул.
Далее можно настроить и на 16 битные транзакции.
Да и вообще потоком без дерганья 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));
- Реклама
понятно спасибо за инфу. А под дерганьем CS имеется ввиду вот это?
Код: Выделить всё
//RS=0; //передаем команду
//RS=1; //передаем данные
CS=0;
Spi_send (uint8_t data);
CS=1;
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Здраствуйте.
Вообщем никак не могу запустить SPI, на ножках МК нули. Сделал функции передачи команды и данных, все собрал а SPI молчит... Сначала сделал дефайны портов чтобы было понятнее, потом исправил остальной код с учетом функций передачи.
Вообщем никак не могу запустить 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
Чем проверяется ? И как реализовано сие -delay_ms ?6Н23П писал(а): а SPI молчит...
проверяется тестером, тупо меряю напругу на ногах спи.
задержка вот как запилена
задержка вот как запилена
Спойлер
Код: Выделить всё
//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
И что ожидается там увидеть на 12МГц ?6Н23П писал(а):проверяется тестером, тупо меряю напругу на ногах спи.
Это пользуй - должен обязательно быть подключен стартап и system_stm32f10x.c
Код: Выделить всё
//========================
void SysTick_Handler(void) {
if (TimingDelay) {
TimingDelay--;
}
}
//========================
void Delay_mS(uint32_t nTime) {
TimingDelay = nTime;
while (TimingDelay)
;
}
Код: Выделить всё
SysTick_Config(SystemCoreClock / 1000);Код: Выделить всё
Delay_mS(10); Самый надежный способ - посмотреть осциллографом. Включаешь "Запуск по фронту сигнала" и смотришь.
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Или логический анализатор - на китайских аукционах их по 300р. как грязи.
И собственно анализатор и осциллограф крайне желательно иметь в своей лаборатории.
И собственно анализатор и осциллограф крайне желательно иметь в своей лаборатории.
Все заработало !!! Оказывается я CLK не туда подключал, перепутал с MISO... И еще который код тут приведен он с ошибками,недавно обнаружил их.. Кароче в итоге инициализация проходит, на экране мусор появился.Щас буду остальные функции переписывать.
По поводу осциллографа то не помешал бы, но нету... Хотя есть мысля собрать чтото типа приставки к компу или просто на контроллере с АЦП и экраном...
Спасибо за помощь!!!
По поводу осциллографа то не помешал бы, но нету... Хотя есть мысля собрать чтото типа приставки к компу или просто на контроллере с АЦП и экраном...
Спасибо за помощь!!!
логический анализатор это типа вот такого ? http://ru.aliexpress.com/item/Free-Ship ... 39465.html
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Он и есть.
Для своих поделок на МК есть бюджетный вариант осциллографа - DSO QUAD .
2 канала аналоговых ,два цифровых , встроенный генератор . Цена ~ 4800р. с доставкой.
Есть так же.
Логический анализатор OLS -16+16 каналов до 200 Мгц . Цена 50$ с доставкой .
Для своих поделок на МК есть бюджетный вариант осциллографа - DSO QUAD .
2 канала аналоговых ,два цифровых , встроенный генератор . Цена ~ 4800р. с доставкой.
Есть так же.
Логический анализатор OLS -16+16 каналов до 200 Мгц . Цена 50$ с доставкой .
А как можно увеличить скорость SPI, а то скорость отрисовки медленнее чем на AVR. Пробовал менять коэффициент деления в регистре, эффект нулевой. Значит потом пробовал изменять частоту тактирования камня, ставил 72МГц, эффект тоже нулевой. Может быть кто знает как скорость повысить? Если сравнивать с програмным то у програмного скорость была оочень высокой, там отрисовка была моментальной....
- Сообщения: 3604
- Зарегистрирован: Пн июл 28, 2008 22:12:01
Я выше кому и зачем это писал ?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;


