реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC1778 Прерывания, Reset
srg_co
сообщение Jan 10 2018, 21:45
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Доброго времени суток!

Keil 5.23 + Jet-Link ultra, Pack: Keil.LPC1700_DFP 2.4.0
Для SSP использую CMSIS Keil.
Контроллер LPC1778, используемые девайсы: три таймера, 5 UART, MCI, TRC, DAC, 3 SSP, WDT (при отладке отключен).
Наблюдается проблема при обработки прерывания от SSP1 после сброса reset-ом.

Инициализация SSP1
Код
extern ARM_DRIVER_SPI Driver_SPI1;
static ARM_DRIVER_SPI *SpiDrv;

    SpiDrv = &Driver_SPI1;
    SpiDrv->Initialize( NULL );
    #ifdef PRIORITY_SSP1
        NVIC_SetPriority( SSP1_IRQn, PRIORITY_SSP1 );
    #endif
    SpiDrv->PowerControl( ARM_POWER_FULL );
    SpiDrv->Control( ARM_SPI_MODE_MASTER | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_SW | ARM_SPI_DATA_BITS( 16 ), 1000000 );
    SpiDrv->Control( ARM_SPI_CONTROL_SS, ARM_SPI_SS_INACTIVE );


Обмен данными через SSP1 рулит прерывание от одного из входов GPIO, инициализация
Код
    GPIO_IntCmd( PORT0, IRQ_485_MASK, 1 );  //Falling edge
    NVIC_ClearPendingIRQ( GPIO_IRQn );
    NVIC_SetPriority( GPIO_IRQn, PRIORITY_GPIO );
    NVIC_EnableIRQ( GPIO_IRQn );

Тут вопросов нет, все работает.

Инициализация SSP2
Код
extern ARM_DRIVER_SPI Driver_SPI2;
static ARM_DRIVER_SPI *SpiDrv;

    SpiDrv = &Driver_SPI2;
    SpiDrv->Initialize( &CallBackSPI2 );
    #ifdef PRIORITY_SSP2
        NVIC_SetPriority( SSP2_IRQn, PRIORITY_SSP2 );
    #endif
    SpiDrv->PowerControl( ARM_POWER_FULL );
    SpiDrv->Control( ARM_SPI_MODE_SLAVE | ARM_SPI_CPOL0_CPHA0 | ARM_SPI_MSB_LSB | ARM_SPI_SS_SLAVE_HW | ARM_SPI_DATA_BITS( 8 ), SSP2_SPEED );
    SpiDrv->Receive( &recv_data, 1 );


Обработка прерывания SSP2:
Код
static void CallBackSPI2( uint32_t event ) {
    if ( event & ARM_SPI_EVENT_TRANSFER_COMPLETE ) {
        flg_recv = true;
        ////////////////////////// переключаем пин для контроля работы
        if ( GPIO_PinRead( TRC_PORT, EXT_RT ) )
            GPIO_PinWrite( TRC_PORT, EXT_RT, 0 );
        else GPIO_PinWrite( TRC_PORT, EXT_RT, 1 );
       }
}


Из main-while(1)

Код
void SPIFlowCtrl( void ) {
    if ( flg_recv == true ) {
        flg_recv = false;
        SpiDrv->Receive( &recv_data, 1 );
  }
}


Приоритеты прерываний:
Код
//CMSIS NXP
#define PRIORITY_TIMER0         1
#define PRIORITY_TIMER1         2
#define PRIORITY_TIMER2         3

//CMSIS Keil
#define PRIORITY_USART0         5
#define PRIORITY_USART1         6
#define PRIORITY_USART2         7
#define PRIORITY_USART3         8
#define PRIORITY_USART4         9

//CMSIS Keil
#define PRIORITY_SSP0           10
#define PRIORITY_SSP1           11
#define PRIORITY_SSP2           12

//CMSIS NXP
#define PRIORITY_GPIO           13
#define PRIORITY_RTC            17


Пока не подключил прием одного байта:
Код
SpiDrv->Receive( &recv_data, 1 );
через SSP2, все работало четко без проблем.
Проблема наблюдается в следующем образом:
При включении питания все запускается и работает.
Если нажать reset (внешняя кнопка) начинаются проблемы с обработкой прерывания от SSP1, канал 1 – прерывание от SSP2 мастер передает 1 байт с интервалом 1 сек, канал2 – прерывание от SSP1

а должно быть так


Если контроллер запустить в режиме отладки F5, потом «Stop», сделать пару шагов и выйти – все продолжает работать нормально.
Перезапуск от WDT тоже приводит к кривой работе.
Как только убираю из кода строку SpiDrv->Receive( &recv_data, 1 ) (SSP2) – все работает.
После включения питания в RSID установлены биты: POR и EXTR, а после reset или выхода из отладки: POR EXTR SYSRESET.

Схема reset стандартная. Поломал уже весь мозг, не могу понять причину, может кто-то сталкивался с подобной проблемой ?

Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 10 2018, 23:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(srg_co @ Jan 10 2018, 23:45) *
Как только убираю из кода строку SpiDrv->Receive( &recv_data, 1 ) (SSP2) – все работает.

Видимо там и стоит искать причину. laughing.gif
А если к уже работающему устройству подключиться отладчиком, то выставив в свойствах подключения JTAG тип сброса с помощью внешней ноги, можно вероятно дотрассировать код до места бага.

PS: Что за тайный смысл установки в одном изделии JTAG и SWD одновременно? Нужно было срочно израсходовать побольше разъёмов? cool.gif
Go to the top of the page
 
+Quote Post
srg_co
сообщение Jan 11 2018, 06:55
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 131
Регистрация: 22-03-05
Из: Краснодар
Пользователь №: 3 600



Изделие штучное, кол-во разъемов не регламентировано.


У меня нет уверенности что проблема в функции Receive, ее код одинаков для всех SSP, для каждого драйвера свой отдельный экземпляр.
Она бы глючила при любых вариантах запуска контроллера.
Go to the top of the page
 
+Quote Post
AlexG
сообщение Jan 11 2018, 07:31
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 50
Регистрация: 10-05-12
Пользователь №: 71 756



Если что-то ведет себя по разному в зависимости от того, как был запущен контроллер, то очень вероятно что где-то есть неинициализированный регистр, мусор в котором и вызывает такое поведение.
Go to the top of the page
 
+Quote Post
Obam
сообщение Jan 11 2018, 18:46
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663



Цитата(jcxz @ Jan 11 2018, 03:08) *
PS: Что за тайный смысл установки в одном изделии JTAG и SWD одновременно? Нужно было срочно израсходовать побольше разъёмов? cool.gif

Растрассированный JTAG даёт SWD "на халяву" (и у JLINK, и у STLINKv2 wink.gif )


--------------------
Пролетарий умственного труда.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jan 11 2018, 19:29
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Obam @ Jan 11 2018, 20:46) *
Растрассированный JTAG даёт SWD "на халяву" (и у JLINK, и у STLINKv2 wink.gif )

Я имел в виду разъёмы.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 03:40
Рейтинг@Mail.ru


Страница сгенерированна за 0.02952 секунд с 7
ELECTRONIX ©2004-2016