реклама на сайте
подробности

 
 
> STM32H743 SPI, Не работает
hd44780
сообщение Jul 18 2018, 13:34
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Привет всем.
Попал тут в руки проц STM32H743 в виде платы NUCLEO-H743I.

Разобрался, как запустить его на все 400 МГц, Systick завёл, светодиодиками помигал - все это заработало. Частоту систика проверил осциллом.
Перешёл к SPI (маленький дисплейчик ILI9163). Сам дисп рабочий, работал на Ф103. Драйвер диспа собственно оттуда же.
Драйвер разделён на 2 части - низкоуровневая (работа с SPI и ногами) и т.н. высокоуровневая (пуляние в дисп команд, отрисовка точек, знакогенератор и пр).
Соответственно в адаптации нуждается только низкоуровневая часть, т.к. высокоуровневая напрямую в ноги и SPI не лезет.
С ногами nCS, nRESET и пр. ногодрыгом я управился, они работают нормально, а с SPI затык - синхра идёт исправно, а из ноги MOSI упорно прёт ноль. Нога MISO в данном случае не нужна вообще, т.к. у дисплея её нет.

Пишу на помеси из регистров и кубового хала. М.б. это и нехорошо, но с ходу писать на регистрах на проце, которого раньше в глаза не видел как-то нехорошо.

Инит пинов:

CODE
// Configure PA5 - SPI1 SCK
GPIO_InitStruct.Pin = GPIO_PIN_5; // SCK
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/*
// Configure PA7 - SPI1 MOSI
// Configure PB5 - SPI1 MOSI
// Configure PD7 - SPI1 MOSI
GPIO_InitStruct.Pin = GPIO_PIN_7; // MOSI
// GPIO_InitStruct.Pin = GPIO_PIN_5; // MOSI
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
// GPIO_InitStruct.Pull = GPIO_PULLUP;
// GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
// HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
*/
// PA7 - SPI1 MOSI
// MODER - AF = 10
GPIOA->MODER |= GPIO_MODER_MODER5_1; // 10
// TYPER - PP = 0 - Push-pull
GPIOA->OTYPER |= GPIO_OTYPER_IDR_7; // 0
// SPEEDR - OSPEEDRy = 11
GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR7; // 11
// PUPD_R = 10 - Pull-down
GPIOA->PUPDR |= GPIO_PUPDR_PUPDR7_1; // 10


Нога PA5 (SCK) работает как угодно - хоть халом её инитить, хоть чем. PA7 (MOSI) - не работает никак. Инитил по-разному.

Инит SPI (в основном хал):
CODE
/*** Configure the SPI peripheral ***/
SPI_PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_SPI123;
SPI_PeriphClkInit.Spi123ClockSelection = RCC_SPI123CLKSOURCE_PLL;
HAL_RCCEx_PeriphCLKConfig(&SPI_PeriphClkInit);

/* Enable SPI clock */
// __HAL_RCC_SPI1_CLK_ENABLE();
// SET_BIT (RCC->APB2ENR, RCC_APB2ENR_SPI1EN);
RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;

// SPI Config
hnucleo_Spi.Instance = SPI_PORT;
// hnucleo_Spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16;
hnucleo_Spi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hnucleo_Spi.Init.Direction = SPI_DIRECTION_2LINES;
// hnucleo_Spi.Init.Direction = SPI_DIRECTION_2LINES_TXONLY;
hnucleo_Spi.Init.CLKPhase = SPI_PHASE_2EDGE;
hnucleo_Spi.Init.CLKPolarity = SPI_POLARITY_HIGH;
hnucleo_Spi.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hnucleo_Spi.Init.CRCPolynomial = 7;
hnucleo_Spi.Init.DataSize = SPI_DATASIZE_8BIT;
hnucleo_Spi.Init.FirstBit = SPI_FIRSTBIT_MSB;
hnucleo_Spi.Init.NSS = SPI_NSS_SOFT;
hnucleo_Spi.Init.TIMode = SPI_TIMODE_DISABLE;
hnucleo_Spi.Init.Mode = SPI_MODE_MASTER;
hnucleo_Spi.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; /* Recommended setting to avoid glitches */

