Форум технической поддержки по продуктам и услугам 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) неиспользуемый параметр pI2C и переменная CtrlI2C : функция в любом случае возвращает I2C_CTRL_NUM{ CTRL_T CtrlI2C = I2C_CTRL_NUM; return CtrlI2C; } файл 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/ |