Например TDA7294

Форум РадиоКот • Просмотр темы - STM32F373CCT6 не работает чтение по SPI2
Форум РадиоКот
Здесь можно немножко помяукать :)



Текущее время: Ср июл 17, 2019 15:42:49

Часовой пояс: UTC + 3 часа [ Летнее время ]


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: STM32F373CCT6 не работает чтение по SPI2
СообщениеДобавлено: Сб апр 28, 2018 18:59:30 
Родился

Зарегистрирован: Вт июл 04, 2017 04:14:29
Сообщений: 8
Рейтинг сообщения: 0
Добрый день!
Никак не могу разобраться. Использую SPI2 для работы с модулем RFM23BP. С записью никаких проблем нет, все отлично работает. Но чтение не работает ни в какую. При этом я смотрю логическим анализатором обмен по SPI, там все отлично, модуль выдает значение регистра, но в приемном буфере в результате одни нули!
По железу все подключено 100% правильно
Обмен по SPI:


Настройки в CUBE:


Код:
Код:
/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////

 uint8_t si_data[3];

unsigned char si4432_read(unsigned char si_addr)
{
 
   si_addr &= 0x7F; //Add R\W bit to address

   RFM_CS_LO();

   
   HAL_SPI_Transmit(&hspi2,&si_addr,1,100);
   HAL_SPI_Receive(&hspi2,si_data,1,100);
   

   RFM_CS_HI();

  return si_data[0];
}


/////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////


Код инициализации SPI:
Код:
/* SPI2 init function */
static void MX_SPI2_Init(void)
{

  hspi2.Instance = SPI2;
  hspi2.Init.Mode = SPI_MODE_MASTER;
  hspi2.Init.Direction = SPI_DIRECTION_2LINES;
  hspi2.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi2.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi2.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi2.Init.NSS = SPI_NSS_SOFT;
  hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi2.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi2.Init.CRCPolynomial = 7;
  hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi2.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

}


Код:
void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi)
{

  GPIO_InitTypeDef GPIO_InitStruct;
  if(hspi->Instance==SPI2)
  {
  /* USER CODE BEGIN SPI2_MspInit 0 */

  /* USER CODE END SPI2_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_SPI2_CLK_ENABLE();
 
    /**SPI2 GPIO Configuration   
    PB14     ------> SPI2_MISO
    PB15     ------> SPI2_MOSI
    PD8     ------> SPI2_SCK
    */
    GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_8;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* USER CODE BEGIN SPI2_MspInit 1 */

  /* USER CODE END SPI2_MspInit 1 */
  }

}


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: STM32F373CCT6 не работает чтение по SPI2
СообщениеДобавлено: Вс апр 29, 2018 09:35:34 
Встал на лапы

Карма: 1
Рейтинг сообщений: 1
Зарегистрирован: Вс апр 29, 2018 09:28:33
Сообщений: 92
Рейтинг сообщения: 0
А если в этом участке
Код:
RFM_CS_LO();

   
   HAL_SPI_Transmit(&hspi2,&si_addr,1,100);
   HAL_SPI_Receive(&hspi2,si_data,1,100);
   

   RFM_CS_HI();

1. ...Transmit заменить на TransmitReceive, или
2. перед полезным ...Receive выполнить один холостой .. Receive, а лучше даже HAL_SPIEx_FlushRxFifo(...)?


Вернуться наверх
 
JLCPCB, всего $2 за прототип печатной платы! Цвет - любой!

Отличное качество, подтвержденное более чем 600,000 пользователей! Более 10,000 заказов в день.

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/quote

Не в сети
 Заголовок сообщения: Re: STM32F373CCT6 не работает чтение по SPI2
СообщениеДобавлено: Вс апр 29, 2018 16:57:12 
Родился

Зарегистрирован: Вт июл 04, 2017 04:14:29
Сообщений: 8
Рейтинг сообщения: 0
А если в этом участке
Код:
RFM_CS_LO();

   
   HAL_SPI_Transmit(&hspi2,&si_addr,1,100);
   HAL_SPI_Receive(&hspi2,si_data,1,100);
   

   RFM_CS_HI();

1. ...Transmit заменить на TransmitReceive, или
2. перед полезным ...Receive выполнить один холостой .. Receive, а лучше даже HAL_SPIEx_FlushRxFifo(...)?

Пробовал я вместо Receive TransmitReceive. Результат точно такой же. Делал еще три Receive подряд, результат каждого был 0, хотя на анализаторе опять же было видно что модуль отвечает верно.HAL_SPIEx_FlushRxFifo попробую.


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $88 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay
Не в сети
 Заголовок сообщения: Re: STM32F373CCT6 не работает чтение по SPI2
СообщениеДобавлено: Чт май 03, 2018 19:55:28 
Родился

Зарегистрирован: Вт июл 04, 2017 04:14:29
Сообщений: 8
Рейтинг сообщения: 0
Проблема решена!
Как оказалось, то ли я что то не понял, то ли HAL настолько глючный, но чтение средствами HAL не работает. Вышел из ситуации так:
Код:
volatile unsigned int si4432_read(unsigned char si_addr)
{
  unsigned int si_data = 0;
   si_addr &= 0x7F; //Add R\W bit to address
   

   RFM_CS_LO();
   
   
   HAL_SPI_Transmit(&hspi2,&si_addr,1,10);
   HAL_SPI_Transmit(&hspi2,&si_addr,1,10);
   
   si_data = SPI2->DR;
   

   RFM_CS_HI();
   return si_data;
}

Тут мы видим отправку через HAL и чтение напрямую из регистра, так все работает. Но тоже есть ньюансы. Допустим мы читаем число 0x30. Так вот результат первого чтения будет 0x00000030, а результат последующих чтений - 0x00003000.


Вернуться наверх
 
Плавкие предохранители LittelFuse. Грамотный подбор

Выбор оптимального плавкого предохранителя требует учета многих параметров. Для упрощения выбора оптимального предохранителя и автоматизации расчетов Littelfuse предлагает онлайн-утилиту. Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32F373CCT6 не работает чтение по SPI2
СообщениеДобавлено: Чт май 03, 2018 22:42:52 
Собутыльник Кота
Аватар пользователя

Карма: 4
Рейтинг сообщений: 136
Зарегистрирован: Пн окт 11, 2010 20:00:08
Сообщений: 2546
Рейтинг сообщения: 0
andreivanov писал(а):
Допустим мы читаем число 0x30. Так вот результат первого чтения будет 0x00000030, а результат последующих чтений - 0x00003000.
А если сделать так?
Код:
si_data = *(__IO uint8_t *)&SPI2->DR;


Вернуться наверх
 
Немногим дороже дискретного решения: новое поколение импульсных стабилизаторов Mornsun

Практически во всех радиоэлектронных устройствах массово применяются линейные понижающие стабилизаторы напряжения типа КРЕН в корпусе TO220 (другое обозначение – 78хх) и им подобные для формирования основного напряжения питания схемы.
Данные стабилизаторы позволяют без особых затрат получить нужное для каскада или узла схемы напряжение, если устройство питается от внешнего источника с более высоким напряжением. Для этого требуются… Подробнее>>
Не в сети
 Заголовок сообщения: Re: STM32F373CCT6 не работает чтение по SPI2
СообщениеДобавлено: Пт май 04, 2018 19:41:47 
Встал на лапы

Карма: 1
Рейтинг сообщений: 1
Зарегистрирован: Вс апр 29, 2018 09:28:33
Сообщений: 92
Рейтинг сообщения: 0
по-моему это и есть такое своеобразное фифо этой линейки.. Вероятно, эту особенность использует дма-канал для упаковки пересылок в полные слова.


Вернуться наверх
 


Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot], rai17 и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y