hnucleo_Spi.Init.FifoThreshold = SPI_FIFO_THRESHOLD_01DATA;
hnucleo_Spi.Init.CRCLength = SPI_CRC_LENGTH_8BIT;
hnucleo_Spi.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hnucleo_Spi.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
hnucleo_Spi.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
hnucleo_Spi.Init.NSSPMode = SPI_NSS_PULSE_DISABLE;
hnucleo_Spi.Init.MasterSSIdleness = 0x00000000;
hnucleo_Spi.Init.MasterInterDataIdleness = 0x00000000;
hnucleo_Spi.Init.MasterReceiverAutoSusp = 0x00000000;

HAL_SPI_Init(&hnucleo_Spi);

// Enable SPI peripheral
SET_BIT( SPI_PORT->CR1 , SPI_CR1_SPE);

SPI_PORT === SPI1.

Отправка байта в SPI1 (хал):
CODE
// Чтение/запись байта SPI
void ili9162_sendByte ( uint8_t data )
{
/*
// Длина передаваемых байт - 1
MODIFY_REG (SPI1->CR2, SPI_CR2_TSIZE, 1);
// Старт передачи
SET_BIT(SPI1->CR1, SPI_CR1_CSTART);

while ( !( SPI1 -> SR & SPI_SR_TXP ) );
SPI1 ->TXDR = data;

// Ждать завершения передачи
// while ( ! ( SPI1 -> SR & SPI_SR_TXC ) );
*/
uint8_t data_in;
HAL_StatusTypeDef status = HAL_OK;
status = HAL_SPI_TransmitReceive(&hnucleo_Spi, &data_in, &data, 1, 1000);
} // SPI_sendByte


Моя поделка на регистрах не пашет вообще, я пока бросил, оставил хал.
Проверяю всё это вызовом в вечном цикле ili9162_sendByte ( 0xAA );

В чём может быть дело? Если надо, выложу весь проект на 9 атоллике.

Спасибо.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MasterElectric
сообщение Jul 21 2018, 10:41
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 24
Регистрация: 19-07-18
Пользователь №: 106 151



Заработало!!! Причем особо ничего не менял. Обращение к буферу пока что побайтно. Потом поэкспериментирую при разных фреймах. Работает от HSI (64 МГц)
инициализация:
Код
  //
  RCC->D2CCIP1R = RCC_D2CCIP1R_SPI123SEL_2; // kernel clock выбираем per_ck
  RCC->AHB4ENR |= RCC_AHB4ENR_GPIOAEN;  // разрешили тактирование GPIO на котором висит SPI
  RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;  // включаем тактирование модуля

  // конфигурируем SPI1
  SPI_NRF->SPI->CFG1 = SPI_CFG1_MBR_0 | SPI_CFG1_MBR_2 | SPI_CFG1_DSIZE_0 | SPI_CFG1_DSIZE_1 | SPI_CFG1_DSIZE_2;
  SPI_NRF->SPI->CFG2 = SPI_CFG2_SSOE | SPI_CFG2_MASTER | SPI_CFG2_AFCNTR;
  SPI_NRF->SPI->CR1 |= SPI_CR1_SPE;

  NVIC_EnableIRQ(SPI1_IRQn);


отправка пакетов в мейне
Код
  a = 19;
  SPI_NRF->SendBuff(SPI1_TxBuff, SPI1_RxBuff, a);

  while(SPI_NRF->SPI->CR1 & SPI_CR1_CSTART);
  SPI_NRF->SendBuff(SPI1_TxBuff, SPI1_RxBuff, 20);

  while(SPI_NRF->SPI->CR1 & SPI_CR1_CSTART);
  SPI_NRF->SendBuff(SPI1_TxBuff, SPI1_RxBuff, 5);

  while(SPI_NRF->SPI->CR1 & SPI_CR1_CSTART);
  SPI_NRF->SendBuff(SPI1_TxBuff, SPI1_RxBuff, 7);

  /* Infinite loop */
  while(1);


функция отправки:
Код
void TSPI::SendBuff(uint8_t *aTxBuff, uint8_t *aRxBuff, uint16_t aCnt)
{
  RxBuffPos = 0;
  TxBuffPos = 0;
  RxBuff = aRxBuff;
  TxBuff = aTxBuff;
  TransLength = aCnt;
  SPI->CR2 = aCnt;

  SPI->CR1 |= SPI_CR1_CSTART;
  SPI->IER |= SPI_IER_RXPIE | SPI_IER_TXPIE | SPI_IER_EOTIE;
}


обработчик прерывания:
Код
void SPI1_IRQHandler(void)
{
uint16_t tCTSIZE = (SPI_NRF->SPI->SR >> 16);

  if((SPI_NRF->SPI->SR & SPI_SR_RXP) && (SPI_NRF->SPI->IER & SPI_IER_RXPIE))
  {
   while(SPI_NRF->SPI->SR & SPI_SR_RXP)
   {
    if(SPI_NRF->RxBuffPos < SPI_NRF->TransLength)
    {
     SPI_NRF->RxBuff[SPI_NRF->RxBuffPos++] = *(volatile uint8_t *) &(SPI_NRF->SPI)->RXDR;
    } else break;
   }
  }

  if((SPI_NRF->SPI->SR & SPI_SR_EOT) && (SPI_NRF->SPI->IER & SPI_IER_EOTIE))
  {// закончили передавать
   SPI_NRF->SPI->IER &= ~(SPI_IER_RXPIE | SPI_IER_TXPIE);
   SPI_NRF->SPI->IFCR = SPI_IFCR_EOTC;
  }

  if((SPI_NRF->SPI->SR & SPI_SR_TXP) && (SPI_NRF->SPI->IER & SPI_IER_TXPIE))
  {//
   while(SPI_NRF->SPI->SR & SPI_SR_TXP)
   {
    if(SPI_NRF->TxBuffPos < SPI_NRF->TransLength)
    {
     *(volatile uint8_t *) &(SPI_NRF->SPI)->TXDR = SPI_NRF->TxBuff[SPI_NRF->TxBuffPos++];
    }
    else
    {// все отправили в буфер
     SPI_NRF->SPI->IER &= ~(SPI_IER_TXPIE);
     break;
    }

   }
  }
}



