Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-июн-19 09:56

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу Пред.  1, 2, 3, 4
Автор Сообщение
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2016-ноя-08 15:00 
Не в сети

Зарегистрирован: 2016-апр-27 10:51
Сообщения: 1
Откуда: Санкт-Петербург
Всем здравствуйте! Решил написать в этой теме.

Коллеги, никто не сталкивался с НИИЭТовским АЦП 1273ПВ19Т? Сейчас пытаюсь подружить микроконтроллер с этой микросхемой.
Для связи у них предусмотрен не совсем стандартный интерфейс SPORT. Никак не могу заставить SPI микроконтроллера нормально функционировать с этим SPORT.


Открыть временные диаграммы работы интерфейса SPORT
Вложение:
sport.PNG
sport.PNG [ 24.37 КБ | Просмотров: 2167 ]

SDIFS/SDOFS - линии кадровой синхронизации (линией SDOFS управляет АЦП)
SDI/SDO - линии данных (линией SDO управляет АЦП)
АЦП работает в режиме master, мк в режиме slave.
Закрыть


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2017-мар-29 11:26 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 17
Обмен вообще инициируется?
Сам с данным АЦП не работал, но первое, что бросилось в глаза - у мс во время ожидания приемопередатчика
сигнал SE (чипселект?) имеет низкий лог.уровень... Попробуйте его проинвертировать на входе МК


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2017-июл-27 21:29 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 17
Уважаемые разработчики! Подскажите пожалуйста, как корректно произвести сброс модуля SPI в режиме ведомого?
Подозреваю, что необходимо как минимум выключить тактирование данного блока, выждать паузу (сколько тактов?), включить тактирование, заново произвести настройку spi...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2017-июл-31 17:13 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 119
Откуда: ПКК "Миландр"
Уточните в чем заключается проблема?

Выключается SPI битом SSE регистра CR1.

В SPL сброс реализован следующим образом:

void SSP_DeInit(MDR_SSP_TypeDef* SSPx)
{
/* Check the parameters */
assert_param(IS_SSP_ALL_PERIPH(SSPx));

SSPx->CR0 = 0;
SSPx->CR1 = 0;
SSPx->CPSR = 0;
SSPx->IMSC = 0;
SSPx->DMACR = 0;

/* Clear SSP ICR[RTIC] and SSP ICR[RORIC] bits */
SSPx->ICR = SSP_IT_RT | SSP_IT_ROR;

}

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2017-авг-01 07:42 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 17
Цитата:
Уточните в чем заключается проблема?


Добрый день!
Проблема заключается в том, что в процессе выполнения программы блоком начинают выдаваться
некорректные данные. Работаем в режиме ведомого.
Вероятно, сбой может быть связан со следующей проблемой.
http://forum.milandr.ru/viewtopic.php?f=34&t=3680

Ведутся ли какие-нибудь исследования для ее устранения?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2017-авг-24 16:14 
Не в сети

Зарегистрирован: 2017-апр-26 14:51
Сообщения: 119
Откуда: ПКК "Миландр"
Простого способа сбросить FIFO TX блока SPI нет. При полной переинициализации такого сброса тоже не происходит. Единственный вариант - это отключить SPI от линии (перенастроить порты GPIO) и включить SPI в режиме мастера. Дождавшить опустошения буфера вернуть настройки в исходное состояние.

Цитата:
Вероятно, сбой может быть связан со следующей проблемой.
viewtopic.php?f=34&t=3680


По данному вопросу у меня и после ресета и после сброса по питанию первое слово передается успешно. Но на максимальных скоростях не прогонял.
При отладке SPI на связке двух отладочных плат требуется хорошая общая земля, иначе возникают сбои при передаче.

_________________
Отдел технической поддержки support@milandr.ru


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2018-фев-15 10:32 
Не в сети

Зарегистрирован: 2015-янв-27 13:32
Сообщения: 28
Здравствуйте!

