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

 
 
> 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
4 страниц V   1 2 3 > »   
Start new topic
Ответов (1 - 14)
Genadi Zawidowsk...
сообщение Jul 18 2018, 14:44
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Как ни странным может показаться, при передаче 8-bit
как проверкуосвобождения передатчика делю так:
Код
    while ((SPI1->SR & SPI_SR_RXP) == 0)    
    ;
    (void) * (volatile uint8_t *) & SPI1->RXDR;    /* clear SPI_SR_RXP in status register */


А вот так передача:
Код
    * (volatile uint8_t *) & (SPI1)->TXDR = v;    // prevent data packing feature

Естественно, первая передача без ожидания перед ней.

Как обычно, проект тут:
https://188.134.5.254/browser/hfreceiver/trunk/hardware.c - функция hardware_spi_master_setfreq и hardware_spi_connect

Сообщение отредактировал Genadi Zawidowski - Jul 18 2018, 14:52
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jul 18 2018, 15:46
Сообщение #3


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

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



Судя по осциллу SPI и его ноги ожили. Долбаный хал с его callback-ами.

Цитата(Genadi Zawidowski @ Jul 18 2018, 17:44) *
Как обычно, проект тут:
https://188.134.5.254/browser/hfreceiver/trunk/hardware.c - функция hardware_spi_master_setfreq и hardware_spi_connect


Угу, гляну, может там надо как-то ждать реального ухода байта в дисп, иначе он его не воспринимает.
Там сразу после отправки CS поднимается в 1. Если поднимется раньше реального ухода байта из всех этих очередей проца, то дисп его не воспримет ...


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Jul 18 2018, 16:17
Сообщение #4


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



Разумеется, всегда надо (если иное не сказано). А процессор шустрый, модет и не выдать ничего. C/D тоже надо не ранее передачи перключать.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jul 18 2018, 16:32
Сообщение #5


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

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



С C/D и nCS всё в порядке:

CODE
void ILI9163writecommand(uint8_t c)
{
res_rs ( ); //low
res_cs ( ); //low
ili9162_sendByte ( c );
set_cs ( ); //hi
}

void ILI9163writedata(uint8_t c)
{
set_rs ( ); //hi
res_cs ( ); //low
ili9162_sendByte ( c );
set_cs ( ); //hi
}


Вопрос только в отправке байта ..


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
MasterElectric
сообщение Jul 19 2018, 22:33
Сообщение #6


Участник
*

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



Если просто писать в TXDR данные пишуться в буфер, который настроить нужно (когда флаги будут выставляться и формат данных). А старт передачи так SPI1->CR1 |= SPI_CR1_CSTART; только начал тоже разбираться пока передал 4 байта, NSS красиво управляет сам с нужными задержками.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jul 20 2018, 14:23
Сообщение #7


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

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



Что-то я совсем запутался sad.gif
Некий прогресс есть, хоть и неполный.

1. Переписал инициализацию на регистрах:
Код
    CLEAR_BIT( SPI_PORT->CR1, SPI_CR1_SPE);            // Disable SPI
    SPI_PORT -> CR1 = SPI_CR1_SSI;        // SSI := 1
    SPI_PORT -> CR2 = 0x0;
    SPI_PORT -> CFG1 = SPI_CFG1_MBR | SPI_CFG1_DSIZE_2 | SPI_CFG1_DSIZE_1 | SPI_CFG1_DSIZE_0;    // MBR = 7 - clock/256; DSIZE = 0111 - 8 bit/frame
    SPI_PORT -> CFG2 = SPI_CFG2_AFCNTR | SPI_CFG2_SSM | SPI_CFG2_CPOL | SPI_CFG2_CPHA | SPI_CFG2_MASTER;

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

работает, проблем пока вроде не заметил, если так можно выразиться в свете нижеследующих пунктов....
от хала оставил только вот это
hnucleo_Spi.Instance = SPI_PORT;
hnucleo_Spi.State = HAL_SPI_STATE_READY;
потому что без него отправка байтов халовской функцией подыхает на взлёте.

Инит пинов SPI оставил пока на хале, дабы резать колбасу по кусочкам:
Код
    // SPI pins
    GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
//    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI1;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);


2. Дисплей пока отключил, убрал в сторонку, не дорос я до него biggrin.gif . Замкнул MISO-MOSI проводком, т.е. просто эхо.
Пытаюсь передать байт:
хал:
Код
// Чтение/запись байта SPI
uint8_t ili9162_sendByte ( uint8_t data_out )
{
    uint8_t data_in;

    HAL_StatusTypeDef status = HAL_SPI_TransmitReceive(&hnucleo_Spi, &data_out, &data_in, 1, 1000);
    return data_in;

Байт по кольцу гоняет, т.е. возвращает то, что я и отправляю. Типа нормально.

закомментариваю хал, пишу на регистрах:
Код
// Чтение/запись байта SPI
uint8_t ili9162_sendByte ( uint8_t data_out )
{
    uint8_t data_in;

    MODIFY_REG(SPI_PORT->CR2, SPI_CR2_TSIZE, 1);

    // Передача
    while ( !( SPI_PORT -> SR & SPI_SR_TXP ) );
    *((__IO uint8_t *)&SPI1->TXDR) = data_out;

    SET_BIT ( SPI_PORT->CR1, SPI_CR1_CSTART );

    // Приём
    while ((SPI1->SR & (SPI_SR_RXWNE | SPI_SR_RXPLVL)) == 0);
    data_in = *((__IO uint8_t *)&SPI_PORT->RXDR);

    return data_in;


2 байта передаёт-принимает нормально, на третьем виснет на условии приёма.
Единственное отличие здесь от хала это то, что HAL_SPI_TransmitReceive постоянно включает/выключает SPI и MODIFY_REG(SPI1->CR2, SPI_CR2_TSIZE, Size); делает при выключенном SPI.
Неужели это необходимо?
Попробовал включать-выключать SPI - стало ещё хуже - один байт передал и завис ..

3. К слову о периферийных SPI-девайсах. Тут вообще всё плачевно.
Вышеупоминавшийся дисплей вообще не инитится, пробовал подключать датчик BME280 (SPI интерфейс) - вместо ID (который равен 60h) читает одни нули, хотя на всяких там F1/F4 как положено 60h и датчик работает с песнями.
Эта хрень даже с халовской HAL_SPI_TransmitReceive, которая эхо исправно делает.

Помогите разобраться плиз. Такое чувство, что я где-то на одни и те же грабли наступаю ...
Рабочий драйвер для BME280 (SPI) могу выложить если кому интересно. По I2C я его ни разу нигде не запускал, пока не нужно.

Код уважаемого Genadi Zawidowski смотрел, но, видимо, чего-то недопонял, т.к. тоже повис на приёме байта если правильно помню sad.gif .


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
MasterElectric
сообщение Jul 20 2018, 16:02
Сообщение #8


Участник
*

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



Как разберусь сам помогу) делаю для NRF24. К коду которму месяц так и не возвращался, сегодня продолжу копания.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jul 20 2018, 17:22
Сообщение #9


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

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



Цитата(MasterElectric @ Jul 20 2018, 19:02) *
Как разберусь сам помогу) делаю для NRF24. К коду которму месяц так и не возвращался, сегодня продолжу копания.


Угу, спасибо. Я тоже буду отписываться, если что-то новое появится.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post
Tarbal
сообщение Jul 20 2018, 17:23
Сообщение #10


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

Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439



Пару лет назад я делал проект на похожем процессоре для Боинга. Там с SPI была проблема. Он (не помню на прием или передачу) младший бит иногда портил. В этом форуме есть моя тема про это. В конце я сделал програмный SPI. Через несколько месяцев вышла errata с описанием этой проблемы.

https://electronix.ru/forum/index.php?showtopic=135946
Go to the top of the page
 
+Quote Post
MasterElectric
сообщение Jul 21 2018, 07:57
Сообщение #11


Участник
*

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



hd44780 Вроде бы все получилось. Особое внимание нужно уделить системе тактирования. Пока что сделал на прерываниях, нужно еще исследовать как более оптимально работать с буфером. Проверялось без железок только на анализатор.

Код
/**
  * @brief  This function handles Debug Monitor exception.
  * @param  None
  * @retval None
  */
void SPI1_IRQHandler(void)
{
uint16_t tCTSIZE = (SPI_NRF->SPI->SR >> 16);

  if(SPI_NRF->SPI->SR & SPI_SR_RXP)
  {
   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_TXP)
  {//
   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 break;
   }
  }
}


настройка
Код
  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_FTHLV_0 | SPI_CFG1_FTHLV_1 | 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;


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_SPE;
  SPI->CR1 |= SPI_CR1_CSTART;
  SPI->IER |= SPI_IER_RXPIE | SPI_IER_TXPIE;
}


нужно еще углубиться в настройки...
Go to the top of the page
 
+Quote Post
MasterElectric
сообщение Jul 21 2018, 09:11
Сообщение #12


Участник
*

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



поправочка :
Код
  SPI_NRF->SPI->CFG1 = SPI_CFG1_MBR_0 | SPI_CFG1_MBR_2 | SPI_CFG1_DSIZE_0 | SPI_CFG1_DSIZE_1 | SPI_CFG1_DSIZE_2;

для работы с буфером побайтно FTHVL нужно в 0 установить
P.S. редактировать сообщения не могу.


Текущая проблема не могу передать второй и последующие пакеты. Первый нормально.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jul 21 2018, 09:25
Сообщение #13


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

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



Цитата(MasterElectric @ Jul 21 2018, 12:11) *
Текущая проблема не могу передать второй и последующие пакеты. Первый нормально.


У меня тож самое пока crying.gif . Первый байт проходит в песнями, потом виснет на опросе флагов SR.


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


Участник
*

Группа: Участник
Сообщений: 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
Arlleex
сообщение Jul 21 2018, 10:50
Сообщение #15


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Че-то вы тут поникли все. Надо свою поделку допаять и присоединиться к коллективным похоронам ковыряниям SPI на STM32H753 biggrin.gif



Это плата от графической части кое-какого пульта управления.
Решил под конец только для себя сделать один макет - но не на F4 уже а на F7, благо они pin-to-pin совместимы на этом корпусе rolleyes.gif
Завтра запаяю все остальное и экран поставлю, если лень не одолеет.

P.S. MasterElectric, пожалуйста, поменьше картинку сделайте...

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

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

 


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


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