Jump to content

    

cinema_effect

Участник
  • Content Count

    45
  • Joined

  • Last visited

Community Reputation

0 Обычный

About cinema_effect

  • Rank
    Участник
  • Birthday 10/14/1987

Recent Profile Visitors

1403 profile views
  1. Добрый день, коллеги! Дано: процессор ARM cortex m3 LPC1769, ОСРВ RTX-Keil, 512 kB on-chip FLASH ROM, 64 kB RAM. Есть обоснованные опасения, что оперативной памяти не хватит, соответственно вопрос: как выбрать тип внешней ОЗУ и по каким интерфейсам ее подключить к процессору, где взять драйвер на память?
  2. Спасибо большое за помощь! и за выложенный код. Нашел ошибку в своем, при инициализации SSP не так был сконфигурирован Pin, что и привело к ошибке. Не то значение в регистр, и CLK не работает, а соответственно и SPI. А надо было LPC_PINCON->PINSEL0 |= (0x2UL<<30); (вместо LPC_PINCON->PINSEL0 |= (0x3UL<<30);). P.S. Смотрел на логическом анализаторе вместо USB приставки ))
  3. С вычитыванием какого принятого? что то я не сообразил, это Вы про буфер? А в примерах используется прерывание, вот и подумал, что оно необходимо.
  4. Спасибо за совет, естественно первоначально я именно так и поступил, после чего и выявлена данная проблема и вынесена на всеобщее обсуждение в топик. Скорее всего, как мне кажется, дело лежит в обработке прерываний, так как при инициализации SPI я никак не обозначил обработчик прерываний, да и собственно саму процедуру прерываний для него не описал. Сейчас мучаюсь над совмещением обработчика прерываний с операционной системой, которая вертится на ядре (RTX Keil)
  5. Добрый день, коллеги! Возникла проблема при работе с интерфейсом SSP на ARM LPC1769. Для начала я инициализировал интерфейс: 1) В регистре PCONP - Power Control 2) PCLKSEL - Clock (поставил cclk/4) 3) PINSEL - выставил требуемые значения для CLK,SSEL,MISO,MOSI 4) SSP0CR0 - выставил 0x000F, что соответствует 16 битной передаче, CPOL=0 и CPHA=0 SSP0CR1 - выставил 0x0000, что соответствует режиму MASTER, затем выставил бит SSE=1 в этом регистре, что соответствует: The SSP controller will interact with other devices on the serial bus. Software should write the appropriate control information to the other SSP registers and interrupt controller registers, before setting this bit. 5) SSP0CPSR - выставил второй бит. Таким образом инициализация интерфейса SSP выглядит так: void SSP0Init( void ) { uint8_t i; uint16_t Dummy=Dummy; //Changed to uint16_t /* Enable AHB clock to the SSP0. */ LPC_SC->PCONP |= (0x1<<21); /* Further divider is needed on SSP0 clock. Using default divided by 4 */ LPC_SC->PCLKSEL1 &= ~(0x3<<10); /* P0.15~0.18 as SSP0 */ LPC_PINCON->PINSEL0 &= ~(0x3UL<<30); LPC_PINCON->PINSEL0 |= (0x3UL<<30); LPC_PINCON->PINSEL1 &= ~((0x3<<0)|(0x3<<2)|(0x3<<4)); LPC_PINCON->PINSEL1 |= ((0x2<<0)|(0x2<<2)|(0x2<<4)); /* Set DSS data to 8-bit, Frame format SPI, CPOL = 0, CPHA = 0, and SCR is 15 */ LPC_SSP0->CR0 = 0x000F; LPC_SSP0->CR1 = 0x0000; //ADD by ME /* SSPCPSR clock prescale register, master mode, minimum divisor is 0x02 */ LPC_SSP0->CPSR = 0x2; for ( i = 0; i < FIFOSIZE; i++ ) { Dummy = LPC_SSP0->DR; /* clear the RxFIFO */ } // /* Master mode */ LPC_SSP0->CR1 = SSPCR1_SSE; /* Set SSPINMS registers to enable interrupts */ /* enable all error related interrupts */ LPC_SSP0->IMSC = SSPIMSC_RORIM | SSPIMSC_RTIM; return; } При отладке видно, что все пины инициализированы как надо и SSP работает в формате SPI. В main добавил: for ( i = 0; i < 1000; i++ ) { uint8_t *k; k = (uint8_t *) i; sprintf(text, "0x%04X", k); GLCD_DisplayString (7, 8, 1, (unsigned char *)text); SSPSend( 0, (uint16_t *) text, 16); os_dly_wait (100); } Однако SPI не работает, осциллограф показывает следующее (синий -MOSI, красный - CLK) Функция передачи данных: void SSPSend( uint32_t portnum, uint16_t *buffer, uint32_t Length ) { uint32_t i; uint16_t Dummy = Dummy; for ( i = 0; i < Length; i++ ) { /* Move on only if NOT busy and TX FIFO not full. */ while ( (LPC_SSP0->SR & (SSPSR_TNF|SSPSR_BSY)) != SSPSR_TNF ); LPC_SSP0->DR = *buffer; buffer++; /* Wait until the Busy bit is cleared. */ while ( LPC_SSP0->SR & SSPSR_BSY ); } return; } Почему на осциллографе не видно сигналов CLK и MOSI по сути ни каких данных не выставляет, а только выдает импульсы напряжения?
  6. А проблемы с лицензиями на микровижн у Вас нет? У меня было нечто подобное пока не "пролицензировал" микровижн
  7. Интересно, буду пробовать, спасибо Вам
  8. А как проверить в генерящей задаче ждет ли кто то флаг?
  9. Разносторонние ответы... Ладно, спасибо, буду дальше разбираться
  10. Спасибо, точно именно этого и не хватало! Сейчас заработало и выводится то, что нужно. Конечно еще остались некоторые проблемы, видимо не правильно использую функцию os_evt_ХХХ. Насколько я понял из документации, os_evt_set (флаг, task) - устанавливает флаг и соответствующую ему задачу. os_evt_wait_or (флаг, время ожидания флага) - должна быть прописана в task и как раз и ждет флага. когда os_evt_set (флаг, task) устанавливает этот флаг, os_evt_wait_or (флаг, время ожидания флага) дождавшись его начинает выполнение соответствующего task os_evt_clear (флаг, task) - когда нужно ее применять и где правильно необходимо применять?
  11. Вроде разобрался тут с RTX, переписал task'и и заставил делать ОС различные задачки. Вроде все работало, однако потом решил все-таки что-нибудь вывести по COM. как только появляется функция printf - опять сразу ломается, на том же месте... Хм...... /*---------------------------------------------------------------------------- * RL-ARM - USB *---------------------------------------------------------------------------- * Name: USBD_Demo.c * Purpose: USB Device Demonstration * Rev.: V4.20 *---------------------------------------------------------------------------- * This code is part of the RealView Run-Time Library. * Copyright (c) 2004-2011 KEIL - An ARM Company. All rights reserved. *---------------------------------------------------------------------------*/ #include <RTL.h> #include <rl_usb.h> #include "GLCD.h" #include <LPC17xx.h> #include "KBD.h" #include "stdio.h" extern void getline (char *, int); /* external function: input line */ extern int getkey (void); /* external function: input character */ OS_TID t_UART; /* assigned task id of task: lights */ OS_TID t_keyread; /* assigned task id of task: keyread */ OS_TID t_Command_to_GLSD_from_Joystick; /* Add by Me */ OS_TID t_USB_Out_report; /* Add by Me */ __task void keyread (void); __task void Command_to_GLSD_from_Joystick (void); __task void USB_Out_report (void); __task void UART (void); /*---------------------------------------------------------------------------- * Task 1 'init': Initialize *---------------------------------------------------------------------------*/ __task void init (void) { GLCD_Init (); GLCD_Clear (Blue); GLCD_SetBackColor (Blue); GLCD_SetTextColor (White); GLCD_DisplayString (4, 0, 1, " USB HID "); GLCD_DisplayString (5, 0, 1, " DRM Manage "); KBD_Init (); os_tsk_prio_self(100); usbd_init(); /* USB Device Initialization */ usbd_connect(__TRUE); /* USB Device Connect */ t_keyread = os_tsk_create (keyread,0); /* start keyread task */ t_Command_to_GLSD_from_Joystick = os_tsk_create (Command_to_GLSD_from_Joystick, 0); os_tsk_delete_self(); /* Terminate Task */ } int main (void) { os_sys_init(init); /* Init RTX and start 'init' */ // t_keyread = os_tsk_create (keyread,0); // t_Command_to_GLSD_from_Joystick = os_tsk_create (Command_to_GLSD_from_Joystick, 0); } ///*---------------------------------------------------------------------------- // * Task 2 'keyread' // *---------------------------------------------------------------------------*/ __task void keyread (void) { while (1) { /* endless loop */ if (INT0_Get() == 0) { /* if key pressed */ os_evt_set (0x0010, t_UART); /* send signal to task UART */ } if (KBD_Get () !=0x079) { os_evt_set (0x0004, t_Command_to_GLSD_from_Joystick); } } } ///*---------------------------------------------------------------------------- // * Task 3 'Command_to_GLSD_from_Joystick' // *---------------------------------------------------------------------------*/ __task void Command_to_GLSD_from_Joystick (void) { uint32_t kbd_val; while (1) { os_evt_wait_or (0x0004, 0xffff); kbd_val = (LPC_GPIO1->FIOPIN >> 20) & KBD_MASK; if ((kbd_val & KBD_UP) == 0) GLCD_DisplayString (4, 0, 1, " USB UP ");/* up pressed means 0 */ if ((kbd_val & KBD_LEFT) == 0) GLCD_DisplayString (5, 0, 1, " USB Left "); /* left pressed means 0 */ if ((kbd_val & KBD_RIGHT) == 0) GLCD_DisplayString (6, 0, 1, " USB Right "); /* right pressed means 0 */ if ((kbd_val & KBD_SELECT) == 0) GLCD_DisplayString (7, 0, 1, " USB Select "); /* select pressed means 0 */ if ((kbd_val & KBD_DOWN) == 0) GLCD_DisplayString (8, 0, 1, " USB Down "); /* down pressed means 0 */ } } ///*---------------------------------------------------------------------------- // * Task 4 'UART' // *---------------------------------------------------------------------------*/ __task void UART (void) { while (1) { os_evt_wait_or (0x0010, 0xffff); // printf ("\nCommand: "); os_dly_wait (50); } } Стоит разкомментировать строчку с printf в task UART и сразу же те же проблемы
  12. А есть возможность использовать FLASH-память?
  13. В случае разкомментированного кода: отладчик в файле startup_LPC17xx.s проходит SystemInit, доходит до __main и после на строчку BX R0. После этого в окне "Disassembly" попадает на строчку BEAB BKPT 0xAB и там останавливается... Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main
  14. Спасибо! Действительно там лежала, родимая! И работает) А вот проблема, озвученная/написанная в начале темы, так и не исчезла... Наверное я с операционной системой неправильно работаю? Если в режиме отладки смотреть, то запущен task os_idle_demon, остальные (USBD_RTX_Core и USBD_RTX_EndPoint1) находятся в состоянии wait_or. Если же строчки моего кода раскомментировать, то вообще все ломается... и даже в режиме отладки не работает
  15. А не могли бы Вы подсказать на каком конкретно торренте? Ибо я искал Bushound и на торрентах тоже... Не нашел (