Форум технической поддержки по продуктам и услугам
http://forum.dsol.ru/

Процессор "Спутник"
http://forum.dsol.ru/viewtopic.php?f=5&t=11
Страница 3 из 3

Автор:  Сергей Дятков [ 09 фев 2018, 15:07 ]
Заголовок сообщения:  Re: Процессор "Спутник"

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

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



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

Автор:  TJ27 [ 06 апр 2018, 12:59 ]
Заголовок сообщения:  Re: Процессор "Спутник"

Здравствуйте, возникли вопросы по работе с вашим процессором и библиотеке.
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

Автор:  grifill [ 06 апр 2018, 18:22 ]
Заголовок сообщения:  Re: Процессор "Спутник"

Здравствуйте, Сергей.

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

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 - это недоработка, будет исправлена в следующей ревизии библиотеки и примеров.

Автор:  TJ27 [ 06 апр 2018, 18:30 ]
Заголовок сообщения:  Re: Процессор "Спутник"

Спасибо за быстрый ответ, буду ждать новую версию (хотя и сам понемногу разбираюсь).
Если будут какие-то промежуточные варианты - лучше на почту.

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

Автор:  grifill [ 09 апр 2018, 12:39 ]
Заголовок сообщения:  Re: Процессор "Спутник"

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

Автор:  TJ27 [ 11 апр 2018, 12:38 ]
Заголовок сообщения:  Re: Процессор "Спутник"

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

Автор:  grifill [ 11 апр 2018, 14:32 ]
Заголовок сообщения:  Re: Процессор "Спутник"

Сергей, режим отладки при помощи 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 будет лежать принятый пакет.

Автор:  TJ27 [ 11 апр 2018, 16:49 ]
Заголовок сообщения:  Re: Процессор "Спутник"

C UART разобрался, включил прерывания от FIFO и таймаута - работает.

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

Страница 3 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/