Миландр

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

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




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

Зарегистрирован: 2016-апр-27 12:14
Сообщения: 21
Подскажите как настроить 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
Сообщения: 13
Откуда: АО "ПКК Миландр"
_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
Сообщения: 21
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 КБ | Просмотров: 182 ]
Закрыть


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

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


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

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


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

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