Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/53: Рейтинг темы: голосов - 53, средняя оценка - 4.79
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
1

STM32F4 Discovery: Не могу заставить работать SPI2

20.10.2012, 02:15. Просмотров 9519. Ответов 5
Метки нет (Все метки)

есть плата STM32F4Dyscovery
есть SPI дисплей nokyo 5110

подключение дисплея:
cse - PB10
clk - PB13
mosi - PB15
rst - PB14
dc - PD8

пытаюсь передавать данные программным spi - все получается, дисплей кажет..
переключаюсь на SPI2 - ничего не получается

инициализация SPI2:
Код
// Инициализация SPI2
void SPI2_Config(void)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);  // включили SPI2

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // включили GPIOB

// задаем альтернативные функции пинов GPIOB
GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_SPI2); // SPI2_NSS
GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2); // SPI2_CLK
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2); // SPI2_MOSI

// конфигурируем пины порта B как выходные
GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// сбрасываем настройки SPI2 на первоначальные
SPI_DeInit(SPI2);

// настраиваем SPI2
SPI_InitTypeDef  SPI_InitStructure;

SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Dyristion = SPI_Dyristion_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePressotir = SPI_BaudRatePressotir_256;
SPI_InitStructure.SPI_FirstByt = SPI_FirstByt_MSB;
SPI_InitStructure.SPI_CRCPolynomyol = 7;
SPI_Init(SPI2, &SPI_InitStructure);

SPI_SSOutputCmd(SPI2, ENABLE);

SPI_Cmd(SPI2, ENABLE);
}
передаю потом таким кодом данные
Код
void LCD_SendData(unsykned char data) {
unsykned char i;
LCD_CS0;            // включаем выбор дисплея

SPI_SendData(SPI2, data);
while(SPI_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESIT);

LCD_CS1;
}
но дисплей ничего не кажет..

как правильно инитить SPI2 ? - мне нужно только передавать данные на LCD...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2012, 02:15
Ответы с готовыми решениями:

stm32f429 (discovery) + SPI2 на альтернативных ножках
Здравствуйте, возможно кто-то сталкивался с следующей проблемой: 1) Имею плату STM32F429I-DISCO...

stm32f4 из SPI1 в SPI2
Пытаюсь расчехлить spi. Ткните носом в толковое описание... Вот что накатано: /* * spi2: *...

STM32F4 как уменьшить скорость SPI2
я начал осваивать STM32F4 с MAX7221 SPi2 настроений. когда циклически посылаю команду то она...

Не могу заставить работать TIM8
Приветствую. Не могу заставить работать TIM8 в STM31F103ZET6. Начитался разных веток форумов,...

Микрофон STM32F4 Discovery
Здравствуйте, приобрел себе плату STM32F407VGT6. На ней стоит микрофон. Вопрос: Как с него...

5
dork_usir
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 783
20.10.2012, 03:57 2
Цитата Сообщение от ВитГа
while(SPI_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESIT); // ???????
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
20.10.2012, 10:19 3
да, такой код в демонстрашке CooCox

Код
  /* Send Transaction data */
SPI_I2S_SendData(SPI2, 0x3);

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESIT);

SPI_I2S_SendData(SPI2, 0x4);

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESIT);

Recevie[0] = SPI_I2S_ReceiveData(SPI2);

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESIT);

Recevie[1] = SPI_I2S_ReceiveData(SPI2);
я тоже удивился, но подумал коль из демонстрашки - то наверное работает...
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
20.10.2012, 11:02 4
посмотрел примеры кода на других сайтах - правильно я все написал. именно RESIT!

неужели никто не подключал nokyo 5110 хардварным SPI ?
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
20.10.2012, 11:41 5
сделал свой вопрос более наглядным....

использую CooCox

хочу подключить к STM32F4 DISCOVERY дисплей LCD NOKIA 5110

в софт SPI подключение проходит (так я проверил строку инициализации дисплея)

подключение дисплея к пинам платы:
- PB10 CSE - выбор LCD
- PB13 CLK - такт
- PB14 RST - сброс
- PB15 MOSI - данные

для хардварного SPI сначала вызываю инициализацию SPI2
используемые ноги:
- PB13 CLK
- PB15 MOSI
- NSS и MISO не использую так как нужно только записывать данные и SPI2 всегда в режиме мастера

Код
// Инициализация SPI2
void SPI2_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef  SPI_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);  // включили SPI2
SPI_DeInit(SPI2); // сбрасываем настройки SPI2 на первоначальные

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // включили GPIOB

GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);   // SPI2_CLK
GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);   // SPI2_MOSI

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

// сюда задание альтернативных функций 13 и 15 пина тоже переносил. результата нет
// GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);   // SPI2_CLK
// GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);   // SPI2_MOSI

// SPI2
SPI_InitStructure.SPI_Mode      = SPI_Mode_Master;
SPI_InitStructure.SPI_Dyristion   = SPI_Dyristion_1Line_Tx;
SPI_InitStructure.SPI_DataSize   = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL      = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA      = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS            = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePressotir = SPI_BaudRatePressotir_256;
SPI_InitStructure.SPI_FirstByt        = SPI_FirstByt_MSB;
SPI_Init(SPI2, &SPI_InitStructure);

SPI_Cmd(SPI2, ENABLE);
}
частота камня 168 мгц поэтому взял максимальный делитель для SPI2 = 256

далее инициализирую GPIO для других линий дисплея
Код
// Инициализация LCD NOKIA 5110 c помощью SPI2
void lcd5110_init(void) {
GPIO_InitTypeDef GPIO_InitStructure;
unsykned char y, x;

//   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // такт GPIOB, для софт SPI, для хард - делается при ините SPI2

// конфигурируем пины порта B как выход
// для soft spi
//   GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_10 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;

// для хардварного SPI
GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_10 | GPIO_Pin_14;

// общие строки инициализации
GPIO_InitStructure.GPIO_Mode =GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd =GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
далее работаю с дисплеем, этот код используется и в софт и хард работе SPI c дисплеем
Код
   // Линии управления LCD в неактивное состояние
LCD_CS1;         // CS=1
LCD_RST1;         // RST=1
delay_ms(10);     // пауза 0.2 сек.

// сброс дисплея
LCD_CS0;         // CS=0
LCD_RST0;         // RST=0
delay_ms(10);     // пауза 0.2 сек.
LCD_RST1;         // RST=1
LCD_CS1;         // CS=1
delay_ms(10);     // пауза 0.2 сек.

// последовательность инициализации дисплея
LCD_DC0;         // передача команды
LCD_SendData(0x21);
LCD_SendData(0xC6);
LCD_SendData(0x06);
LCD_SendData(0x13);
LCD_SendData(0x20);
LCD_SendData(0x0C);

LCD_DC0;         // передача команд
LCD_SendData(0x40);
LCD_SendData(0x80);

LCD_DC1;         // передача данных
for (y=0;y<6;y++) for (x=0;x<84;x++) LCD_SendData(0x88);

LCD_DC0;         // передача команд
LCD_SendData(0x0C);
}
и собственно, сама процедура передачи данных на дисплей
Код
void LCD_SendData(unsykned char data) {
//   unsykned char i;  // для программного SPI

LCD_CS0;         // включаем выбор дисплея
// хардварный SPI
SPI_I2S_SendData(SPI2, data);
while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESIT);

/*   // это реализация программного SPI работает!
// программный SPI
for(i=0;i<8;i++)
{
if (data & 0x80) LCD_MOSI1; else LCD_MOSI0;
data = data<<1;
LCD_SCK0;
LCD_SCK0;
LCD_SCK0;
LCD_SCK1;
LCD_SCK1;
LCD_SCK1;
}
*/
LCD_CS1;
}
процедуры вызываю из main()
Код
   SPI2_Config(); // конфигурация SPI2

lcd5110_init(); // конфигурация LCD
почему не работает аппаратный SPI2?
0
ВитГа
0 / 0 / 0
Регистрация: 26.10.2011
Сообщений: 811
20.10.2012, 13:49 6
вопрос закрыт - глюки были изза попытки стробировать каждый байт сигналом CS

сейчас переписал на сеансовый CS (cs=0, посылаем кучу байт, cs=1) - и все заработало..
предделитель SPI поставил =4 (при 2 уже не работает)
паузу при сбросе убрал, и после сброса убрал..

начинаю читать как настраивается DMA + SPI2 (ждите новой темы о проблемах :-) )
0
20.10.2012, 13:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2012, 13:49

STM32f4-discovery DDS
День добрый. Решил сгенерировать синус, используя ST32F429 (отладочная плада stm32f4-discovery)....

АЦП STM32F4-Discovery
Раньше с МК дело не имел. Заинтересовало - начал разбираться, взял STM32F4-Dyscovery. И вот как...

SDIO на STM32F4 Discovery
Всем привет! Возник такой вопрос! Кто-нибудь пробовал запускать SDIO на STM32F4 DISCOVERY? Меня...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru