Миландр

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

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




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

Зарегистрирован: 2016-апр-27 12:14
Сообщения: 20
Подскажите как настроить 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
Сообщения: 6
_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


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

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


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

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


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

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