Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Spacewire
СообщениеДобавлено: 2017-авг-10 18:20 
Не в сети

Зарегистрирован: 2016-апр-27 12:14
Сообщения: 22
Подскажите как настроить SpaceWire контроллер + встроенный PHY.
В соответствии с диаграммой состояний (Figure 8‐4 ECSS‐E‐ST-50-12C) контроллер должен пройти следующие состояния:
- ErrorReset (Сброс);
- ErrorWait (Ожидание);
- Ready (Готовность);
- Started (Запуск);
- Connecting (Соединение);
- Run (Рабочий режим).
И можно настроить прерывание на изменение состояния контроллера.
Но получается, что контроллер сразу оказывается в состоянии Ready и прерывания не работают.
Далее из состояния Ready контроллер должен перейти в состояние Started и начать отправлять нули (Table 8.1 ECSS‐E‐ST-50-12C). Этого также не происходит, но биты LINKSTART и AUTOSTART установлены.
Каким образом затактировать встроенный PHY: CLK_CNTR->SPHY0_CLK |=1<<16; ?
Код:
Открыть
Код:
void Init_SpaceWire(void){
// //    CLKCTRL_PER0_CLKcmd(CLKCTRL_PER0_CLK_MDR_PORTB_EN, ENABLE);
// //    
// //    PORT_InitStructure.PORT_Pin         = PORT_Pin_4 | PORT_Pin_5;
// //    PORT_InitStructure.PORT_SOE            = PORT_SOE_OUT;
// //    PORT_InitStructure.PORT_SFUNC        = PORT_SFUNC_14;
// //    PORT_InitStructure.PORT_SANALOG    = PORT_SANALOG_DIGITAL;
// //    PORT_InitStructure.PORT_SPULLUP      = PORT_SPULLUP_OFF;
// //    PORT_InitStructure.PORT_SPULLDOWN   = PORT_SPULLDOWN_OFF;
// //    PORT_InitStructure.PORT_SPWR          =   PORT_SPWR_300;
// //   PORT_Init(PORTB, &PORT_InitStructure);
// //    
// //    PORT_InitStructure.PORT_Pin         = PORT_Pin_3;
// //    PORT_InitStructure.PORT_SOE            = PORT_SOE_IN;
// //    PORT_Init(PORTB, &PORT_InitStructure);   
// //    
// //    PORT_InitStructure.PORT_Pin         = PORT_Pin_2;
// //    PORT_InitStructure.PORT_SFUNC        = PORT_SFUNC_12;
// //    PORT_InitStructure.PORT_SOE            = PORT_SOE_IN;
// //    PORT_Init(PORTB, &PORT_InitStructure);   

   CLKCTRL_PER0_CLKcmd(CLKCTRL_PER0_CLK_MDR_SPW0_EN, ENABLE);   
   // clock + divider
   CLK_CNTR->SPHY0_CLK    |=1<<16;
   CLK_CNTR->SPW0_CLK    |=1<<16;
   
   // //CLK_CNTR->SPHY1_CLK |=1<<16;
   // //CLK_CNTR->SPW1_CLK  |=1<<16;
   // PHY
   MDR_SPW0->PHY_CNTR   |=    (BIN8(10000000))<<10;   // Вход подстройки внутреннего резистора источника опорного тока
   MDR_SPW0->PHY_CNTR   |=  1<<9;                           // Сигнал разрешения работы блока REF для SPW
   MDR_SPW0->PHY_CNTR   |=   (BIN8(00000100))<<6;   // Вход цифрового тримминга источника опорного напряжения Типовое значение 100 (1,2 В).
   MDR_SPW0->PHY_CNTR   |=  1<<4;                           // Разрешение работы приёмопередатчика
   // SPW
   MDR_SPW0->DIV            |= 8<<8;         // Делитель для задания скорости передачи данных в канал связи SpaceWire равной 10Мбит/c
   MDR_SPW0->DIV            |= 1<<0;         // Делитель для задания скорости передачи данных в канал связи SpaceWire .
   
   MDR_SPW0->PAUSE         |= 512<<8;      // Количество тактов частоты контроллера необходимое на интервал работы счетчика 6.4 мкс
   MDR_SPW0->PAUSE         |= 68<<0;         // Количество тактов частоты контроллера необходимое на интервал работы счетчика 850 нс (80 MHz)
   
   MDR_SPW0->CONTROL      |= 1<<2;         // Разрешение перехода блока Linkinterface из состояния Ready в состояние Started (Fig 8-2 ECSS‐E‐ST-50-12C)
   MDR_SPW0->CONTROL      |= 1<<3;         // Разрешение перехода блока Linkinterface из состояния Ready в состояние Started с ожиданием символа NULL (Fig 8-2 ECSS‐E‐ST-50-12C)   
   MDR_SPW0->CONTROL      |= 1<<0;         // Разрешение работы интерфейса SpaceWire Установка бита в единицу разрешается только после инициализации регистров SPW_DIV и SPW_PAUSE.   
//    MDR_SPW0->CONTROL      |= 1<<9;         // Разрешение прерывание при наличии в FIFO приёмника хотя бы одного 32-x разрядного слова данных
   MDR_SPW0->CONTROL      |= 1<<6;         // Разрешение прерывания при изменении статуса соединения (соединение установлено/соединение разорвано)

   NVIC_EnableIRQ(SPW0_IRQn);   
}
//---------------------------------------------------------------------------------------------
// // // // 7.16.6  Передача сообщений
// // // // Для передачи пакета необходимо:
// // // // 1  Определить  номер  по  порядку  NUM_TXDESC  дескриптора TXDESC[i],
// // // //     определяющего передаваемый пакет;
// // // // 2  В TXDESC[i] задать тип передаваемого пакета EEP или EOP битами 29…30;
// // // // 3  Задать размер битами 0...24;
// // // // 4  Инициировать передачу установкой бита 31;
// // // // 5  Если пакет ненулевой заполнить данными FIFOTX.
int i = 0;
void Send_SPW_Message(){
   MDR_SPW0->TXDESC[i] |= 1<<29;    // EOP packet
   MDR_SPW0->TXDESC[i] |= 4<<0;       // TX_data size
   MDR_SPW0->TXDESC[i] |= 1<<31;    // Start_TX
   
   MDR_SPW0->FIFOTX   = 0xAAAAAAAA;
}
//---------------------------------------------------------------------------------------------
#define CH_STATE_ERR_RST         BIN8(00000000)   
#define CH_STATE_ERR_WAIT         BIN8(00000001)
#define CH_STATE_READY            BIN8(00000010)
#define CH_STATE_STARTED         BIN8(00000011)
#define CH_STATE_CONNECTING      BIN8(00000100)
#define CH_STATE_RUN            BIN8(00000101)

void INT_SPW0_Handler(void){
   
   uint32_t status = MDR_SPW0->STATUS;
   if(status & CH_STATE_ERR_RST){
   }
   if(status & CH_STATE_ERR_WAIT){
   }
   if(status & CH_STATE_READY){
      
   }
   if(status & CH_STATE_STARTED){
   }
}
//---------------------------------------------------------------------------------------------
Закрыть


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

Зарегистрирован: 2017-май-31 15:10
Сообщения: 16
Откуда: АО "ПКК Миландр"
_oleg_ писал(а):
Подскажите как настроить SpaceWire контроллер + встроенный PHY.
В соответствии с диаграммой состояний (Figure 8‐4 ECSS‐E‐ST-50-12C) контроллер должен пройти следующие состояния:
- ErrorReset (Сброс);
- ErrorWait (Ожидание);
- Ready (Готовность);
- Started (Запуск);
- Connecting (Соединение);
- Run (Рабочий режим).
И можно настроить прерывание на изменение состояния контроллера.
Но получается, что контроллер сразу оказывается в состоянии Ready и прерывания не работают.
Далее из состояния Ready контроллер должен перейти в состояние Started и начать отправлять нули (Table 8.1 ECSS‐E‐ST-50-12C). Этого также не происходит, но биты LINKSTART и AUTOSTART установлены.
Каким образом затактировать встроенный PHY: CLK_CNTR->SPHY0_CLK |=1<<16; ?
Код:
Открыть
Код:
void Init_SpaceWire(void){
// //    CLKCTRL_PER0_CLKcmd(CLKCTRL_PER0_CLK_MDR_PORTB_EN, ENABLE);
// //    
// //    PORT_InitStructure.PORT_Pin         = PORT_Pin_4 | PORT_Pin_5;
// //    PORT_InitStructure.PORT_SOE            = PORT_SOE_OUT;
// //    PORT_InitStructure.PORT_SFUNC        = PORT_SFUNC_14;
// //    PORT_InitStructure.PORT_SANALOG    = PORT_SANALOG_DIGITAL;
// //    PORT_InitStructure.PORT_SPULLUP      = PORT_SPULLUP_OFF;
// //    PORT_InitStructure.PORT_SPULLDOWN   = PORT_SPULLDOWN_OFF;
// //    PORT_InitStructure.PORT_SPWR          =   PORT_SPWR_300;
// //   PORT_Init(PORTB, &PORT_InitStructure);
// //    
// //    PORT_InitStructure.PORT_Pin         = PORT_Pin_3;
// //    PORT_InitStructure.PORT_SOE            = PORT_SOE_IN;
// //    PORT_Init(PORTB, &PORT_InitStructure);   
// //    
// //    PORT_InitStructure.PORT_Pin         = PORT_Pin_2;
// //    PORT_InitStructure.PORT_SFUNC        = PORT_SFUNC_12;
// //    PORT_InitStructure.PORT_SOE            = PORT_SOE_IN;
// //    PORT_Init(PORTB, &PORT_InitStructure);   

   CLKCTRL_PER0_CLKcmd(CLKCTRL_PER0_CLK_MDR_SPW0_EN, ENABLE);   
   // clock + divider
   CLK_CNTR->SPHY0_CLK    |=1<<16;
   CLK_CNTR->SPW0_CLK    |=1<<16;
   
   // //CLK_CNTR->SPHY1_CLK |=1<<16;
   // //CLK_CNTR->SPW1_CLK  |=1<<16;
   // PHY
   MDR_SPW0->PHY_CNTR   |=    (BIN8(10000000))<<10;   // Вход подстройки внутреннего резистора источника опорного тока
   MDR_SPW0->PHY_CNTR   |=  1<<9;                           // Сигнал разрешения работы блока REF для SPW
   MDR_SPW0->PHY_CNTR   |=   (BIN8(00000100))<<6;   // Вход цифрового тримминга источника опорного напряжения Типовое значение 100 (1,2 В).
   MDR_SPW0->PHY_CNTR   |=  1<<4;                           // Разрешение работы приёмопередатчика
   // SPW
   MDR_SPW0->DIV            |= 8<<8;         // Делитель для задания скорости передачи данных в канал связи SpaceWire равной 10Мбит/c
   MDR_SPW0->DIV            |= 1<<0;         // Делитель для задания скорости передачи данных в канал связи SpaceWire .
   
   MDR_SPW0->PAUSE         |= 512<<8;      // Количество тактов частоты контроллера необходимое на интервал работы счетчика 6.4 мкс
   MDR_SPW0->PAUSE         |= 68<<0;         // Количество тактов частоты контроллера необходимое на интервал работы счетчика 850 нс (80 MHz)
   
   MDR_SPW0->CONTROL      |= 1<<2;         // Разрешение перехода блока Linkinterface из состояния Ready в состояние Started (Fig 8-2 ECSS‐E‐ST-50-12C)
   MDR_SPW0->CONTROL      |= 1<<3;         // Разрешение перехода блока Linkinterface из состояния Ready в состояние Started с ожиданием символа NULL (Fig 8-2 ECSS‐E‐ST-50-12C)   
   MDR_SPW0->CONTROL      |= 1<<0;         // Разрешение работы интерфейса SpaceWire Установка бита в единицу разрешается только после инициализации регистров SPW_DIV и SPW_PAUSE.   
//    MDR_SPW0->CONTROL      |= 1<<9;         // Разрешение прерывание при наличии в FIFO приёмника хотя бы одного 32-x разрядного слова данных
   MDR_SPW0->CONTROL      |= 1<<6;         // Разрешение прерывания при изменении статуса соединения (соединение установлено/соединение разорвано)

   NVIC_EnableIRQ(SPW0_IRQn);   
}
//---------------------------------------------------------------------------------------------
// // // // 7.16.6  Передача сообщений
// // // // Для передачи пакета необходимо:
// // // // 1  Определить  номер  по  порядку  NUM_TXDESC  дескриптора TXDESC[i],
// // // //     определяющего передаваемый пакет;
// // // // 2  В TXDESC[i] задать тип передаваемого пакета EEP или EOP битами 29…30;
// // // // 3  Задать размер битами 0...24;
// // // // 4  Инициировать передачу установкой бита 31;
// // // // 5  Если пакет ненулевой заполнить данными FIFOTX.
int i = 0;
void Send_SPW_Message(){
   MDR_SPW0->TXDESC[i] |= 1<<29;    // EOP packet
   MDR_SPW0->TXDESC[i] |= 4<<0;       // TX_data size
   MDR_SPW0->TXDESC[i] |= 1<<31;    // Start_TX
   
   MDR_SPW0->FIFOTX   = 0xAAAAAAAA;
}
//---------------------------------------------------------------------------------------------
#define CH_STATE_ERR_RST         BIN8(00000000)   
#define CH_STATE_ERR_WAIT         BIN8(00000001)
#define CH_STATE_READY            BIN8(00000010)
#define CH_STATE_STARTED         BIN8(00000011)
#define CH_STATE_CONNECTING      BIN8(00000100)
#define CH_STATE_RUN            BIN8(00000101)

void INT_SPW0_Handler(void){
   
   uint32_t status = MDR_SPW0->STATUS;
   if(status & CH_STATE_ERR_RST){
   }
   if(status & CH_STATE_ERR_WAIT){
   }
   if(status & CH_STATE_READY){
      
   }
   if(status & CH_STATE_STARTED){
   }
}
//---------------------------------------------------------------------------------------------
Закрыть

В коде отсутствует разрешение работы приёмопередатчика в регистре MDR_SPW0->PHY_CNTR. За это отвечает второй бит EN_PHY.

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


Последний раз редактировалось Artem1 2017-сен-06 08:56, всего редактировалось 1 раз.

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

Зарегистрирован: 2016-апр-27 12:14
Сообщения: 22
Artem1, спасибо. Действительно просмотрел EN_PHY. При установке этого бита после этого происходит подтяжка линий. Но кроме этого ничего не меняется. Сейчас пытаюсь связать коммутатор Spacewire 1892КП1Я (http://multicore.ru/index.php?id=1372) и отладочную плату 1986ВЕ8Т. Если взять таблицу Table 8‐1: Example of initialization sequence из ECSS‐E‐ST‐50‐12C, то получается, что коммутатор действует как end A: стартует и начинает отправлять нули. Отладочная плата 1986ВЕ8 (End B) получает от коммутатора последовательность, соответствующую 8.5.3.2 gotNULL (011101000). На SPW_RXD на отладочной плате это видно при помощи осциллографа. Скорость передачи - 10 МБит. После этого End B должен перейти в состояние Started. Но этого не происходит, он находится в состоянии Ready (MDR_SPW0->STATUS = 0x00000402) независимо от того, подключен ли коммутатор.
Открыть Table 8‐1 Example of initialization sequence
Вложение:
Table 8‐1  Example of initialization sequence.PNG
Table 8‐1 Example of initialization sequence.PNG [ 295.76 КБ | Просмотров: 457 ]
Закрыть


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

Зарегистрирован: 2016-апр-27 12:14
Сообщения: 22
Подниму тему. Так и не удалось завести Spacewire.
Имеются две платы. Отладочная и собственной разработки.
В отладку сейчас вставлен 1986ВЕ81Т выпуск 1726, на нашей плате
установлен 1986ВЕ8Т выпуск 1725. При соединении плат не происходит
ничего. Регистр STATUS не меняется (значение 0x402)
Попробовал также подключить напрямую две платы без встроенного PHY.
То есть:
PB0 => PB2
PB1 => PB3
PB2 => PB0
PB3 => PB1
GND => GND

Результат такой же. При подключении ничего не происходит.
Регистр STATUS не меняется. При подключении осциллографа
к любой из линий на экране тишина.

Таким образом, возникли вопросы вопросы:
Распространяются ли на данные контроллеры ошибки 0031 и 0032?
Если этих ошибок нет, то в чем может быть проблема?
Код инициализации привожу.
Открыть
Код:
void Init_SpaceWire(void){

      PORT_InitTypeDef PORT_InitStructure;   
      
      CLKCTRL_PER0_CLKcmd(CLKCTRL_PER0_CLK_MDR_PORTB_EN, ENABLE);
      
      PORT_InitStructure.PORT_Pin         = PORT_Pin_0 | PORT_Pin_1;
      PORT_InitStructure.PORT_SOE            = PORT_SOE_OUT;
      PORT_InitStructure.PORT_SFUNC        = PORT_SFUNC_14;
      PORT_InitStructure.PORT_SANALOG    = PORT_SANALOG_DIGITAL;
      PORT_InitStructure.PORT_SPULLUP      = PORT_SPULLUP_OFF;
      PORT_InitStructure.PORT_SPULLDOWN   = PORT_SPULLDOWN_OFF;
      PORT_InitStructure.PORT_SPWR          =   PORT_SPWR_300;
      
      PORT_Init(PORTB, &PORT_InitStructure);
      
      PORT_InitStructure.PORT_Pin         = PORT_Pin_2| PORT_Pin_3;
      PORT_InitStructure.PORT_SOE            = PORT_SOE_IN;
      PORT_Init(PORTB, &PORT_InitStructure);   

   CLKCTRL_PER0_CLKcmd(CLKCTRL_PER0_CLK_MDR_SPW0_EN, ENABLE);   
   // clock + divider
   CLK_CNTR->SPHY0_CLK |=1<<16;
   CLK_CNTR->SPW0_CLK    |=1<<16;
   /*
      // PHY
      MDR_SPW0->PHY_CNTR   |=    (BIN8(10000000))<<10;   // Вход подстройки внутреннего резистора источника опорного тока
      MDR_SPW0->PHY_CNTR   |=  1<<9;                           // Сигнал разрешения работы блока REF для SPW
      MDR_SPW0->PHY_CNTR   |=   (BIN8(00000100))<<6;   // Вход цифрового тримминга источника опорного напряжения Типовое значение 100 (1,2 В).
      MDR_SPW0->PHY_CNTR   |=  1<<2;                           // Разрешение работы приёмопередатчика
      MDR_SPW0->PHY_CNTR   |=  1<<4;                           // Разрешение передачи приёмопередатчика
   */
   MDR_SPW0->DIV            |= 8<<8;         // Делитель для задания скорости передачи данных в канал связи SpceWire равной 10Мбит/c (Работа до перехода в состояние Run)
   MDR_SPW0->DIV            |= 1<<0;         // Делитель для задания скорости передачи данных в канал связи SpceWire (в режиме Run).
//  Частота тактирования  - 80 MHz   
   MDR_SPW0->PAUSE         |= 512<<8;      // Количество тактов частоты контроллера необходимое на интервал работы счетчика 6.4 мкс
   MDR_SPW0->PAUSE         |= 68<<0;         // Количество тактов частоты контроллера необходимое на интервал работы счетчика 850 нс
   
   MDR_SPW0->CONTROL      |= 1<<1;      // Перевод блока Linkinterface из состояния Run в состояние ErrorReset
   MDR_SPW0->CONTROL      |= 1<<4;         // Разрешение прерывания при приёме маркера времени
   MDR_SPW0->CONTROL      |= 1<<5;         // Разрешение прерывания при возникновении одной из ошибок: DSCERR, PERR, ESCERR или CREDERR
   MDR_SPW0->CONTROL      |= 1<<6;         // Разрешение прерывания при изменении статуса соединения (соединение установлено/соединение разорвано)
   MDR_SPW0->CONTROL      |= 1<<9;         // Разрешение прерывание при наличии в FIFO приёмника хотя бы одного 32-x разрядного слова данных
   MDR_SPW0->CONTROL      |= 1<<13;         //Разрешение прерывания по завершению приёма пакета данных с признаком конца пакета
   MDR_SPW0->CONTROL      |= 1<<14;         //Разрешение прерывания по завершению передачи пакета данных с признаком конца пакета

   MDR_SPW0->CONTROL      |= 1<<0;         // Разрешение работы интерфейса SpaceWire Установка бита в единицу разрешается только после инициализации регистров SPW_DIV и SPW_PAUSE.   
   
   MDR_SPW0->CONTROL      |= 1<<2;         // Разрешение перехода блока Linkinterface из состояния Ready в состояние Started (Fig 8-2 ECSS‐E‐ST-50-12C)
   MDR_SPW0->CONTROL      |= 1<<3;         // Разрешение перехода блока Linkinterface из состояния Ready в состояние Started с ожиданием символа NULL (Fig 8-2 ECSS‐E‐ST-50-12C)   


   NVIC_EnableIRQ(SPW0_IRQn);   
}
//---------------------------------------------------------------------------------------------
#define CH_STATE_ERR_RST         BIN8(00000000)   
#define CH_STATE_ERR_WAIT         BIN8(00000001)
#define CH_STATE_READY            BIN8(00000010)
#define CH_STATE_STARTED         BIN8(00000011)
#define CH_STATE_CONNECTING         BIN8(00000100)
#define CH_STATE_RUN            BIN8(00000101)

void INT_SPW0_Handler(void){
   
   SPW_CONTROLLER_STATE = MDR_SPW0->STATUS;
   if(SPW_CONTROLLER_STATE & CH_STATE_ERR_RST){
   }
   if(SPW_CONTROLLER_STATE & CH_STATE_ERR_WAIT){
   }
   if(SPW_CONTROLLER_STATE & CH_STATE_READY){
   }
   if(SPW_CONTROLLER_STATE & CH_STATE_STARTED){
   }
   if(SPW_CONTROLLER_STATE & CH_STATE_CONNECTING){
      connect_attempt++;
   }
   
}
//---------------------------------------------------------------------------------------------
Закрыть


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

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


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

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


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

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