Привет всем.
Попал тут в руки проц 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 атоллике.
Спасибо.
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда