Перейти к содержанию
    

TORNIS

Участник
  • Постов

    24
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о TORNIS

  • Звание
    Участник
    Участник
  • День рождения 11.12.1970

Информация

  • Город
    Array

Посетители профиля

1 394 просмотра профиля
  1. ATSAMD21 USB Attach/Detach

    Вопрос к знатокам USB интерфейса. Микроконтроллер atsamd21j18. Инициализируется USB с поддержкой CDC. Все проходит штатно и функционирует. Необходимо на ходу отключить USB кабель от устройства. Делаем "detach" USB. Видим программное отключение. Делаем "attach". Видим програмное подключение интерфейса (enumerated). Функционирование CDC после переподключения нарушается: detach USB->DEVICE.CTRLB.bit.DETACH = 1; USB->DEVICE.CTRLA.bit.ENABLE = 0; while (USB->DEVICE.SYNCBUSY.bit.ENABLE == 1) ; attach USB->DEVICE.CTRLA.bit.ENABLE = 1; while (USB->DEVICE.SYNCBUSY.bit.ENABLE == 1) ; USB->DEVICE.CTRLB.bit.DETACH = 0; Пробовал пере-инициализировать USB: usb_init(); USB->DEVICE.CTRLA.bit.ENABLE = 1; while (USB->DEVICE.SYNCBUSY.bit.ENABLE == 1) ; USB->DEVICE.CTRLB.bit.DETACH = 0; CDC не функционирует. Инициализация USB: void usb_init(void) { uint32_t pad_transn, pad_transp, pad_trim; /* Enable USB clock */ PM->APBBMASK.reg |= PM_APBBMASK_USB; #define DM_PIN PIN_PA24G_USB_DM #define DM_MUX MUX_PA24G_USB_DM #define DP_PIN PIN_PA25G_USB_DP #define DP_MUX MUX_PA25G_USB_DP /* Set up the USB DP/DN pins */ PORT->Group[0].PINCFG[DM_PIN].bit.PMUXEN = 1; PORT->Group[0].PMUX[DM_PIN / 2].reg &= ~(0xF << (4 * (DM_PIN & 0x01u))); PORT->Group[0].PMUX[DM_PIN / 2].reg |= DM_MUX << (4 * (DM_PIN & 0x01u)); PORT->Group[0].PINCFG[DP_PIN].bit.PMUXEN = 1; PORT->Group[0].PMUX[DP_PIN / 2].reg &= ~(0xF << (4 * (DP_PIN & 0x01u))); PORT->Group[0].PMUX[DP_PIN / 2].reg |= DP_MUX << (4 * (DP_PIN & 0x01u)); GCLK->CLKCTRL.reg = GCLK_CLKCTRL_ID(USB_GCLK_ID) | GCLK_CLKCTRL_GEN(0) | GCLK_CLKCTRL_CLKEN; while (GCLK->STATUS.bit.SYNCBUSY) ; /* Reset */ USB->HOST.CTRLA.bit.SWRST = 1; while (USB->HOST.SYNCBUSY.bit.SWRST) ;/* Sync wait */ /* Load Pad Calibration */ pad_transn = ((*((uint32_t*) USB_FUSES_TRANSN_ADDR)) & USB_FUSES_TRANSN_Msk) >> USB_FUSES_TRANSN_Pos; if(pad_transn == 0x1F) pad_transn = 5; USB->HOST.PADCAL.bit.TRANSN = pad_transn; pad_transp = ((*((uint32_t*) USB_FUSES_TRANSP_ADDR)) & USB_FUSES_TRANSP_Msk) >> USB_FUSES_TRANSP_Pos; if (pad_transp == 0x1F) pad_transp = 29; USB->HOST.PADCAL.bit.TRANSP = pad_transp; pad_trim = ((*((uint32_t*) USB_FUSES_TRIM_ADDR)) & USB_FUSES_TRIM_Msk) >> USB_FUSES_TRIM_Pos; if (pad_trim == 0x7) pad_trim = 3; USB->HOST.PADCAL.bit.TRIM = pad_trim; /* Set the configuration */ /* Set mode to Device mode */ USB->HOST.CTRLA.bit.MODE = 0; /* Enable Run in Standby */ USB->HOST.CTRLA.bit.RUNSTDBY = true; /* Set the descriptor address */ USB->HOST.DESCADD.reg = (uint32_t)(&usb_endpoint_table[0]); /* Set speed configuration to Full speed */ USB->DEVICE.CTRLB.bit.SPDCONF = USB_DEVICE_CTRLB_SPDCONF_FS_Val; /* Attach to the USB host */ USB->DEVICE.CTRLB.reg &= ~USB_DEVICE_CTRLB_DETACH; /* Initialize endpoint table RAM location to a known value 0 */ memset((uint8_t *)(&usb_endpoint_table[0]), 0, sizeof(usb_endpoint_table)); } Сброс интерфейса с последующей инициализацией, не помогает. Вариант с постоянным сбросом микроконтроллера - не вариант. Кто может подсказать, где могут лежать грабли? Заранее благодарен
  2. Приветствую! Ищу коллег имеющие опыт работы с сабжевым датчиком. Интересует измеритель качества воздуха и предлагаемая BOSCH библиотека обработки данных BSEC. Есть вопросы по использованию выше описанной библиотеки.
  3. SI4463 C2

    Разобрался. "Диверсити" причина. Подключая к прибору первую антенну, мы ухудшаем условия приема этого входа. Соответственно сигнал лучше слышала вторая антенна и туда отдавала ожидаемую мощу. Вообщем, прошелся по своим аккуратно выложенным граблям :/
  4. SI4463 C2

    Приветствую! Столкнулись с проблемой. В проекте использовался чип SI4463 с ревизией B1. Получили чип с новой ревизией - C2. При запуске партии устройств выяснилось, что выходная мощность устройства не соответствует. Ревизия В1 выдает свои +20дБм. Новая ревизия только +0дБм. Цепи согласования те же. Перекидывая чипы, с С2 на В1 и обратно, на той же плате, еще раз убедился, что проблема в чипе. И видимо в конфигурации чипа. Даташит на чип ни о чем не говорит. Кто нибудь сталкивался с такой проблемой? В какую сторону копать?
  5. С большой уверенностью можно сказать, что проблемы с мощностью. Смотрите настройки выходного каскада передатчика (RFO/PA_BOOST, PA_DAC ...)
  6. Ну если чип трансивера не китайский, а таковых пока еще не видел, то в любом исполнении должны работать. :rolleyes:
  7. SX127x LoRa

    ;************************** ; ***** CONFIG LoRa ***** ;************************** .db RegOpMode ,RFLR_OPMODE_LONGRANGEMODE_ON | RFLR_OPMODE_ACCESSSHAREDREG_DISABLE | RFLR_OPMODE_FREQMODE_ACCESS_HF | RFLR_OPMODE_SLEEP .db RegFrfMSB ,0xd9 ; .db RegFrfMID ,0x3c ; .db RegFrfLSB ,0xc8 ; Fstep=Fosc/2^19=61.03515625 Hz, Frf=Fstep*Frf(23:0) -> Frf(23:0)=Frf/Fstep 868949700/61.0351562=14236872(0xD93CC8) .db RegPAConfig ,RFLR_PACONFIG_PASELECT_RFO | 0x7f;RFLR_PACONFIG_PASELECT_RFO | 0x7f .db RegPARamp ,RFLR_PARAMP_3400_US .db RegOCP ,RFLR_OCP_OFF | RFLR_OCP_TRIM_240_MA .db RegLNA ,RFLR_LNA_GAIN_G1 | RFLR_LNA_BOOST_LF_DEFAULT | RFLR_LNA_BOOST_HF_OFF .db RegFIFOAddrPtr ,0x00 ; SPI interface address pointer in FIFO data buffer. .db RegFifoTXBaseAddr ,0x80 ; write base address in FIFO data buffer for TX modulator .db RegFifoRXBaseAddr ,0x00 ; read base address in FIFO data buffer for RX demodulator .db RegFifoRXCurrentAddr ,0x00 ; Start address (in data buffer) of last packet received .db RegIrqFlagsMask ,0x00 ; .db RegIrqFlags ,0x00 ; .db RegModemConfig1 ,RFLR_MODEMCONFIG1_BW_10_41_KHZ | RFLR_MODEMCONFIG1_CODINGRATE_4_5 | RFLR_MODEMCONFIG1_IMPLICITHEADER_ON .db RegModemConfig2 ,RFLR_MODEMCONFIG2_SF_7 | RFLR_MODEMCONFIG2_TXCONTINUOUSMODE_OFF | RFLR_MODEMCONFIG2_RXPAYLOADCRC_OFF;ON ;| 0x03 .db RegSymbTimeoutLsb ,0x90 ; TimeOut = SymbTimeout * Ts .db RegPreambleMsbLora ,0x00 ; Preamble length MSB .db RegPreambleLsbLora ,0x08 ; Preamble Length LSB ; *** в "явном" режиме устанавливать длинну поля данных для передатчика *** .db RegPayloadLengthLora ,0x08 ; Payload length in bytes. .db RegMaxPayloadLength ,0xff ; Maximum payload length .db RegHopPeriod ,0x00 ; Symbol periods between frequency hops. .db RegFifoRxByteAddr ,0x00 ; Current value of RX databuffer pointer (address of last byte written by Lora receiver) .db RegModemConfig3 ,RFLR_MODEMCONFIG3_LOWDATARATEOPTIMIZE_OFF | RFLR_MODEMCONFIG3_AGCAUTO_OFF ; .db RegDioMapping1 ,RFLR_DIOMAPPING1_DIO0_00 | RFLR_DIOMAPPING1_DIO1_00 | RFLR_DIOMAPPING1_DIO2_00 | RFLR_DIOMAPPING1_DIO3_00 .db RegDioMapping2 ,RFLR_DIOMAPPING2_DIO4_00 | RFLR_DIOMAPPING2_DIO5_00 | RFLR_DIOMAPPING2_MAP_PREAMBLEDETECT .db REG_LR_TCXO ,RFLR_TCXO_TCXOINPUT_ON .db REG_LR_PADAC ,RFLR_PADAC_20DBM_OFF .db REG_LR_PLL ,RF_PLL_BANDWIDTH_150 ; .db RegAgcRef ,0x1c ; xx/011001, .db RegAgcThresh1 ,0x0e ; - .db RegAgcThresh2 ,0x5b ; - .db RegAgcThresh3 ,0xcc ; - .db 0xff ,0xff ; eoc Описывать нет необходимости, все и так ясно :rolleyes:
  8. SX127x LoRa

    Да, не сказал, что работаю с RXSINGLE! :laughing:
  9. SX127x LoRa

    "1" в маске маскирует запрос на соответствующее прерывание. В регистрах описывающих поведение DIO, необходимо выбрать источник ожидаемого прерывания. RXDone появляется по завершению приема пакета. Для удобства, можно читать регистр RegIrqFlags, где по битам PayloadCrcError и ValidHeader можно судить о качестве приема пакета. Следует обратить внимание на бит RxTimeout, сообщающий о ошибке ожидания приема всего пакета, всех его полей. После взведения этого флага, приемник уходит в режим STBY. Потому необходимо постоянно контролировать состояние регистра RegOpMode. У меня отдельный процесс периодично, раз в 50..100мс "пулит" этот регистр и толкает модем в режим приема. Естественно, прерывание замаскировано. Надо очень внимательно разобраться с загружаемой конфигурацией. Там много тонкостей. А так, модем в режиме LoRa, великолепно работает :santa2:
  10. Использую модуль SX1276RF1IAS, от родного кита. На сколько я правильно понял, VR PA и есть тот самый источник напряжения для питания выходного каскада. По схеме, VR PA, подпитывает RFO HF и PA BOOST, который в свою очередь подключен к "двоечному" п-контуру/фильтру. Отсюда складывается, что 100 мВт на выходе будет только в диапазоне 137-174 МГц. Меня тревожит другое, тревожит отсутсвие передачи в диапазоне 137-174 МГц! Видимо в каких-то регистрах записано некорректное значение ...
  11. Приветствую! Кто-нибудь пытался запустить модем sx1276 на двойку (137..174 МГц)? В данный момент бьюсь с конфигурацией модема на 2-х метровый диапазон. Все настройки, согласно даташиту. Статус биты описывают его рабочее состояние, захват PLL присутствует. Не выходит на частоту. На соседних частотах тоже нет, анализатор под рукой. Пока не понятна причина. На 868 МГц все в норме, кроме мощности. Не удалось завести передатчик модема с 100 мВт.
  12. Эта строка (функция) как раз то и читает калибровочное слово из памяти PIC. Если по адресу нахожднения калибровочного слова не будет инструкции RETLW, то не будет возврата из функции _READ_OSCCAL_DATA(), а это означает, что программа будет крутитьтся в начале инициализации вечно. Когда MPLAB сносит (стирает) константу, вместо RETLW там будет пустая ячейка, что интерпретируется как инструкция ADDWF. CALL 0x3ff ; get calibration value MOVWF OSCCAL ; save
  13. Дело в том, что согласно Вашему коду, PD,1 проинициализирован как выход и притянут к корпусу. Т.е. внешние подтяжки ему по-барабану. Тогда уж лучше PD,1 определить как вход и притянуть к плюсу.
  14. Я бы, все же, держал PD,1 подтянутым к плюсу - PORTD = ...|(1<<1)|...
×
×
  • Создать...