Сообщение отредактировал MasterElectric - Jul 21 2018, 11:00
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- hd44780   STM32H743 SPI   Jul 18 2018, 13:34
- - Genadi Zawidowski   Как ни странным может показаться, при передаче 8-b...   Jul 18 2018, 14:44
|- - hd44780   Судя по осциллу SPI и его ноги ожили. Долбаный хал...   Jul 18 2018, 15:46
- - Genadi Zawidowski   Разумеется, всегда надо (если иное не сказано). А ...   Jul 18 2018, 16:17
- - hd44780   С C/D и nCS всё в порядке: CODEvoid ILI9163writec...   Jul 18 2018, 16:32
- - MasterElectric   Если просто писать в TXDR данные пишуться в буфер,...   Jul 19 2018, 22:33
- - hd44780   Что-то я совсем запутался Некий прогресс есть, хо...   Jul 20 2018, 14:23
- - MasterElectric   Как разберусь сам помогу) делаю для NRF24. К коду ...   Jul 20 2018, 16:02
|- - hd44780   Цитата(MasterElectric @ Jul 20 2018, 19:0...   Jul 20 2018, 17:22
- - Tarbal   Пару лет назад я делал проект на похожем процессор...   Jul 20 2018, 17:23
- - MasterElectric   hd44780 Вроде бы все получилось. Особое внимание н...   Jul 21 2018, 07:57
- - MasterElectric   поправочка : Код SPI_NRF->SPI->CFG1 = SPI...   Jul 21 2018, 09:11
|- - hd44780   Цитата(MasterElectric @ Jul 21 2018, 12:1...   Jul 21 2018, 09:25
- - Arlleex   Че-то вы тут поникли все. Надо свою поделку допаят...   Jul 21 2018, 10:50
- - MasterElectric   В общем не получилось побороть SPI, когда количест...   Jul 21 2018, 12:08
- - hd44780   Я кое-как скрутил отправку одного байта ... SPI ди...   Jul 21 2018, 16:42
- - MasterElectric   Почему одного байта? Я пакеты нормально слал. Да н...   Jul 21 2018, 17:46
|- - hd44780   Цитата(MasterElectric @ Jul 21 2018, 20:4...   Jul 22 2018, 06:11
- - Genadi Zawidowski   Да нормально все работет... перепишите АККУРАТНО и...   Jul 21 2018, 17:47
- - MasterElectric   О вы уже успели и ДМА изучить... это олично... нам...   Jul 21 2018, 17:49
- - Genadi Zawidowski   Файл hardware.c hardware_spi_master_initialize har...   Jul 21 2018, 17:58
- - MasterElectric   Genadi Zawidowski Спасибо, буду изучать.   Jul 21 2018, 18:18
- - Genadi Zawidowski   Цитата( SPI_PORT->SR & SPI_SR_RXP != 0 ...   Jul 22 2018, 06:46
- - hd44780   Genadi Zawidowski , да, чёт я тупанул, спасибо, по...   Jul 22 2018, 07:28
- - MasterElectric   Ситуация с передачей через ДМА совсем отвратительн...   Jul 22 2018, 15:19
- - Genadi Zawidowski   Цитатаподелитесь кодом А чем мой не устраивает-то?...   Jul 22 2018, 15:43
- - MasterElectric   Я смотрел Ваш код (частично взял оттуда), вроде бы...   Jul 22 2018, 16:24
- - Genadi Zawidowski   ЦитатаЕсли есть возможность попробуйте передать па...   Jul 22 2018, 16:37
- - MasterElectric   Удалось побороть как всегда благодаря RM: КодWhen ...   Jul 23 2018, 07:01
- - Genadi Zawidowski   Снять SPE бит в конце пробовали?   Jul 23 2018, 07:13
- - MasterElectric   Да, в обработчике прерывания EOT, отключаю.   Jul 23 2018, 07:28
- - Genadi Zawidowski   Тогда не знаю... В моем варианте connect/send_fram...   Jul 23 2018, 07:38
- - MasterElectric   Да вроде нормальный. https://drive.google.com/open...   Jul 23 2018, 08:06
- - MasterElectric   После отключения SPI (SPE), в регистре статуса поя...   Jul 23 2018, 11:19
- - hd44780   MasterElectric , у Вас приём через прерывание норм...   Jul 23 2018, 11:56
- - MasterElectric   может полярность или фаза не так настроена. пока п...   Jul 23 2018, 18:15
|- - hd44780   Цитата(MasterElectric @ Jul 23 2018, 21:1...   Jul 24 2018, 05:11
- - hd44780   Датчик заработал, всё гуд. Осталось его только на ...   Jul 24 2018, 16:40
- - MasterElectric   тут наверное ошибочка Код // Disable SPI SET_B...   Jul 24 2018, 17:51
- - Genadi Zawidowski   ЦитатаОно тупо виснет на первом цикле ожидания еди...   Jul 24 2018, 21:33
- - hd44780   Да, со SPE опечатка вышла при вставке кода в форум...   Jul 25 2018, 07:08
- - MasterElectric   Вы же не указываете кол-во передаваемых байт?   Jul 25 2018, 14:33
|- - hd44780   Цитата(MasterElectric @ Jul 25 2018, 17:3...   Jul 25 2018, 16:26
- - MasterElectric   Да не заметил. Я думаю под себя перепишите. Приме...   Jul 25 2018, 20:11
|- - hd44780   Цитата(MasterElectric @ Jul 25 2018, 23:1...   Jul 26 2018, 04:28
- - MasterElectric   У меня план ковыряний примерно такой же, QSPI давн...   Jul 26 2018, 15:23
- - hd44780   MasterElectric, удачи. Мои эксприменты, похоже, от...   Jul 26 2018, 16:43
- - MasterElectric   Печалька, а где вы ее кстати покупали, в китае? у ...   Jul 26 2018, 17:35
|- - hd44780   Цитата(MasterElectric @ Jul 26 2018, 20:3...   Jul 26 2018, 18:01
- - MasterElectric   ну скорее всего ошибка в коде и он уходит в стоп р...   Jul 26 2018, 18:06
- - hd44780   Осциллом 3.3 платы посмотрел - чисто. Может иголки...   Jul 27 2018, 13:33
|- - hd44780   Вот так нормально работает опросом: Код// Чтение/...   Jul 29 2018, 12:27
- - hd44780   Датчик успешно переехал на SPI3 .   Jul 29 2018, 15:27
- - hd44780   Небольшой оффтоп в теме про SPI: Покопался ещё на...   Aug 5 2018, 15:02
- - hd44780   Всё-таки это косяки в либах атоллика (я про sprint...   Aug 18 2018, 07:00
- - nanorobot   Цитата(hd44780 @ Aug 18 2018, 12:00) Всё-...   Aug 18 2018, 11:04


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 23:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.03575 секунд с 7
ELECTRONIX ©2004-2016