Форум технической поддержки по продуктам и услугам

ООО "НПП "Цифровые решения"
Текущее время: 26 дек 2024, 16:15

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу Пред.  1, 2, 3
Автор Сообщение
 Заголовок сообщения: Re: Процессор "Спутник"
СообщениеДобавлено: 09 фев 2018, 15:07 

Зарегистрирован: 23 июн 2017, 12:43
Сообщения: 2
Алексей писал(а):
Алексей писал(а):
Доброго времени суток. Не получается разобраться с spi test, а точнее при передаче с spi1 на spi2 в буфер Slave_Rx_Buf ничего не идёт(постоянно 0) или так и должно быть?

Правильно ли я понял то что при передаче с MOSI spi1 на MOSI sp2 должен быть такой же сигнал?



По моему опыту работы с проц. Спутник, чтобы в буфере SPI_buf появился принятый байт, надо считать еще раз . Проверьте, если считывать несколько байт подряд (на MISO) , то принятые байты появляются с задержкой на 1 чтение.
Чтобы считать байт, после чтения по SPI я ставлю выборку (CS) в "1", затем еще раз считываю.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессор "Спутник"
СообщениеДобавлено: 06 апр 2018, 12:59 

Зарегистрирован: 06 апр 2018, 11:03
Сообщения: 4
Откуда: Саратов
Здравствуйте, возникли вопросы по работе с вашим процессором и библиотеке.
1. Мне необходимо реализовать проект в котором:
6 каналов UART ведут прием пакетов (16 байтных) на скорости 115200 и (возможно по DMA) раскладывают принятые пакеты по
буферам. Каналы равноприоритетные. Я пока не определился хватит ли производительности с прерываниями по заполнению
FIFO или надо, все таки, использовать прерывания от DMA
1 прерывание от ноги GPIO
1 МПКД в режиме ОУ

Хотелось бы "рыбу" проекта (желательно под gcc eclipse).

2. Некоторые замечания по биоблиотеке
и для IAR и для GCC в библиотеке есть несколько ошибок:
файл i2c.c
Код:
CTRL_T I2C_GetCtrlNum(I2C_T *pI2C)
{
    CTRL_T CtrlI2C = I2C_CTRL_NUM;
    return CtrlI2C;
}
неиспользуемый параметр pI2C и переменная CtrlI2C : функция в любом случае возвращает I2C_CTRL_NUM

файл mkpd.c
Код:
void MKPD_Set_System_Clock(MKPD_T *pMKPD, uint32_t sys_clk)
{
    pMKPD->SETTING0 = (pMKPD->SETTING0 & ~(0xFF << 24)) | MKPD_SETTING0_SYS_CLK(sys_clk-1);
}

из-за того, что в define макроса MKPD_SETTING0_SYS_CLK параметр x не экранирован скобками, то результат будет неправильным
Код:
#define MKPD_SETTING0_SYS_CLK(x)        ((uint32_t)((x & 0xFF) << 24))          /**< системная частота в МГц */

а должно быть
Код:
#define MKPD_SETTING0_SYS_CLK(x)        ((uint32_t)(((x) & 0xFF) << 24))          /**< системная частота в МГц */

вообще такая ошибка (с не экранированием скобками параметра макроса) присутствует в многих макросах

файл fpu.c
в нем часто встречается конструкция
Код:
    if (-1<A<1)
может IAR это и одобряет, но видимо должно быть
Код:
    if ((A > -1) && (A < 1))

Код:
float FPU_tg(float A)
{
    if (-1<A<1)
    {
        float T = FPU_pow3(A);                                                   ///< A^3           
        float X = FPU_ADD(A,3);                                                 ///< A + A^3/3     
        float Y = FPU_MUL(FPU_MUL(FPU_pow3(A),A),A);             ///< A^5           
        float res = FPU_ADD(X,2*Y/15);                                      ///< A + A^3/3 +  2*A^5/15
        return res;
если верить коментариям, то правильно
Код:
float FPU_tg(float A)
{
    if ((A > -1) && (A < 1))
    {
        float T = FPU_pow3(A);                                                  ///< A^3           
        float X = FPU_ADD(A,(float)T/3);                                    ///< A + A^3/3
        float Y = FPU_MUL(FPU_MUL(T,A),A);                              ///< A^5
        float res = FPU_ADD(X,2*Y/15);                                     ///< A + A^3/3 +  2*A^5/15
        return res;

аналогично в других функциях
Код:
float FPU_atg(float A)
{
    if (-1<A<1)
    {
        float T = FPU_pow3(A);                                                  ///< A^3           
        float X = FPU_SUB(A,3);                                                 ///< A - A^3/3     
        float Y = FPU_MUL(FPU_MUL(FPU_pow3(A),A),A);                            ///< A^5           
        float res = FPU_ADD(X,2*Y/15);                                          ///< A - A^3/3 +  2*A^5/15
        return res;

float FPU_atg(float A)
{
    if ((A > -1) && (A < 1))
    {
        float T = FPU_pow3(A);                                                  ///< A^3           
        float X = FPU_SUB(A,(float)T/3);                                        ///< A - A^3/3
        float Y = FPU_MUL(FPU_MUL(T,A),A);                                      ///< A^5
        float res = FPU_ADD(X,2*Y/15);                                          ///< A - A^3/3 +  2*A^5/15
        return res;

В таблице векторов gcc прописаны не все вектора
и вообще файл vector_DEVICE.c для gcc лучше оформить в виде
Код:
// ----------------------------------------------------------------------------
#include "cortexm/ExceptionHandlers.h"

// ----------------------------------------------------------------------------

void Default_Handler(void);
// Forward declaration of the specific IRQ handlers. These are aliased
// to the Default_Handler, which is a 'forever' loop. When the application
// defines a handler (with the same name), this will automatically take
// precedence over these weak definitions
//
void Timer_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Watchdog_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void UART_1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void UART_2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void UART_3_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void UART_4_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void SPI_1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void SPI_2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_A_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_B_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_C_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_D_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_E_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_F_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_G_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void GPIO_H_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Spacewire1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Spacewire2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void CAN1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void CAN2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Manchester1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Manchester2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Manchester3_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void Manchester4_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_SPI_1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_SPI_2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_UART_1_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_UART_2_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_UART_3_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
void DMA_DONE_UART_4_IRQ(void)__attribute__ ((weak, alias("Default_Handler")));
// ----------------------------------------------------------------------------

extern unsigned int _estack;

typedef void
(* const pHandler)(void);

// ----------------------------------------------------------------------------

// The vector table.
// This relies on the linker script to place at correct location in memory.

__attribute__ ((section(".isr_vector"),used))
pHandler __isr_vectors[] =
  { //
    (pHandler) &_estack,                          // The initial stack pointer
        Reset_Handler,                            // The reset handler

        NMI_Handler,                              // The NMI handler
        HardFault_Handler,                        // The hard fault handler

#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
        MemManage_Handler,                        // The MPU fault handler
        BusFault_Handler,// The bus fault handler
        UsageFault_Handler,// The usage fault handler
#else
        0, 0, 0,              // Reserved
#endif
        0,                                        // Reserved
        0,                                        // Reserved
        0,                                        // Reserved
        0,                                        // Reserved
        SVC_Handler,                              // SVCall handler
#if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
        DebugMon_Handler,                         // Debug monitor handler
#else
        0,                 // Reserved
#endif
        0,                                        // Reserved
        PendSV_Handler,                           // The PendSV handler
        SysTick_Handler,                          // The SysTick handler

        // ----------------------------------------------------------------------
        // DEVICE vectors
   Timer_IRQ,                  // Device specific
   Watchdog_IRQ,
   UART_1_IRQ,
   UART_2_IRQ,
   UART_3_IRQ,
   UART_4_IRQ,
   SPI_1_IRQ,
   SPI_2_IRQ,
   GPIO_A_IRQ,
   GPIO_B_IRQ,
        GPIO_C_IRQ,
   GPIO_D_IRQ,
   GPIO_E_IRQ,
   GPIO_F_IRQ,
   GPIO_G_IRQ,
   GPIO_H_IRQ,
   Spacewire1_IRQ,
   Spacewire2_IRQ,
        CAN1_IRQ,
   CAN2_IRQ,
        Manchester1_IRQ,
   Manchester2_IRQ,
   Manchester3_IRQ,
   Manchester4_IRQ,
   0,
   0,
   DMA_DONE_SPI_1_IRQ,
   DMA_DONE_SPI_2_IRQ,
   DMA_DONE_UART_1_IRQ,
   DMA_DONE_UART_2_IRQ,
   DMA_DONE_UART_3_IRQ,
   DMA_DONE_UART_4_IRQ,
    };

// ----------------------------------------------------------------------------

// Processor ends up here if an unexpected interrupt occurs or a specific
// handler is not present in the application code.

void __attribute__ ((section(".after_vectors")))
Default_Handler(void)
{
  while (1)
    {
    }
}
// ----------------------------------------------------------------------------

хотя я и не понимаю где должны быть обработчики UART5, UART6 и соответствующие DMA

_________________
С Уважением, Круглов Сергей


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессор "Спутник"
СообщениеДобавлено: 06 апр 2018, 18:22 

Зарегистрирован: 19 янв 2017, 18:28
Сообщения: 10
Здравствуйте, Сергей.

Благодарим за найденные ошибки в библиотеке. Сейчас мы ведем активную работу над новой версией библиотеки и примеров для процессора. Ваши замечания в данном случае очень полезны.
Полноценную "рыбу" проекта предоставить не можем, однако можем помочь с реализацией вашей задумки.

1)Есть пример кода для настройки DMA+UART на прием:
Код:
// Настройка DMA
        DMA->CFG = 1;
        DMA->CTRL_BASE_PTR =  (uint32_t) &DMA_UART_CTRL;
        DMA->CHNL_ENABLE_SET = (1<<7);     
        DMA_UART_CTRL.prim_chan[7].src_data_end_ptr = (uint32_t)UART2_BASE;
        DMA_UART_CTRL.prim_chan[7].dst_data_end_ptr = (uint32_t)&test_rx_buffer[600-1];
        DMA_UART_CTRL.prim_chan[7].ctrl = DMA_CCTRL_BASIC | DMA_NEXT_USEBURST_DIS | \
                                       DMA_N_MINUS_1(600-1) | DMA_R_POWER(4) | \
                                       DMA_SRC_PROT_CACHE_DIS | DMA_SRC_PROT_BUFFER_DIS | DMA_SRC_PROT_PRIVILEGE_DIS | \
                                       DMA_DST_PROT_CACHE_DIS | DMA_DST_PROT_BUFFER_DIS | DMA_DST_PROT_PRIVILEGE_DIS | \
                                       DMA_SRC_DATA_SIZE_BYTE | DMA_SRC_ADDR_INC_NULL | \
                                       DMA_DST_DATA_SIZE_BYTE | DMA_DST_ADDR_INC_BYTE; 
        CMN_REG->DMA_INTR_FLAGS &=(~(1<<7));
        dma_tx_done = 0;
        UART2->DMACR |= UART_DMACR_RXDMAE;                                      // разрешение использования DMA при передаче


Код:
Пример обработчика прерывания:

void DMA_UART_2_RX_IRQ(void)
{       
    dma_tx_done = 1;
    UART2->DMACR &= (~UART_DMACR_TXDMAE);                                       // запрещение использования DMA при передаче
    UART2->DMACR &=(~UART_DMACR_RXDMAE);                                        // запрещение использования DMA при приеме
    CMN_REG->DMA_INTR_FLAGS &=(~(1<<7));
    CMN_REG->DMA_INTR_FLAGS  |=(1<<7);                                          // Флаг прерываний DMA для UART2 TX
}


Где 600 - это размер входных данных. Также сейчас ведется разработка соответствующего примера для демонстрации. Если это актуально можем выложить сюда или отправить на почту по мере готовности

2) Работа МКПД в режиме ОУ демонстрируется в примере. В некоторых версиях библиотеки есть существенный косяк:
Командное слово, принятое ОУ возвращается из регистра BTCWO3 (функция MKPD_Get_Endpoint_Command_Word(MKPD_T *pMKPD)). Правильное КС будет лежать в регистре EP3 (есть информация в актуальном ТО).

3) В версии файла описания прерываний для gcc - это недоработка, будет исправлена в следующей ревизии библиотеки и примеров.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессор "Спутник"
СообщениеДобавлено: 06 апр 2018, 18:30 

Зарегистрирован: 06 апр 2018, 11:03
Сообщения: 4
Откуда: Саратов
Спасибо за быстрый ответ, буду ждать новую версию (хотя и сам понемногу разбираюсь).
Если будут какие-то промежуточные варианты - лучше на почту.

Если буду использовать DMA и прерывания от него, настраивать и разрешать прерывания от самого порта не надо (вроде как лишнее)?
Порты только на прием.

_________________
С Уважением, Круглов Сергей


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессор "Спутник"
СообщениеДобавлено: 09 апр 2018, 12:39 

Зарегистрирован: 19 янв 2017, 18:28
Сообщения: 10
Сергей, приветствую.
Прерывание от самого порта настраивать не требуется, достаточно настроить прерывание только от DMA. Выше выкладывал код настройки DMA, можно добавить строчку NVIC_EnableIRQ(DMA_UART_2_RX,4). Где 4 - номер вектора прерывания согласно файлу startup.s


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессор "Спутник"
СообщениеДобавлено: 11 апр 2018, 12:38 

Зарегистрирован: 06 апр 2018, 11:03
Сообщения: 4
Откуда: Саратов
Можно ли с демо платой и адаптером Jetlink9 использовать Segger RTT для отладки? Что-то у меня не получается.
И вопрос по прерываниям от FIFO UART:
есть ли режим в котором прерывание вызывается по заданному порогу FIFO ИЛИ таймауту 2 символов?
Просто передача пакетная и для входа в синхронизацию это удобно:
прерывание или по приходу полного пакета или пакет не полный и пауза между пакетами.

_________________
С Уважением, Круглов Сергей


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессор "Спутник"
СообщениеДобавлено: 11 апр 2018, 14:32 

Зарегистрирован: 19 янв 2017, 18:28
Сообщения: 10
Сергей, режим отладки при помощи Segger RTT ни разу не использовали. Отлаживались только через IAR. Если будет информация от нескольких потребителей об актуальности данного метода, то думаю данный вопрос будет проработан. А информация будет включена в очередной CD с примерами.

Режим генерации прерывания по заданному порогу буфера FIFO в блоке UART есть. Об этом можно прочитать в актуальном ТО на микросхему (последняя версия 2.05). На странице 196 приводится описание регистра IFLS.
В коде можно вызвать функцию:
Код:
UART_SetupFIFOS(UART2, UART_IFLS_1DIV8, UART_IFLS_1DIV8);
, которая настраивает пороги срабатывания прерывания по заполнению части буфера FIFO. В обработчике прерывания можно вызвать функцию:
Код:
UART_Read(UART2,rxbuff,32);
.
В rxbuff будет лежать принятый пакет.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Процессор "Спутник"
СообщениеДобавлено: 11 апр 2018, 16:49 

Зарегистрирован: 06 апр 2018, 11:03
Сообщения: 4
Откуда: Саратов
C UART разобрался, включил прерывания от FIFO и таймаута - работает.

Заработало RTT:
После запуска отладчика надо было в его консоли дать monitor exec SetRTTSearchRanges 0x20000000 0x20000
И прекрасно идет отладочный ввод\вывод через telnet или jlink rtt viewer (естественно проект собирается вместе с пактом RTT)

_________________
С Уважением, Круглов Сергей


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

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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