Есть вопрос по межпроцессорному взаимодействии по шине SPI. Имеется плата, на ней два контроллера: STM32F746 фирмы STM и 1986ВЕ1Т производства Миландр, которые соединены шиной SPI, причем из них ведущим контроллером выбран STM32F746IGT фирмы STM, а ведомым - 1986ВЕ1Т 4 ревизии. Проблема такова, что сигналы на осциллографе выглядят безупречно (фронты не завалены, U= 3.2 В), подключение строго в соответствии с требованиями к шине (MOSI -> RXD, MISO->TXD, CLK->CLK, CS->FSS). Однако, стабильный прием данных возможен при частоте ниже 200 КГц ( в моем случае это 195 КГц ), а при частоте выше 200 КГц - уже искажаются принимаемые данные, что в данном случае для меня уже неактуальна, так как требуется более высокая частота обмена данными (поток большой).
Буду благодарен, если поможете мне указать на проблему.

На всякий случай выкладываю код инициализации SPI в режиме Slave для 1986, частота ядра 96 МГц

Код:

void SSP_SlaveInit(void)
{
  PORT_InitTypeDef PORT_InitStructure;
  SSP_InitTypeDef sSSP;
   
  PORT_StructInit(&PORT_InitStructure);   
 
   RST_CLK_PCLKcmd(SSP1_RST_CLK, ENABLE); 
    
   PORT_InitStructure.PORT_Pin  = SSP1_TXD_PIN;
   PORT_InitStructure.PORT_OE   = PORT_OE_OUT;
   PORT_InitStructure.PORT_FUNC = SSP1_PORT_FUNC;
   PORT_InitStructure.PORT_MODE = PORT_MODE_DIGITAL;
   PORT_InitStructure.PORT_PD   = PORT_PD_DRIVER;
   PORT_InitStructure.PORT_SPEED = PORT_SPEED_FAST;
   PORT_Init(SSP1_PORT, &PORT_InitStructure);
   
   PORT_InitStructure.PORT_Pin = SSP1_FSS_PIN | SSP1_CLK_PIN | SSP1_RXD_PIN; 
   PORT_InitStructure.PORT_OE = PORT_OE_IN;
   PORT_Init(SSP1_PORT, &PORT_InitStructure);   
   
   SSP_DeInit(SLAVE_SSP);       
   SSP_BRGInit(SLAVE_SSP, SSP1_HCLKdiv); //SSP2_CLK = HCLK
    
       SSP_StructInit (&sSSP);
 
//  sSSP.SSP_SCR = 0x10;      // for master only !!!!!
 
     sSSP.SSP_SCR = 0;
     sSSP.SSP_Mode = SSP_ModeSlave;
     sSSP.SSP_FRF = SSP_FRF_SPI_Motorola;   
     sSSP.SSP_WordLength = SSP_WordLength8b;   
     sSSP.SSP_SPH = SSP_SPH_1Edge;//1Edge;
     sSSP.SSP_SPO = SSP_SPO_Low;
     sSSP.SSP_CPSDVSR = 12;      // 96/2/12 = 4 Мбит F SSP_CLK (min) => 12 x F SSPCLKIN  (max) [for slave mode].
     sSSP.SSP_HardwareFlowControl = SSP_HardwareFlowControl_SSE;
 
     SSP_Init (SLAVE_SSP, &sSSP);
      
    SSP_DMACmd(SLAVE_SSP, (SSP_DMA_TXE | SSP_DMA_RXE), DISABLE); 
    pSSP->DMACR=0;
 
    SSP_Cmd(SLAVE_SSP, ENABLE); 

    NVIC_EnableIRQ(SLAVE_SSP_IRQn);
    SSP_ITConfig(SLAVE_SSP, SSP_IT_RX, ENABLE);
}


обработчик прерывания

Код:
void SSP1_IRQHandler()
{
   
   if (SSP_GetITStatus(SLAVE_SSP, SSP_IT_RX) == SET){
      SSP_ClearITPendingBit(SLAVE_SSP, SSP_IT_RX);
      rx_flag = 1;
      SSP_ITConfig(SLAVE_SSP, SSP_IT_RX, DISABLE);
   }
}


в основном цикле

Код:
     if (rx_flag){
         while (SSP_GetFlagStatus(SLAVE_SSP, SSP_FLAG_RNE ) == SET){      
            rx_buffer[rx_indx] = SSP_ReceiveData(SLAVE_SSP);
                           // ...
         }
   
         SSP_ITConfig(SLAVE_SSP, SSP_IT_RX, ENABLE);
         rx_flag = 0;
   }


Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2018-фев-15 10:51 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 663
Откуда: г. Санкт-Петербург
Проверьте правильность задания полярности и фазы CLK


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2018-фев-15 11:01 
Не в сети

Зарегистрирован: 2015-янв-27 13:32
Сообщения: 28
vasili писал(а):
Проверьте правильность задания полярности и фазы CLK


Спасибо большое за ответ, но и там и там вроде полярность и фаза правильно заданы, или есть подводные камни?

Вот настройки SPI на STM32

Код:
hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }



У 1986
Код:
     sSSP.SSP_SPH = SSP_SPH_1Edge;//1Edge;
     sSSP.SSP_SPO = SSP_SPO_Low;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2018-фев-15 12:04 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 663
Откуда: г. Санкт-Петербург
Попробуйте задать более высокую (вплоть до максимально возможной ) частоту тактирования SPI,
и на всякий случай попробуйте изменить фазу CLK в настройках ВЕ1.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2018-фев-20 16:24 
Не в сети

Зарегистрирован: 2015-ноя-05 10:50
Сообщения: 17
Цитата:
а при частоте выше 200 КГц - уже искажаются принимаемые данные


На такой сравнительно невысокой частоте никаких искажений быть не должно.
Я так понимаю искажение данных Вы оцениваете по содержимому программного буфера rx_buffer[]?

Посмотрите по осциллографу, если есть такая возможность, в какой момент времени происходит переход в обработчик
SPI относительно начала передачи пакета от мастера.
Если в протоколе обмена заложена передача небольших пакетов (до 4-х 16-и битных слов),
то включайте и также обрабатывайте прерывания по таймауту.

Кстати, если у Вас большой поток данных, почему не передаете 16-и битными словами?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2018-фев-22 08:16 
Не в сети

Зарегистрирован: 2017-сен-21 09:22
Сообщения: 12
asket писал(а):
Здравствуйте!

Есть вопрос по межпроцессорному взаимодействии по шине SPI. Имеется плата, на ней два контроллера: STM32F746 фирмы STM и 1986ВЕ1Т производства Миландр, которые соединены шиной SPI, причем из них ведущим контроллером выбран STM32F746IGT фирмы STM, а ведомым - 1986ВЕ1Т 4 ревизии. Проблема такова, что сигналы на осциллографе выглядят безупречно (фронты не завалены, U= 3.2 В), подключение строго в соответствии с требованиями к шине (MOSI -> RXD, MISO->TXD, CLK->CLK, CS->FSS). Однако, стабильный прием данных возможен при частоте ниже 200 КГц ( в моем случае это 195 КГц ), а при частоте выше 200 КГц - уже искажаются принимаемые данные, что в данном случае для меня уже неактуальна, так как требуется более высокая частота обмена данными (поток большой).
Буду благодарен, если поможете мне указать на проблему.

На всякий случай выкладываю код инициализации SPI в режиме Slave для 1986, частота ядра 96 МГц


Может проблема в прерываниях? Вообще Rx_flag может не так уж и нужен, SSP_FLAG_RNE говорит нам что что-то пришло.

в примерах SPL вот так делают:
Код:
/* Wait for SPI1 data reception */
      while (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_RNE ) == RESET);

      /* Read SPI1 received data */
      DstBuf1[RxIdx] = SSP_ReceiveData(MDR_SSP1 );


Последний раз редактировалось sharamamburum 2018-фев-22 08:58, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: вопрос по SPI
СообщениеДобавлено: 2018-фев-22 08:55 
Не в сети

Зарегистрирован: 2017-сен-21 09:22
Сообщения: 12
И у меня тоже вопрос по SPI.
Хочу подключить датчик MPU-9250 к 1986VE1T по SPI, проблема с FSS. Мне нужен FSS от блока SSP, чтобы в дальнейшем опрашивать датчик через блок DMA.
1) Интерфейс Motorola. Если использую fss от блока spi, то датчик ничего не отвечает, хотя на осциллографе смотрю и fss вроде бы работает правильно. (прижимается к земле за 1 такт до слова и возвращается в высокий после слова +1 такт). Если делаю программный fss, то все работает (через SetBits/ResetBits).
2) Интерфейс MicroWire и TI. Если использую fss от блока spi, то датчик отвечает, вижу на осциллографе, но в приемнике всегда 0 (смотрю в отладчике). Если делаю программный fss, то все работает (SetBits/ResetBits).

Прошу поделиться опытом, как подключить датчик?

Привожу код:
Код:
   RST_CLK_DeInit();
   RST_CLK_CPU_PLLconfig(RST_CLK_CPU_PLLsrcHSIdiv2, RST_CLK_CPU_PLLmul8);
   RST_CLK_PCLKcmd((RST_CLK_PCLK_RST_CLK | RST_CLK_PCLK_SSP1 | RST_CLK_PCLK_PORTD), ENABLE);

   PORT_DeInit(MDR_PORTD );
   PORT_InitStructure.PORT_Pin =  PORT_Pin_2| PORT_Pin_4| PORT_Pin_5;
   PORT_InitStructure.PORT_OE = PORT_OE_OUT;
   PORT_InitStructure.PORT_FUNC = PORT_FUNC_ALTER;
   PORT_InitStructure.PORT_MODE = PORT_MODE_DIGITAL;
   PORT_InitStructure.PORT_PD = PORT_PD_DRIVER;
   PORT_InitStructure.PORT_SPEED = PORT_SPEED_FAST;
   PORT_Init(MDR_PORTD, &PORT_InitStructure);
   PORT_InitStructure.PORT_Pin =  PORT_Pin_3 ;
   PORT_InitStructure.PORT_OE = PORT_OE_IN;
   PORT_Init(MDR_PORTD, &PORT_InitStructure);

   SSP_DeInit(MDR_SSP1 );
   SSP_BRGInit(MDR_SSP1, SSP_HCLKdiv1);
   SSP_StructInit (&sSSP);
   sSSP.SSP_SCR  = 3;
   sSSP.SSP_CPSDVSR = 6;
   sSSP.SSP_Mode = SSP_ModeMaster;
   sSSP.SSP_WordLength = SSP_WordLength8b;
   sSSP.SSP_SPH = SSP_SPH_1Edge;
   sSSP.SSP_SPO = SSP_SPO_Low;
   sSSP.SSP_FRF = SSP_FRF_SPI_Motorola;
   sSSP.SSP_HardwareFlowControl = SSP_HardwareFlowControl_SSE;
   SSP_Init(MDR_SSP1, &sSSP);
   SSP_Cmd(MDR_SSP1, ENABLE);
   
   uint16_t address = MPUREG_WHOAMI|READ_FLAG;//) - WHO_AM_I - READ
   uint8_t WHOIAM;
      while (1)
      {
         while (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_TFE ) == RESET);
         SSP_SendData(MDR_SSP1, address);
         while (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_RNE ) == RESET);
         SSP_ReceiveData(MDR_SSP1);
         while (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_TFE ) == RESET);
         SSP_SendData(MDR_SSP1, 0x00);
         while (SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_RNE ) == RESET);
         WHOIAM = SSP_ReceiveData(MDR_SSP1);           
      }



Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 58 ]  На страницу Пред.  1, 2, 3, 4

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4


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

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB