logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Pytania o tryb Idle, USB -Virtual Com oraz pamięć RAM

Petros 03 Lis 2009 19:02 5563 25
  • #1 7211203
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    Witam
    Programuje ARM7 od miesiąca w c więc proszę o wyrozumiałość i litość...
    1. Jak powinien wyglądać kod z obsługą trybu idle? Kiedy wchodzić w ten tryb. Kiedy wpisuję PCON|=1; na końcu obsługi przerwania uC wiesza się. W pętli głównej main() niby działa ale pobiera 27mA (tak być powinno?), przerwania "budzą" go z tego stanu.

    2.Wiem że może działać usb w trybie Virtual Com. Czyli jeśli napiszę na PC program wysyłające znaki np do portu szeregowego COM4 to USB bedzie odbierać dane?
    Gdzie znajdę jakieś procedury do tego USB ? bo widze że to bardziej skomplikowana sprawa.

    3. Jak w środowisku Code Sourcery + Eclipse sprawdzić zajętość pamięci RAM ?
  • Pomocny post
    #2 7212042
    wojtekkk09
    Poziom 15  
    Posty: 99
    Pomógł: 15
    Ocena: 2
    Witam,

    pominąłeś najważniejszą informację - jakiego mikrokontrolera używasz?

    Ad.1. LPC2138 w trybie IDLE pobiera przy zegarze 60MHz około 12mA trzeba do tego jeszcze doliczyć pobór mocy przez peryferia, które nie zostały wyłączone (timery, I2C, Uarty etc.), więc jeżeli taktujesz swój procesor i peryferia dużym zegarem, to wartość ta jeszcze podskoczy(oczywiście zakładam rodzinę LPC). Dlatego ważne, aby przed wejściem w tryb IDLE powyłączać niepotrzebne peryferia (rejestr PCONP) a może nawet zwiększyć dzielnik zegara dla peryferiów (PBDIV).

    Ad.2 Prosta w użyciu jest biblioteka LPCUSB. Nie wiem tylko czy będzie się nadawała do Twojego mikrokontrolera.

    Ad.3 arm-none-eabi-size wyświetla użycie flash i ram, jednak stosów i stert tym nie sprawdzisz

    Pozdrawiam
    wojt
  • #3 7212230
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    sorry . procesor to LPC2144 zegar 60 mhz

    gdzie znajdę wykresy zależnośći pobór prądu od zegara itp ? w manualu nie znalazłem

    gdzie znajde to lpcusb?

    aha.. jeszcze jedna sprawa.. Ile cykli zegara zajmuje włączenie trybu Idle oraz wyjście z niego?
  • Pomocny post
    #4 7212849
    wojtekkk09
    Poziom 15  
    Posty: 99
    Pomógł: 15
    Ocena: 2
    Jedyne wykresy jakie są mi znane znajdują się w nocie aplikacyjnej AN10421, są one dla mikrokontrolera LPC2138, ale rdzeń jest ten sam i peryferia podobne. Do tego LPC2138 ma więcej pamięci RAM, więc myślę, że możesz te dane traktować jako górną granicę pobieranej mocy.

    LPCUSB jest pierwszym wynikiem wyszukiwarki Google...

    pozdrawiam
    wojt
  • #5 7214469
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    Wielkie dzięki

    A jak wygląda z tym trybem idle? Ile taktów zegara zajmuje jego włączenie oraz wyłączenie, np. o ile taktów wydłuży się przejscie do obsługi przerwania w stosunku do trybu normalnej pracy?
  • #6 7240218
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    Walcze z tym LPCUSB... dołączyłem biblioteki do swojego projektu i wrzuciłem procedury z pliku main_serial.c do własnego pliku main.
    Kompiluje się bezłędnie.
    Dochodzi do momentu "Starting USB communication"
    Potem wchodzi w pętle główną ale Windows cały czas wyświetla "Nieznane urządzenie USB"

    D+ i D- Mam przez opornik 45ohm
    D+ podciągnięte do 3,3 V
    Vbus do zasilania usb

    znalazłem też to jako alternatywe dla LPCUSB
    http://www.nxp.com/acrobat_download/applicationnotes/AN10420_1.pdf
    gdzie można pobrać opisywane biblioteki w tym dokumencie?
  • #8 7240823
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    dzięki. Musze ściagać całego Keil'a? Nie ma bibliotek osobno?
    Chicłaem pobrać z oficjalnej strony Keila ale prosi mnie o numer licencji

    A może ktoś wie dlaczego ten LPCUSB nie działa:
    
    
    
    #include <stdint.h>
    #include "itoa.h"
    #include "inc/LPC214x.h"
    #include "armint.h"
    #include "config.h"
    
    #include "hdr/hdr_scb.h"
    #include "hdr/hdr_mam.h"
    #include "system.h"
    #include "czekaj.h"
    #include "hd44780.h"
    
    
    #include <string.h>			// memcpy
    
    #include "type.h"
    #include "armVIC.h"
    
    //#include "console.h"
    //#include "usbdebug.h"
    #include "usbapi.h"
    
    #include "serial_fifo.h"
    //a
    
    
    
    #define	INT_VECT_NUM	0
    
    
    
    #define IRQ_MASK 0x00000080
    
    #define BAUD_RATE	115200
    
    #define INT_IN_EP		0x81
    #define BULK_OUT_EP		0x05
    #define BULK_IN_EP		0x82
    
    #define MAX_PACKET_SIZE	64
    
    #define LE_WORD(x)		((x)&0xFF),((x)>>8)
    
    // CDC definitions
    #define CS_INTERFACE			0x24
    #define CS_ENDPOINT				0x25
    
    #define	SET_LINE_CODING			0x20
    #define	GET_LINE_CODING			0x21
    #define	SET_CONTROL_LINE_STATE	0x22
    
    // data structure for GET_LINE_CODING / SET_LINE_CODING class requests
    typedef struct {
    	U32		dwDTERate;
    	U8		bCharFormat;
    	U8		bParityType;
    	U8		bDataBits;
    } TLineCoding;
    
    static TLineCoding LineCoding = {115200, 0, 0, 8};
    static U8 abBulkBuf[64];
    static U8 abClassReqData[8];
    
    static U8 txdata[VCOM_FIFO_SIZE];
    static U8 rxdata[VCOM_FIFO_SIZE];
    
    static fifo_t txfifo;
    static fifo_t rxfifo;
    
    // forward declaration of interrupt handler
    static void USBIntHandler(void) __attribute__ ((interrupt("IRQ")));
    /*
    +=============================================================================+
    | module variables
    +=============================================================================+
    */
    
    
    /*
    +=============================================================================+
    | local functions' declarations
    +=============================================================================+
    */
    
    
    uint8_t counter;
    
    static const U8 abDescriptors[] = {
    
    // device descriptor
    	0x12,
    	DESC_DEVICE,
    	LE_WORD(0x0101),			// bcdUSB
    	0x02,						// bDeviceClass
    	0x00,						// bDeviceSubClass
    	0x00,						// bDeviceProtocol
    	MAX_PACKET_SIZE0,			// bMaxPacketSize
    	LE_WORD(0xFFFF),			// idVendor
    	LE_WORD(0x0005),			// idProduct
    	LE_WORD(0x0100),			// bcdDevice
    	0x01,						// iManufacturer
    	0x02,						// iProduct
    	0x03,						// iSerialNumber
    	0x01,						// bNumConfigurations
    
    // configuration descriptor
    	0x09,
    	DESC_CONFIGURATION,
    	LE_WORD(67),				// wTotalLength
    	0x02,						// bNumInterfaces
    	0x01,						// bConfigurationValue
    	0x00,						// iConfiguration
    	0xC0,						// bmAttributes
    	0x32,						// bMaxPower
    // control class interface
    	0x09,
    	DESC_INTERFACE,
    	0x00,						// bInterfaceNumber
    	0x00,						// bAlternateSetting
    	0x01,						// bNumEndPoints
    	0x02,						// bInterfaceClass
    	0x02,						// bInterfaceSubClass
    	0x01,						// bInterfaceProtocol, linux requires value of 1 for the cdc_acm module
    	0x00,						// iInterface
    // header functional descriptor
    	0x05,
    	CS_INTERFACE,
    	0x00,
    	LE_WORD(0x0110),
    // call management functional descriptor
    	0x05,
    	CS_INTERFACE,
    	0x01,
    	0x01,						// bmCapabilities = device handles call management
    	0x01,						// bDataInterface
    // ACM functional descriptor
    	0x04,
    	CS_INTERFACE,
    	0x02,
    	0x02,						// bmCapabilities
    // union functional descriptor
    	0x05,
    	CS_INTERFACE,
    	0x06,
    	0x00,						// bMasterInterface
    	0x01,						// bSlaveInterface0
    // notification EP
    	0x07,
    	DESC_ENDPOINT,
    	INT_IN_EP,					// bEndpointAddress
    	0x03,						// bmAttributes = intr
    	LE_WORD(8),					// wMaxPacketSize
    	0x0A,						// bInterval
    // data class interface descriptor
    	0x09,
    	DESC_INTERFACE,
    	0x01,						// bInterfaceNumber
    	0x00,						// bAlternateSetting
    	0x02,						// bNumEndPoints
    	0x0A,						// bInterfaceClass = data
    	0x00,						// bInterfaceSubClass
    	0x00,						// bInterfaceProtocol
    	0x00,						// iInterface
    // data EP OUT
    	0x07,
    	DESC_ENDPOINT,
    	BULK_OUT_EP,				// bEndpointAddress
    	0x02,						// bmAttributes = bulk
    	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
    	0x00,						// bInterval
    // data EP in
    	0x07,
    	DESC_ENDPOINT,
    	BULK_IN_EP,					// bEndpointAddress
    	0x02,						// bmAttributes = bulk
    	LE_WORD(MAX_PACKET_SIZE),	// wMaxPacketSize
    	0x00,						// bInterval
    
    	// string descriptors
    	0x04,
    	DESC_STRING,
    	LE_WORD(0x0409),
    
    	0x0E,
    	DESC_STRING,
    	'L', 0, 'P', 0, 'C', 0, 'U', 0, 'S', 0, 'B', 0,
    
    	0x14,
    	DESC_STRING,
    	'U', 0, 'S', 0, 'B', 0, 'S', 0, 'e', 0, 'r', 0, 'i', 0, 'a', 0, 'l', 0,
    
    	0x12,
    	DESC_STRING,
    	'D', 0, 'E', 0, 'A', 0, 'D', 0, 'C', 0, '0', 0, 'D', 0, 'E', 0,
    
    // terminating zero
    	0
    };
    
    
    /**
    	Local function to handle incoming bulk data
    
    	@param [in] bEP
    	@param [in] bEPStatus
     */
    static void BulkOut(U8 bEP, U8 bEPStatus)
    {
    	int i, iLen;
    
    	if (fifo_free(&rxfifo) < MAX_PACKET_SIZE) {
    		// may not fit into fifo
    		return;
    	}
    
    	// get data from USB into intermediate buffer
    	iLen = USBHwEPRead(bEP, abBulkBuf, sizeof(abBulkBuf));
    	for (i = 0; i < iLen; i++) {
    		// put into FIFO
    		if (!fifo_put(&rxfifo, abBulkBuf[i])) {
    			// overflow... :(
    			ASSERT(FALSE);
    			break;
    		}
    	}
    }
    
    
    /**
    	Local function to handle outgoing bulk data
    
    	@param [in] bEP
    	@param [in] bEPStatus
     */
    static void BulkIn(U8 bEP, U8 bEPStatus)
    {
    	int i, iLen;
    
    	if (fifo_avail(&txfifo) == 0) {
    		// no more data, disable further NAK interrupts until next USB frame
    		USBHwNakIntEnable(0);
    		return;
    	}
    
    	// get bytes from transmit FIFO into intermediate buffer
    	for (i = 0; i < MAX_PACKET_SIZE; i++) {
    		if (!fifo_get(&txfifo, &abBulkBuf[i])) {
    			break;
    		}
    	}
    	iLen = i;
    
    	// send over USB
    	if (iLen > 0) {
    		USBHwEPWrite(bEP, abBulkBuf, iLen);
    	}
    }
    
    
    /**
    	Local function to handle the USB-CDC class requests
    
    	@param [in] pSetup
    	@param [out] piLen
    	@param [out] ppbData
     */
    static BOOL HandleClassRequest(TSetupPacket *pSetup, int *piLen, U8 **ppbData)
    {
    	switch (pSetup->bRequest) {
    
    	// set line coding
    	case SET_LINE_CODING:
    DBG("SET_LINE_CODING\n");
    		memcpy((U8 *)&LineCoding, *ppbData, 7);
    		*piLen = 7;
    DBG("dwDTERate=%u, bCharFormat=%u, bParityType=%u, bDataBits=%u\n",
    	LineCoding.dwDTERate,
    	LineCoding.bCharFormat,
    	LineCoding.bParityType,
    	LineCoding.bDataBits);
    		break;
    
    	// get line coding
    	case GET_LINE_CODING:
    DBG("GET_LINE_CODING\n");
    		*ppbData = (U8 *)&LineCoding;
    		*piLen = 7;
    		break;
    
    	// set control line state
    	case SET_CONTROL_LINE_STATE:
    		// bit0 = DTR, bit = RTS
    DBG("SET_CONTROL_LINE_STATE %X\n", pSetup->wValue);
    		break;
    
    	default:
    		return FALSE;
    	}
    	return TRUE;
    }
    
    
    /**
    	Initialises the VCOM port.
    	Call this function before using VCOM_putchar or VCOM_getchar
     */
    void VCOM_init(void)
    {
    	fifo_init(&txfifo, txdata);
    	fifo_init(&rxfifo, rxdata);
    }
    
    
    /**
    	Writes one character to VCOM port
    
    	@param [in] c character to write
    	@returns character written, or EOF if character could not be written
     */
    int VCOM_putchar(int c)
    {
    	return fifo_put(&txfifo, c) ? c : EOF;
    }
    
    
    /**
    	Reads one character from VCOM port
    
    	@returns character read, or EOF if character could not be read
     */
    int VCOM_getchar(void)
    {
    	U8 c;
    
    	return fifo_get(&rxfifo, &c) ? c : EOF;
    }
    
    
    /**
    	Interrupt handler
    
    	Simply calls the USB ISR, then signals end of interrupt to VIC
     */
    static void USBIntHandler(void)
    {
    	USBHwISR();
    	VICVectAddr = 0x00;    // dummy write to VIC to signal end of ISR
    }
    
    
    static void USBFrameHandler(U16 wFrame)
    {
    	if (fifo_avail(&txfifo) > 0) {
    		// data available, enable NAK interrupt on bulk in
    		USBHwNakIntEnable(INACK_BI);
    	}
    }
    
    
    
    
    
    
    int main(void)  ////////////////////////MAIN/////////////////////
    {
    	int c;
    	system_init();
    	pll_start(CRYSTAL, FREQUENCY);
    
    	//LED_DIR = 0xFF;
    	// LED pin - output
    	FIO0DIR|= 0xFF;
    	LcdInit();
    	LcdSendCmd(LCD_L1);
    	LcdTxt("ARM7");
    	//FIO1DIR = 0xFFFFFFFF;
    	//FIO1CLR = 0xFFFFFFFF;
    //	Uart0_init(115200, 8, 1);
    //	przerwanie_zew_init();
    //	timery_init();
    	//ConsoleInit(60000000 / (16 * BAUD_RATE));
    
    		DBG("Initialising USB stack\n");
    	LcdSendCmd(LCD_L1);
    	DBG("Init\n");
    	LcdTxt("Init");
    
    		// initialise stack
    		USBInit();
    
    		// register descriptors
    		USBRegisterDescriptors(abDescriptors);
    
    		// register class request handler
    		USBRegisterRequestHandler(REQTYPE_TYPE_CLASS, HandleClassRequest, abClassReqData);
    
    		// register endpoint handlers
    		USBHwRegisterEPIntHandler(INT_IN_EP, NULL);
    		USBHwRegisterEPIntHandler(BULK_IN_EP, BulkIn);
    		USBHwRegisterEPIntHandler(BULK_OUT_EP, BulkOut);
    
    		// register frame handler
    		USBHwRegisterFrameHandler(USBFrameHandler);
    
    		// enable bulk-in interrupts on NAKs
    		USBHwNakIntEnable(INACK_BI);
    
    		// initialise VCOM
    		VCOM_init();
    
    		////
    		LcdTxt("Strt");
    
    		// set up USB interrupt
    		VICIntSelect &= ~(1<<22);               // select IRQ for USB
    		VICIntEnable |= (1<<22);
    
    		(*(&VICVectCntl0+INT_VECT_NUM)) = 0x20 | 22; // choose highest priority ISR slot
    		(*(&VICVectAddr0+INT_VECT_NUM)) = (int)USBIntHandler;
    
    		enable_irq();
    
    		// connect to bus
    		USBHwConnect(TRUE);
    
    
    	LcdTxt("4");
    	while (1)
    	{
    
    		c = VCOM_getchar();
    				if (c != -1) {
    					// show on console
    					if ((c == 9) || (c == 10) || (c == 13) || ((c >= 32) && (c <= 126))) {
    						//DBG("%c", c);
    						LcdN(c);
    					}
    					else {
    						//DBG(".");
    						LcdTxt(".");
    					}
    					VCOM_putchar(c);
    					LcdTxt("z");
    				}
    
    		//LcdTxt("5");
    		//PCON|=1;
    
    
    
    	  //  LcdSendCmd(LCD_L1+0);
    	 //   LcdN(T0TC);
    	//LcdSendCmd(LCD_L2+5);
    	//LcdN(counter);
    	//czekaj(9000000);
    	//FIO0SET=1<<5;
    	//czekaj(9000000);
    	//FIO0CLR=1<<5;
    								// change LED state
    	}
    }
    
    
    void przerwanie_zew_init(void)
    {
    	//alternatywna funkcja dla p0.30 EINT3
    	PINSEL1&=(0x2)<<28;
    	PINSEL1|=(0x2)<<28;
    	//ustwienie wyzwalania
    	EXTMODE |=1<<3;
    	EXTPOLAR|=1<<3;
    	//kasuje wystapienie przerwania
    	EXTINT = 1<<3;
    	VICVectAddr0 = (unsigned int)Irq_Eint3;
    	// irq wlacz i przypisz kanal 17
    	VICVectCntl0 = (1<<5) | K_EINT3;
    	//kanał 17 enable
    	VICIntEnable = 1<<K_EINT3;
    }
    
    void timery_init(void)
    {
    	//prescaler
    	T0PR = 60000 -1;
    	//zachowanie timera, zerowanie, resetowanie, przerwanie
    	T0MCR |=  (1<<0) | (1<<3) | (1<<6) | (1<<9);
    	//Przerwanie 0 licznika 0
    	T0MR0 = 1000-1;
    //	T0MR1 = 5000-1;
    //	T0MR2 = 26700-1;
    //	T0MR3 = 30000-1;
    
    	// włacz timer
    	T0TCR = 1;
    	//obsluga przerwania
    	VICVectAddr1 = (unsigned int)Irq_Tim0;
    	// irq wlacz i przypisz kanał
    	VICVectCntl1 = (1<<5) | K_TIM0;
    	VICIntEnable = 1<<K_TIM0;
    }
    
    void Uart0_init(uint32_t bound, uint8_t bit, uint8_t stop)
    {
    	uint16_t dzielnik;
    	// funkcje alternatywne dla P0.0 i P0.1
    	PINSEL0 |= (1) | (1<<2);
    	//Bit 8 pozwalający na zapisa dielników
    	U0LCR |= 1<<7;
    	dzielnik = FREQUENCY/bound/16;
    	U0DLL= (unsigned char)dzielnik;
    	U0DLM =(unsigned char) (dzielnik>>8);
    	//bity danych i bity stopu
    	U0LCR = ((bit-5)<<0) | ((stop-1)<<2);
    	//kolejka fifo
    	U0FCR = 1;
    	//Przerwania
    	VICVectAddr2 = (unsigned int)Irq_Uart0;
    	// irq wlacz i przypisz kanał
    	VICVectCntl2 = (1<<5) | K_UART0;
    	VICIntEnable = 1<<K_UART0;
    	U0IER=1;
    
    }
    
    
    
    

    jest to przerobiony projekt Frrediego Chopina

    dziekuje za wszelką pomoc
  • Pomocny post
    #9 7240855
    Konto nie istnieje
    Konto nie istnieje  
  • #10 7240874
    neoklata
    Poziom 13  
    Posty: 49
    Pomógł: 3
    Ocena: 1
    Petros napisał:
    dzięki. Musze ściagać całego Keil'a? Nie ma bibliotek osobno?
    Chicłaem pobrać z oficjalnej strony Keila ale prosi mnie o numer licencji



    Moze gdzies sa udostepnione na stronie te zrodla (musialbys poszukac), nie pamietam dokladnie (ale wydaje mi sie ze sa dolaczone z instalką).
    wersje demo Keila mozna pobrac po rejestracji: https://www.keil.com/demo/eval/arm.htm

    Edit:
    Tu sa jakies przykladowe projekty dla ARMów ale nie widze CDC są za to inne klasy

    http://www.keil.com/download/list/arm.htm
  • #11 7241108
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    albertb napisał:
    LPCUSB działa. I u mnie, i u wielu innych osób.
    Sprawdź, czy wywołuje się przerwanie USB, sprawdź także czy nie masz pomyłki przy podłączeniu. Częste jest złe podciąganie lub krosowanie kabelków.
    Wtedy PC chce gadać z urządzeniem LowSpeed a tego LPC nie potrafi.

    Albert


    ma ktoś poprawny schemat połczenia?
    Znalazłem tylko ten
    ale sprzeczny jest z opisem złącz USB:
    Pytania o tryb Idle, USB -Virtual Com oraz pamięć RAM
    rysunki są sprzczne albo tylko mi sie zdaje?

    zrobiłem tak jak tu:
    Pytania o tryb Idle, USB -Virtual Com oraz pamięć RAM

    Po podłączniu wtyku usb windows wyświtla komunikat "NIE ROZPOZNANO URZĄDZNIA USB ......"
    Reakca jest taka sama niezalęznie czy LPC jest zaslilony lub nie.
    Jak zdiagnozować usterkę?
    Po podłączeniu powinno zostać wywołane przerwanie?

    może ktoś przynajmniej da hex'a żebym mógł sprawdzić połączenia?
  • #12 7243507
    Konto nie istnieje
    Konto nie istnieje  
  • #13 7243548
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    albertb napisał:
    Schemat jest dobry, ale sprawdź miernikiem we wtyczce.
    Czy powinno zostać wykonane przerwanie?
    Jeśli Ty w funkcji main() nie obsługujesz zapytań hosta,
    ani nie zrobi tego przerwanie to kto przedstawi się PC-towi?
    A jeśli nikt, to nawet Winows 8.5 nie będzie na tyle mądry aby rozpoznać urządzenie ;-)

    Poza tym nurtuje mnie pytanie, dlaczego zmieniłeś zalecane 33Ohm na 44?
    Ja bym się odważył na takie eksperymenty dopiero na działającym połączeniu, chociaż po co? W wielu schematach widziałem także kondensatory do masy na liniach sygnałowych.
    U mnie jest 33Ohm i 18pF.

    A propos wcześniejszego pytania:
    http://www.standardics.nxp.com/support/documents/microcontrollers/zip/an10420.zip

    Ale moim zdaniem LPCUSB jest lepiej napisany

    Albert


    czyli jak powinien wyglądać kod? USB to skomplikowany temat dla mnie.
    Rozumiem że komputer wysyła jakieś zapytania a ja mam odpowiedzieć na nie, ale jak i czym ?? Przerwanie wywołuje się praktycznie cały czas niezależnie czy wtyk usb jest podłączony lub nie.
    Zmieniłem 33 ohm na 45 ohm ponieważ to niewielka różnica i chyba nic nie zmieni? Kondensatory mam na liniach D+ i D- po 20pF. Windows zawsze pokazuje ten sam błąd niezależnie czy procesor działa czy nie. wystarczy że D+ ma pullup do 3.3V.
    Czy D+ może być na stałe podciągnięte do 3,3V czy musi być dołączony do P0.31/CONNECT ?
    Jaka jest w końcu kolejność sygnałów we wtyczce USB ?
    1. +
    2. D -
    3.D+
    4. - ?? jeśli tak to dlaczego LPC w swoim katalogu oznaczył inaczej?
    Może ktoś mi wytłumaczyć jak skompilować LPCUSB za pomocą CodeSourcery i Eclipse ? Albo jak dołączyć te biblioteki do własnego projektu ponieważ CodeSourcery nie trawi chyba dołączonego makefile, albo po prostu wysłać gotowy projekt dla tego kompilatora.. ?
  • #14 7243578
    Konto nie istnieje
    Konto nie istnieje  
  • #15 7243610
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    albertb napisał:
    Jeśli dostaniesz podwyżkę mniejszą niż 44% to poproszę na moje konto, ponieważ to nieduża różnica i chyba nic nie zmieni?

    jutro sprawdzę.
    albertb napisał:

    USB to jest skomplikowany kod i trzeba się z nim zmierzyś lub korzystać z gotowców jak FTDI.

    Od tego powinny być biblioteki. Pozatym w opisie LPCUSB jest niby cały przykład do którego nie trzeba nic dopisywać i urządznie ma zostać wykyte przez system windows i prosić o sterowniki. Przykład Virtual Com ponoć ma wysyłać echo danych wysyłanych z terminalu, i nie wymaga modydfikacji. Jeśli się myle to wyślij uzupełnione pliki.
    Gdybym chiał bawić się FTDI zostałbym przy AVR a nie walczył z ARM
    albertb napisał:

    Nie może być na stałe podciągnięte. Możesz podpiąć dopiero wtedy, jak Twój MCU jest gotowy na odpowiadanie hostowi.

    Rozumię, doczytałem już.
    albertb napisał:

    Kompilwać należy normalnie jak wszystkie inne programy. W razie błedów czytać komunikaty i poprawiać.

    To wiem, ale chodzi mi o to czy podmienić pliki makefile i crt.s. Standardowe powodują jeden błąd bez opisu "Error1*** make"
  • Pomocny post
    #16 7244279
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Błąd praktycznie ZAWSZE ma opis, tyle że nie zawsze wyświetla się w zakładce Problems w Eclipse. Dotyczy to zwłaszcza błędów które mają niewiele wspólnego z plikami *.c, *.h i *.S. W takim wypadku trzeba pogrzebać w zakładce Console.

    Co do pinoutów, to ja zawsze szukam na www.pinouts.ru albo w wikipedii - jeszcze się nie zawiodłem nigdy.

    Wrzuć więc jeszcze raz ten projekt, którego podobno nie trzeba zmieniać, popraw hardware i po kolei wszystko się zrobi - wrzuć tutaj konkretne błędy jakie wyskakują (ale z konsoli!) ewentualnie kawałki plików które je powodują i będzie dobrze.

    4\/3!!
  • #17 7244981
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    Połączenia są dobre.
    Pobrałem z sieci przykład Keil'a skompilowany i po wgraniu pliku hex ładnie wykrywa 2 porty COM i instaluje sterowniki.

    Ale niestety nie potrwafię sam skomopilować ani bibliotek keila ani LPCUSB tak aby działały.

    W przypadku LPCUSB jako podstwy używam rozbudowanego przez siebie i bardzo cenionego przykładu projektu Freddiego o którym była mowa tutaj:
    https://www.elektroda.pl/rtvforum/topic1339518.html
    do katalogu z projektem kopiuje pliki z katalogu "target" oraz z pliku main_seria.c katalogu "examples" kopiuje kod do własnego pliku main.c (jak kilka postów wyżej)
    Zostawiam standardowy plik makefile oraz startup.s
    Program się kompiluje ale niestety po wgraniu hex układ nie daje oznak życia.

    W przypdaku przykładu keila kopiuje wszystkie pliki do katalogu z projektem i plik main uzupełniam o to co znajduje sie w pliku demo.h oraz demo.c Ale kompilator wywala 65 błędów. np "expected '=', ',', ';', 'asm' or '__attribute__' before '{' token"
    w console:
    [code]

    **** Build of configuration Default for project wzor ****

    cs-make all
    System nie moľe odnale«† okre?lonej ?cieľki.
    'Size of modules:'
    arm-none-eabi-size -B -t --common ./out/startup.o ./out/armint.o ./out/itoa.o ./out/main.o ./out/vectors.o
    text data bss dec hex filename
    160 0 0 160 a0 ./out/startup.o
    468 0 0 468 1d4 ./out/armint.o
    420 0 0 420 1a4 ./out/itoa.o
    2444 0 1 2445 98d ./out/main.o
    68 0 0 68 44 ./out/vectors.o
    3560 0 1 3561 de9 (TOTALS)
    ' '
    'Size of target .elf file:'
    arm-none-eabi-size -B ./out/wzor.elf
    text data bss dec hex filename
    3508 0 516 4024 fb8 ./out/wzor.elf
    ' '
    [quote]

    Pewnie robie coś kompletnie źle, sorry za lamerskie pytania.
    Może ktoś ma przykładowy kompletny projekt z dołaczonymi bibliotekami USB dla Virtual Com. Byłbym bardzo, bardzobardzo wdzięczny
    w załączniku projekt LPCUSB. Nie daje oznak życia po kompilacji
    Załączniki:
    • lpcusb.zip (642.2 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #18 7245272
    wojtekkk09
    Poziom 15  
    Posty: 99
    Pomógł: 15
    Ocena: 2
    Witam,
    dlaczego nie spróbujesz skompilować całego projektu tak jak twórca proponuje?
    Jest tam opis jak to zrobić w podrozdziale: Building and running the software.
    Co prawda autor używa narzędzi GNU ARM, ale to chyba nie taki dużo problem zmienić w obu makefilach sekcję: Tool definition?

    Pozdrawiam
    wojt
  • #19 7245771
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    wojtekkk09 napisał:
    Witam,
    dlaczego nie spróbujesz skompilować całego projektu tak jak twórca proponuje?
    Jest tam opis jak to zrobić w podrozdziale: Building and running the software.
    Co prawda autor używa narzędzi GNU ARM, ale to chyba nie taki dużo problem zmienić w obu makefilach sekcję: Tool definition?

    Pozdrawiam
    wojt


    dzięki. chciałbym tak zrobić ale otrzymuje komunikat w console:

    **** Build of configuration Default for project tar ****


    (Cannot run program "make": Launching failed)

    Jeszcze chyba nie opanowałem tego Eclipse.
    zrobiłem tak. New C Project, Import->File System i zaznaczam wszystko z folderu target

    w makefile
    zmieniam
    CC = arm-elf-gcc
    LD = arm-elf-ld -v
    AR = arm-elf-ar
    AS = arm-elf-as
    CP = arm-elf-objcopy
    OD = arm-elf-objdump
    RM = rm

    na

    TOOLCHAIN = arm-none-eabi-

    CPP_COMPILER = $(TOOLCHAIN)g++
    C_COMPILER = $(TOOLCHAIN)gcc
    ASSEMBLER = $(TOOLCHAIN)gcc -x assembler-with-cpp
    OBJCOPY = $(TOOLCHAIN)objcopy
    OBJDUMP = $(TOOLCHAIN)objdump
    SIZE = $(TOOLCHAIN)size
    REMOVE = cs-rm

    i niestety nic sie nie kompiluje. Pozatym chciałbym dodać biblioteki usb do własnego projektu a nie kożystać z zupełnie nowego

    dzięki za wszelką pomoc
  • Pomocny post
    #20 7245941
    wojtekkk09
    Poziom 15  
    Posty: 99
    Pomógł: 15
    Ocena: 2
    Petros napisał:

    w makefile
    zmieniam
    CC = arm-elf-gcc
    LD = arm-elf-ld -v
    AR = arm-elf-ar
    AS = arm-elf-as
    CP = arm-elf-objcopy
    OD = arm-elf-objdump
    RM = rm

    na

    TOOLCHAIN = arm-none-eabi-

    CPP_COMPILER = $(TOOLCHAIN)g++
    C_COMPILER = $(TOOLCHAIN)gcc
    ASSEMBLER = $(TOOLCHAIN)gcc -x assembler-with-cpp
    OBJCOPY = $(TOOLCHAIN)objcopy
    OBJDUMP = $(TOOLCHAIN)objdump
    SIZE = $(TOOLCHAIN)size
    REMOVE = cs-rm

    i niestety nic sie nie kompiluje. Pozatym chciałbym dodać biblioteki usb do własnego projektu a nie kożystać z zupełnie nowego

    dzięki za wszelką pomoc


    Sprecyzuję swoją myśl:
    zmień arm-elf-coś na arm-none-eabi-coś w każdej linijce, gdzie napotkasz wyrażenie arm-elf-xxx. Nie ruszająccałej reszty
    Zacznij czytać również to co w zakładce "Console" a nie tylko wpisy w "Problems".

    Pozdrawiam
    wojt
  • #21 7245998
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Bardzo możliwe, że w projekcie wywoływane jest "make", a w codesourcery masz "cs-make" - w przykładowych projektach jest to zmienione gdzieś tam w opcjach projektu (make command chyba się to nazywa)

    Podstawienie z użyciem $(TOOLCHAIN) jest na dobre, ale dopiero wtedy jeśli nie zmieniasz nazw konkretnych narzędzi (CC na C_COMPILER) bez zmiany w całości makefile'a

    4\/3!!
  • #22 7246037
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    niestety cały czas ten sam problem
    w console mam tylko
    **** Build of configuration Default for project lpcusb ****


    (Cannot run program "make": Launching failed)
  • #23 7246038
    wojtekkk09
    Poziom 15  
    Posty: 99
    Pomógł: 15
    Ocena: 2
    Niestety podstawienie to nie jest dobre, ponieważ w dalszej części makefila (oryginalnego) wywołane są komendy z użyciem np. CC a nie C_COMPLIER itd.
    Dlatego proponowałem zmienić tylko to co istotne dla tego projektu.

    Pozdrawiam
    wojt
  • #24 7246042
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Posty: 13336
    Pomógł: 1712
    Ocena: 870
    Zastosuj powyższą poradę, a to co zrobiłeś wcześniej (z $(TOOLCHAIN) ) musisz poprawić - nie możesz zmieniać nazw narzędzi, które są wywoływane dalej (nie możesz tak po prostu zmienić CC na C_COMPILER, chyba że w dalszej części też zmienisz wszystkie CC na nową nazwę).

    4\/3!!
  • #25 7248145
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    hehehehee...
    ale mi panowie namieszaliście. Tam gdzie znalazłem "make" zamieniłem na "cs-make"
    arm-elf zamianiłem na arm-none-eabi
    np.
    CC = arm-elf-gcc
    na CC = arm-none-eabi-gcc
    sprawa mnie przerasta.
    Pozatym jeśli jakimś cudem uda mi się to skompilować to itak bede miał skomilowane usb, a mi by zależało aby dołączyć do przykładowego projektu Frrediego. np do tego projektu lpc2103_blink_led.


    oryginalny plik makefile ten z folderu targrget
    
    LIBNAME	= usbstack
    
    # Package definitions
    PKG_NAME	= target
    DATE		= $$(date +%Y%m%d)
    
    # Tool definitions
    CC      = arm-elf-gcc
    LD      = arm-elf-ld -v
    AR      = arm-elf-ar
    AS      = arm-elf-as
    CP      = arm-elf-objcopy
    OD		= arm-elf-objdump
    RM		= rm
    TAR		= tar
    
    CFLAGS  = -I./ -I../ -c -W -Wall -Os -g -DDEBUG -mcpu=arm7tdmi
    ARFLAGS = -rcs
    
    LIBSRCS = usbhw_lpc.c usbcontrol.c usbstdreq.c usbinit.c
    LIBOBJS = $(LIBSRCS:.c=.o)
    
    all: depend lib examples
    
    clean:
    	$(RM) -f $(LIBNAME).a $(LIBOBJS) .depend
    	make -C examples clean
    
    examples:
    	make -C examples
    
    # build lib
    lib: $(LIBNAME).a
    
    $(LIBNAME).a: $(LIBOBJS)
    	$(AR) $(ARFLAGS) $@ $^
    
    # Builds release tar file
    dist: clean
    	cd .. && $(TAR) --exclude={CVS,cvs,.svn} -cvzf $(PKG_NAME)-$(DATE).tar.gz $(PKG_NAME)
    
    # recompile if the Makefile changes
    $(LIBOBJS): Makefile
    
    # dependency checking
    depend: $(LIBSRCS)
    	$(CC) $(CFLAGS) -MM $^ > .depend || rm -f .depend
    
    # phony targets
    .PHONY: all clean examples depend
    
    -include .depend
    
    


    makefile z target/examples

    
    LIBNAME	= ../usbstack
    APPNAME = main
    
    # Tool definitions
    CC      = arm-elf-gcc
    LD      = arm-elf-ld -v
    AR      = arm-elf-ar
    AS      = arm-elf-as
    CP      = arm-elf-objcopy
    OD		= arm-elf-objdump
    RM		= rm
    
    # Tool flags
    CFLAGS  = -I./ -I../ -c -W -Wall -Os -g -DDEBUG -mcpu=arm7tdmi
    ASFLAGS = -ahls -mapcs-32 -o crt.o
    LFLAGS  =  -nostartfiles --warn-common
    CPFLAGS = -O ihex
    ODFLAGS	= -x --syms
    
    LINKFILE	= lpc2148-rom.ld
    
    CSRCS	= startup.c printf.c console.c
    OBJS 	= crt.o $(CSRCS:.c=.o)
    
    EXAMPLES = hid serial msc custom
    
    all: depend $(EXAMPLES)
    
    hid: 	$(OBJS) main_hid.o $(LIBNAME).a
    serial:	$(OBJS) main_serial.o serial_fifo.o armVIC.o $(LIBNAME).a
    msc:	$(OBJS) main_msc.o msc_bot.o msc_scsi.o blockdev_sd.o lpc2000_spi.o $(LIBNAME).a
    custom:	$(OBJS) main_custom.o $(LIBNAME).a
    
    $(EXAMPLES):
    	@ echo "Building $@ example..."
    	$(CC) -T $(LINKFILE) $(LFLAGS) $^ -o $@.elf -Wl,-Map,$@.map
    	$(CP) $(CPFLAGS) $@.elf $@.hex
    	$(OD) $(ODFLAGS) $@.elf > $@.dmp
    
    crt.o: crt.s
    	@ echo ".assembling"
    	$(CC) -c $(AFLAGS) -Wa,-ahlms=crt.lst crt.s -o crt.o
    
    clean:
    	rm -f *.hex *.elf *.o *.lst *.dmp *.map .depend
    
    # recompile if the Makefile changes
    $(OBJS): Makefile
    
    # dependency checking
    depend: $(CSRCS)
    	$(CC) $(CFLAGS) -MM $^ > .depend || rm -f .depend
    
    # phony targets
    .PHONY: clean
    
    -include .depend
    
    
    


    Edit. Dzieją się bardzo dziwne rzeczy. Kiedy próbuję połączyć LPCUSB z przykładowym projektem Freddiego lpc2103_blink_led program sie retsartuje/wiesza. Głównie w miejcu po linii VICIntEnable |= (1<<22); w funkcji main.
    Byłbym bardzo wdzięczny jesli ktoś podesłałby przykładowy projekt oparty na lpc2103_blink_led + LPCUSB lub z przykładem Keila lub wyłumaczył jak to połączyć ze sobą
  • #26 7252604
    Petros
    Poziom 20  
    Posty: 571
    Pomógł: 4
    Ocena: 355
    po wielu walkach doszedłem do wniosku że przerwania powodowane przez USB zawieszają uC (biblioteki LPCUSB dodane do przykaład lpc2103_blink_led). Mikrokontroler nie wchodzi nawet do procedury obsługi przerwania IRQ "USBIntHandler"
    Wiesza sie teraz gdzieś po "USBHwConnect(TRUE);" kiedy CONNECT = 0 i tymsamym aktywowany jest PullUp dla D+ i uC otrzymuje dane.
    Może to wina za małych stosów IRQ ? jak to zmienić? Nikt nie ma działającego przykładu LPCUSB pod CodeSourcery z Eclipse?

    edit. wszytko działa juz, winne były funkje printf i złe wielkości stosów, zamykam.

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy programowania mikrokontrolera ARM7 LPC2144 w języku C, ze szczególnym uwzględnieniem trybu Idle, obsługi USB w trybie Virtual COM oraz monitorowania zajętości pamięci RAM w środowisku CodeSourcery + Eclipse. W trybie Idle zaleca się wyłączanie niepotrzebnych peryferiów (rejestr PCONP) i ewentualne zwiększenie dzielnika zegara peryferiów (PBDIV) w celu zmniejszenia poboru prądu, który przy 60 MHz wynosi około 12 mA dla LPC2138 (podobny rdzeń do LPC2144). Wejście i wyjście z trybu Idle zajmuje kilka cykli zegara, jednak dokładna liczba nie jest podana.

W zakresie USB, popularną biblioteką jest LPCUSB, która umożliwia implementację funkcji Virtual COM port, pozwalając na komunikację z komputerem przez port COM emulowany przez USB. Problemy z wykryciem urządzenia USB przez system Windows często wynikają z błędów w połączeniach linii D+ i D-, nieprawidłowego podciągania linii lub braku obsługi przerwań USB w kodzie. Zalecane jest stosowanie rezystorów 33 Ω na liniach D+ i D- oraz kondensatorów filtrujących. Linia D+ nie powinna być stale podciągnięta do 3,3 V, lecz aktywowana dopiero po inicjalizacji urządzenia. Kolejność pinów USB powinna być zgodna ze standardem, a nie z niejasnymi oznaczeniami w dokumentacji LPC.

Kompilacja projektów LPCUSB w CodeSourcery + Eclipse wymaga dostosowania makefile, zwłaszcza zamiany prefiksów narzędzi z arm-elf- na arm-none-eabi- bez zmiany nazw zmiennych takich jak CC, aby uniknąć błędów. Problemem jest także wywoływanie polecenia "make", które w CodeSourcery może wymagać zmiany na "cs-make". Wskazane jest kompilowanie całego projektu zgodnie z instrukcjami autora, a nie kopiowanie fragmentów kodu do innych projektów.

Ostatecznie autor potwierdził, że problem z zawieszaniem mikrokontrolera podczas obsługi przerwań USB wynikał z niewłaściwych rozmiarów stosów i użycia funkcji printf w przerwaniach. Po korekcie tych elementów LPCUSB działa poprawnie, a urządzenie jest wykrywane przez system Windows jako dwa porty COM.

Do monitorowania zajętości pamięci RAM można użyć narzędzia arm-none-eabi-size, które pokazuje użycie pamięci flash i RAM, jednak nie monitoruje stosów i stert.

Podsumowując, kluczowe aspekty to prawidłowa konfiguracja trybu Idle z wyłączaniem peryferiów, poprawne połączenia i obsługa USB z wykorzystaniem LPCUSB, właściwa konfiguracja środowiska build w CodeSourcery oraz dostosowanie stosów i unikanie funkcji printf w przerwaniach USB.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA