Jump to content

    

USS2004

Участник
  • Content Count

    76
  • Joined

  • Last visited

Community Reputation

0 Обычный

About USS2004

  • Rank
    Частый гость
  1. всем спасибо за ответы
  2. это я понял, чего делать то, вставлять в Си,вставки асм ? вообщето это работа компилятора, как мне кажется
  3. отлаживаю код для работы по прерываниям, инициализирую регистры дальше в основной программе бесконечный цикл. Проблема начилась с того, что прерывание происходит только один раз(AIC_EOICR в обработчике стираю), стал разбираться, оказалось, что после прерывания код улетает не на while (1); а на следующий адрес, т.е. перед прерыванием РС = 0х10116С, а после выхода РС = 0х101170, кстати в соответствии с адресом в регистре R14, что это, баг или руки кривые? Забыл добавить, среда Keil uVision3 компилятор GNU контроллерAT91SAM7X256.
  4. вопрос по USB

    вот, переписал как советовали, прогоните у себя ,пожалуйста while(1) { value++; *AT91C_UDP_CSR |= 0x8000; while(!(*AT91C_UDP_CSR & 0x4)); len = ((*AT91C_UDP_CSR) >> 16) & 0xFFFF; for (i = 0; i < len; i++) { buf[value] = *AT91C_UDP_FDR; } /***************************************************************/ /***************************************************************/ *AT91C_UDP_CSR |= 0x80; //set DIR while(!(*AT91C_UDP_CSR & 0x80));// wait *AT91C_UDP_CSR &= 0xFFFFFFFB; //clear RXSETUP while((*AT91C_UDP_CSR & 0x04));// wait //////////////////////////////////// for(i = 0; i < 8; i++) { *AT91C_UDP_FDR = *(point++); } *AT91C_UDP_CSR |= 0x10; //set TXPKTRDY while(!(*AT91C_UDP_CSR & 0x10));// wait *AT91C_UDP_CSR &= 0xFFFFFFFE;//clear TXCOMP while((*AT91C_UDP_CSR & 0x04));// wait ////////////////////////////// while(!(*AT91C_UDP_CSR & 0x1));//// *AT91C_UDP_CSR &= 0xFFFFFFFE; for(i = 0; i < 8; i++) { *AT91C_UDP_FDR = *(point++); } *AT91C_UDP_CSR |= 0x80; //set DIR while(!(*AT91C_UDP_CSR & 0x80));// wait *AT91C_UDP_CSR |= 0x10;//set TXPKTRDY while(!(*AT91C_UDP_CSR & 0x10));// wait *AT91C_UDP_CSR &= 0xFFFFFFFE;//clear TXCOMP while((*AT91C_UDP_CSR & 0x04));// wait ////////////////////////////// while(!(*AT91C_UDP_CSR & 0x1));// wait finish send <---------- вот здесь зависает !!!!! for(i = 0; i < 2; i++) { *AT91C_UDP_FDR = *(point++); } *AT91C_UDP_CSR |= 0x80; //set DIR while(!(*AT91C_UDP_CSR & 0x80));// wait *AT91C_UDP_CSR |= 0x10;//set TXPKTRDY while(!(*AT91C_UDP_CSR & 0x10));// wait *AT91C_UDP_CSR &= 0xFFFFFFFE;//clear TXCOMP while((*AT91C_UDP_CSR & 0x04));// wait while(!(*AT91C_UDP_CSR & 0x1));// wait finish send *AT91C_UDP_CSR &= 0xFFFFFFFE; }
  5. вопрос по USB

    я пробовал и так и эдак, для синхронизации после каждой установки\снятия флага проверял содержимое регистра, никак не работает, отправляет вторую порцию и вистнет на while(!(*AT91C_UDP_CSR & 0x1));// wait finish send как будто система не отвечает на 2-ю посылку блин, и не посмотреть обмен, с эзернетом проще
  6. вопрос по USB

    typedef struct { unsigned char bLength; //!< Size of this descriptor in bytes unsigned char bDescriptorType; //!< DEVICE descriptor type unsigned short bscUSB; //!< USB specification release number unsigned char bDeviceClass; //!< Class code unsigned char bDeviceSubClass; //!< Subclass code unsigned char bDeviceProtocol; //!< Protocol code unsigned char bMaxPacketSize0; //!< Control endpoint 0 max. packet size unsigned short idVendor; //!< Vendor ID unsigned short idProduct; //!< Product ID unsigned short bcdDevice; //!< Device release number unsigned char iManufacturer; //!< Index of manu. string descriptor unsigned char iProduct; //!< Index of prod. string descriptor unsigned char iSerialNumber; //!< Index of S.N. string descriptor unsigned char bNumConfigurations; //!< Number of possible configurations } S_usb_device_descriptor; char* point; point = &sDeviceDescriptor; while(1) { value++; // *AT91C_UDP_CSR |= 0x8000; while(!(*AT91C_UDP_CSR & 0x4)); len = ((*AT91C_UDP_CSR) >> 16) & 0xFFFF; for (i = 0; i < len; i++) { buf[value] = *AT91C_UDP_FDR; } *AT91C_UDP_CSR |= 0x80; //set DIR Delay(10); *AT91C_UDP_CSR &= 0xFFFFFFFB; //clear RXSETUP //////////////////////////////////// for(i = 0; i < 8; i++) { *AT91C_UDP_FDR = *(point++);// write data to fifo } *AT91C_UDP_CSR |= 0x80; //set DIR *AT91C_UDP_CSR |= 0x10; //set TXPKTRDY //////////////////////////////////////////////////////////////// while(!(*AT91C_UDP_CSR & 0x1));// wait finish send *AT91C_UDP_CSR &= 0xFFFFFFFE;//clear TXCOMP Delay(10); for(i = 0; i < 8; i++) { *AT91C_UDP_FDR = *(point++);// write data to fifo } *AT91C_UDP_CSR |= 0x80; //set DIR Delay(10); *AT91C_UDP_CSR |= 0x10;//set TXPKTRDY //*AT91C_UDP_CSR &= 0xFFFFFFFE;//clear TXCOMP ////////////////////////////// while(!(*AT91C_UDP_CSR & 0x1));// wait finish send *AT91C_UDP_CSR &= 0xFFFFFFFE; Delay(10); for(i = 0; i < 2; i++) { *AT91C_UDP_FDR = *(point++); } *AT91C_UDP_CSR |= 0x80; //set DIR Delay(10); *AT91C_UDP_CSR |= 0x10; //set TXPKTRDY while(!(*AT91C_UDP_CSR & 0x1));// wait finish send *AT91C_UDP_CSR &= 0xFFFFFFFE; } извините, код пока в таком виде , красоту не наводил, ибо не арбайтен
  7. вопрос по USB

    переписал, как вы советовали, теперь зависает на проверке TXCOMP перед отправкой последних 2 байт
  8. вопрос по USB

    проинициализировал UDP, запускаю программу, втыкаю шнур USB, пока работаю не по прерываниям, в вайле проверяю флаг RXSETUP, после его установки считываю RXBYTECNT байт (8) из ФИФО, вот они 0x80 0x06 0x00 0x01 0x00 0x00 0x40 0x00 считаю полученный фрейм запросом хоста дескриптора устройства, т.к. размер дескриптора больше макс. размера буфера для нулевой конечной точки, разбиваю дескриптор на 3 части (8 8 2 байта) , записываю первые 8 байт в ФИФО, устанавливаю флаг TXPKTRDY, сбрасываю TXCOMP, жду пока TXPKTRDY == 0, отправляю в ФИФО след. 8 байт, потом оставшиеся 2 байта , вот мой дескриптор : //! \brief Device descriptor #define USB_DEVICE_DESCRIPTOR 0x01 //! \brief Interface power descriptor #define USB_ENDPOINT0_MAXPACKETSIZE 8 //! idVendor - ATMEL Vendor ID #define USB_VENDOR_ATMEL 0x03EB //! bcdUSB field - USB 2.0 specification code #define USB2_00 0x0200 #define USB1_10 0x0110 static const S_usb_device_descriptor sDeviceDescriptor = { sizeof(S_usb_device_descriptor), // Size of this descriptor in bytes USB_DEVICE_DESCRIPTOR, // DEVICE Descriptor Type USB1_10, // USB Specification 2.0 0x00, // Class is specified in the interface descriptor. 0x00, // Subclass is specified in the interface descriptor. 0x00, // Protocol is specified in the interface descriptor. USB_ENDPOINT0_MAXPACKETSIZE, // Maximum packet size for endpoint zero USB_VENDOR_ATMEL, // Vendor ID "ATMEL" 0x1234, // Product ID 0x0001, // Device release number 0x01, // Index 1: manufacturer string 0x02, // Index 2: product string 0x03, // Index 3: serial number string 0x01 // One possible configurations }; система пишет, что обнаружено неизвестное устройство, в диспетчере DEVid = 0000 VENDORid=0000? винды повторяют посылку запроса дескриптора еще 3 раза, т.е. принимаются пакеты правильно, проблема с отправкой. Намекните, чего я не так делаю ? Спасибо
  9. DMA не задействовал, если вы это имели ввиду
  10. присоединяюсь
  11. особых требований нет, заработало бы для начала, пока удалось только VBUS отмониторить при подключении шнурка, хост пишет, что нашел неизвестное устройство, в контроллере синхросигналы разрешил, пулапом дергал - принять пока ничего не удалось
  12. 24 бита - это,конечно, хорошо, только у меня AT91SAM7X256, некуда его прикручивать, вот когда работодатели до Арм9 созреют, TFT воткну. А вы USB на этих контроллерах не пользовали ? Есть ли готовые решения (для МК и Хоста), ну или, на худой конец, что-нибудь более менее рабочее ,что б не зависать на неделю. Я вчера качнул AT91USBFramework-Core-1.02, пытался компильнуть, с ходу не вышло, думаю дело в том, что я работаю в uVision, а компилятор использую от GNU, хотя может и ошибаюсь, сильно не вникал пока, очень много ошибок выскочило, я даже подумал, что проще будет свой проект под USB написать
  13. Ну , С ПЛИС пришлось разбираться не от хорошей жизни, коллега уволился, а проект сдавать надо, вот и пришлось разбираться, да и знания лишними не бывают :) а дисплей - это халтура, типа - деньги не пахнут
  14. около 7,2 вольта