Jump to content

    

Apik

Участник
  • Content Count

    44
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Apik

  • Rank
    Участник
  1. Думал в динамике будет лучше, с нулем просто не угадал. Запись идет всего 100 кадров, и надо было успеть включить в нужный момент запись. Второй раз сделал скриншот, только небольшая просадка. Попробовать сейчас попробую, но, как я писал выше, минимальное значение напряжения во время просадки уже на пине VBAT, т.е. на самом модуле - это 3,66В (+/- 0,1В как погрешность осциллографа), и это вместе с диодом. Ток там небольшой совсем, это не GPRS, и сеть в это время найдена, модуль уже зарегистрирован в сети. П.С. просадки смотрю не вручную, осцилл сам регистрирует минимальное, максимальное и среднее напряжение. Добавлено: Снял диод. Как это по-моему мнению ни странно, но проблема исчезла. Хоть критических просадок с диодом я не заметил, но видимо все-таки "как-то так". Falkon_99 - большое спасибо!
  2. Осциллограма с пинов VBAT в критический момент. Видны скачки напряжения, но минимальное пиковое падение - до 3,66В - т.е. в пределах нормы.
  3. Вообще будет MBR0520 (шоттки), но на данный момент из-за обрыва дорожки повесил навесной 1N5819 (тоже шоттки). Требуется только отсылание смс, даже без голосовой связи, поэтому больших токов там нет.
  4. Дошли руки до тестирования. При выпадании ошибки полностью пропадает питание SIM_VDD и больше не появляется. Т.е. походу его сбрасывает сам SIM900D. Кусочек печатной платы разводки sim-карты до SIM900D. Дорожка питания выделена более ярким. Плату промыл, чистая. SIM900D питается непосредственно от аккумулятора через диод (защита от заряда при питании от сети) и транзистор IRLML6402 (подача питания). Напряжение непосредственно на VBAT 3,8В. Напряжение Usim=2,9В С этим гогна хлебнул в первой версии платы, сейчас RX и TX подключены через одну из схем согласования, найденную на этом форуме: Тут даже не знаю, что и сказать.. Вообще антенна на данный момент - обыкновенный проводок 8 см. Отогнул его в противоположную сторону, т.е. он вообще над платой не идет - все равно симка отваливается.
  5. Но на "старых" симка все отлично работает... И ладно бы в любой момент времени, но нет, на 4 минуте 20 секунде. Закономерность какая-то...
  6. Прошивка 1137B08SIM900D64_ST_DTMF_JD_MMS Оператор: МТС Беларусь
  7. Для краш-теста (установка на дачу на долгое время) устройства была куплена новая сим-карта. По истечении примерно 5 минут работы на новой симке отваливается сеть: 8:58:12.217> +CPIN: NOT READY 8:58:14.337> 8:58:14.337> +CREG: 3 8:58:23.071> 8:58:23.071> +CREG: 0 И все. Регистрироваться не хочет. С 3 старыми симками проблем не было - стояли по-нескольку часов и горя не знали. Что случилось? В телефоне эта новая симка работает без проблем. Провел эксперимент: +CPIN: NOT READY выскакивает ровно через 4 минуты 20 секунд (проверял 3 раза)
  8. Поставил Windows 8. На нем 9 и 10 версии не показывают Display Name и Desintegrator в Библиотеках. Крайне неудобно, когда на микросхемы нету ни номеров выводов, ни подписей. На Windows 7 все отображается нормально. Галочки VISIBLE в свойства пинов стоят. В чем проблема?
  9. Как можно отослать несколько команд одной строкой? Для составных команд понятно (AT+IPR=19200;+CREG=1;+CMGF=1\x0d) А как быть, когда среди них есть простая команда, вроде ATE0 или ATV0?
  10. Есть устройство на SIM900D. В качестве резервного источника питания стоит аккумулятор. Но место в корпусе ограничено, от аккумулятора нужно избавиться. Ставил на вход конденсаторы по 5000 мкФ, потом ионистор 47 000 мкФ - не помогает - энергия быстро иссякает. По идее нужен минимум - успеть отправить СМС-ку с уведомлением, что пропала эл. сеть, и все. Как можно реализовать?
  11. Есть рабочая схема, работала в стадии отладки долгое время, пришло время собрать все в корпус. И тут внезапно выискался глюк - при получении CREG: 1 модуль вдруг отключается. Просадки по питанию нету, все работало... Если не вставлять симку - работает. Вставил - и снова отключается. Схему приводить не буду, подключено все по правилам (много читал форум, да и отладочная плата уже не первая, все условия соблюдены) В чем может быть дело? Перепрошивка на 1137B08SIM900D64 не помогла UPDATE: помогла замена конденсатора на выводах питания SIM900D. Видимо поизносился изрядно старый.
  12. Здравствуйте. Купил на ebay радиомодули RF-2400 (построены на чипе BK2421). Не могу разобраться с отправкой-приемом. Видал кучу библиотек, но все были под PIC или AVR. Переделал по STM. Изучил даташит, инициализация вроде верная - на приемнике и передатчике одинаковые параметры. Думаю есть какой-то маленький нюанс, который не учел. При отправке на передатчике получаю статус 1E - превышен максимальный лимит попыток передачи. На приемнике посылки нету - прерывания на ноге IRQ нету. Может кто имел с ними дело, подскажите, что я не учел. Начну с того, что инициализация (записи в банки регистров) для разных банок разная. Команды все передаются от старшего бита к младшему. В Bank0 и Bank1 с 9 по 14 регистры передача идет от младшего байта к старшему. С 0 по 8 регистр Bank1 передача идет от старшего байта к младшему. Ну и в принципе по отладчику проверял, все условия передачи учитываются, считываю все регистры Bank0 после записи - все записано верно. С Bank1 считывать не дает - он только для записи. Наверное сперва напишу алгоритм общения с RF-2400, т.к. в команды выполняются, с модулем общаюсь хорошо, т.е. в коде ошибок не должно быть. Пытаюсь передать 1 байт "\x37" Инициализация RF-2400: 1. Устанавливаем линию CE 2. Ждем 2 сек для запуска модуля (везде разные цифры, кто 100мс ждет, кто 200мс, кто 500мс. Я не тороплюсь - пусть будет 2000мс. Отправляю команду ActivateCmd с параметром 0x73. Если честно, так и не понял, что это дает. Но так делают все. 3. Переключаемся на Bank0 3.1 Опускаем линию CE 3.2 Ждем 50мс 3.3 Читаем статус 3.4 Если стоит Bank0, ничего не делаем, если Bank1 - переключаемся командой ActivateCmd с параметром 0x53 3.5 устанавливаем линию CE 3.6 Ждем 2 сек 4. Инициализируем модуль с параметрами Bank0: ConfigRegValues = 0x0B, // Prim_RX, Power up, CRC 1 bytes, Enable CRC, Int RX, Int TX, Int RX_DR EnableAutoAckRegValues = 0x3f, // Включить автоподтверждение для всех "pipe" EnableRxAdressRegValues = 0x01, // включить data pipe 0 SetupAdressWidthRegValues = 0x03, // ширина адреса 5 байт SetupRetryRegValues = 0x3F, // Повтор передачи через = 1000us, 15 попыток RfChannelRegValues = 0x20, // канал для передачи - 32 RfSetupRegValues = 0x37, // 1Mbps, output power=5dBm, LNA=HIGHT StatusRegValues = 0x70, // Флаги прерываний RX, TX, MAX_TX очищены // MAX_RT - превышение максимума кол-ва попыток передачи ObserveTxRegValues = 0x00, // только чтение CarrierDetectRegValues = 0x00, // только чтение RxAddress2Values = 0xc3, // RxAddress3Values = 0xc4, // RxAddress4Values = 0xc5, // RxAddress5Values = 0xc6, // RxDataLength0Values = 0x20, // RX Payload Length = 32 RxDataLength1Values = 0x20, // RxDataLength2Values = 0x20, // RxDataLength3Values = 0x20, // RxDataLength4Values = 0x20, // RxDataLength5Values = 0x20, // DynamicPayloadValues = 0x3f, FeatureValues = 0x04, FifoStatusRegValues = 0x11 /*The Rx Address 5 bytes*/ const unsigned char RX_Address0[5] = { 0x3a, 0x3b, 0x3c, 0x3d, 0x01 }; /*The Tx Address 5 bytes*/ const unsigned char TX_Address0[5] = { 0x3a, 0x3b, 0x3c, 0x3d, 0x01 }; 5. Переключаемся на Bank1 6. Инициализируем модуль с параметрами Bank1: /*0*/ 0xE2014B40, /*1*/ 0x00004BC0, /*2*/ 0x028CFCD0, /*3*/ 0x41390099, /*4*/ 0x0B869ED9, //Change REG4[29:27] from 00 to 11 /*5*/ 0xA67F0624, //Disable RSSI measurement /*6*/ 0x00000000, /*7*/ 0x00000000, /*8*/ 0x00000000, /*9*/ 0x00000000, /*0A*/ 0x00000000, /*0B*/ 0x00000000, /*0C*/ 0x00127300, /*0D*/ 0x36B48000, }; unsigned char Bank1_Reg14[Reg14Size]= { 0x41,0x20,0x08,0x04,0x81,0x20,0xCF,0xF7,0xFE,0xFF,0xFF //LSB first }; 7. Переключаемся на Bank0 для дальнейшего считывания статуса. На этом инициализация закончена. В дальнейшем алгоритм отправки данных по нажатию кнопки: 8. Отправляем пакет: 8.1 Переключаемся в режим передачи 8.1.1 Опускаем линию CSN 8.1.2 Отправляем команду FlushTx (0xE1) 8.1.3 Устанавливаем линию CSN 8.1.4 Опускаем линию CE 8.1.5 Ждем 200мс 8.1.6 читаем GONFIG и устанавливаем последний бит (PRIM_RX) в 0 для активации режима передачи 8.1.7 Поднимаем линию CE 8.1.8 Ждем 2 сек 8.2 Читаем FIFO_STATUS, получаем 10001 (0x11) - установлены TX_FULL и RX_EMPTY 8.3 Если 5-й бит (TX_FULL) установлен: 8.3.1 Опускаю линию CSN 8.3.2 Отправляю WriteTxDataCmd (0xA0) 8.3.3 Пока не закончится указанное число байт - отправляю содержимое буфера 8.3.4 Поднимаем линию CSN 9. Ждем 200мс и читаем статус. Получаем 1E - превышен лимит попыток отправки. Ну собственно вот и все. Код для приемника и передатчика один и тот же. Приемник есс-но в режиме приема - насилу ему указываю SwitchToRxMode(), несмотря на то, что он уже по-умолчанию инициализируется с этим режимом, чтоб уж наверняка. Может быть разная адресация - ставил разные: все адреса одни и те же; ставил перекрестные (условно: передатчик RX =0, TX=1. Приемник RX=1, TX=0). Читал на казусе, что адреса лучше ставить начиная с E7 для лучшей преамбулы и т.д. Что я не учел? Ну и коды: Функция передачи команды в RF-2400 [code]/*-------------------------------------------------------------------------------------------*/ /* Записывает значение в RF-2400 и возвращает ответ */ /* Принимает: value: адрес регистра */ /* Возвращает: содержимое регистра DR */ /*----------------------------------------------------------------------------------------------------------*/ /* Команда передается от старшего бита к младшему, поэтому реализуем ручной SPI */ /*----------------------------------------------------------------------------------------------------------*/ unsigned char SPI_RW(unsigned char value) { unsigned char res = 0; // вывод полученного результата unsigned char i = 0x80; // переменная для побитовой передачи и чтения данных unsigned char bit_ctr=0; // счетчик переданных/полученных байт for(bit_ctr=0;bit_ctr<8;bit_ctr++) // передача 8-ми бит { if(value & 0x80) // сравниваем старший бит с '1000 0000' { SET_MOSI(); // если старший бит равен единице, поднимаем MOSI - передаем '1' } else { CLR_MOSI(); // иначе опускаем MOSI - передаем '0' } value = (value << 1); // сдвигаем наш байт на единицу влево (передаем следующий бит) SET_SCK(); // устанавливаем SCK в '1' if(GET_MISO()) { res |= i; // Записываем принятый бит } CLR_SCK(); // бит передан, опускаем SCK i >>= 1; } return(res); //возвращаем принятый байт }; [/code]</div> Функция записи значения в регистр: [code]/*----------------------------------------------------------------------------------------------*/ /* Записывает значение 'value' в регистр 'reg' в RF-2400 */ /* Принимает: reg: адрес регистра */ /* Возвращает: ничего */ /*----------------------------------------------------------------------------------------------*/ void SPI_Write_Reg(unsigned char reg, unsigned char value) { delay_ms(10); CLR_SS(); // опускаем CSN, инициируем передачу SPI_RW(reg); // отсылаем адрес регистра SPI_RW(value); // отсылаем значение регистра SET_SS(); // поднимаем CSN, заканчиваем передачу }; [/code] Функция записи массива байт в RF-2400: [code]/*----------------------------------------------------------------------------------------------*/ /* Записывает массив байт в регистр RF-2400 */ /* Принимает: reg: адрес регистра */ /* pBuffer: массив для отправки */ /* Length: размер массива */ /* Возвращает: ничего не возвращает */ /*----------------------------------------------------------------------------------------------*/ void SPI_Write_Buf(unsigned char reg, unsigned char *pBuffer, unsigned char Length) { CLR_SS(); // опускаем CSN, инициируем передачу SPI_RW(reg); // отсылаем адрес регистра while(Length--) // пока длина не равна нулю { SPI_RW(*pBuffer++); // отсылаем байты } SET_SS(); // поднимаем CSN, заканчиваем передачу } [/code] Функция для отправки данных по радиоканалу: [code]/*----------------------------------------------------------------------------------------------*/ /* записывает данные в буфер передачи модуля */ /* Принимает: *buffer - ссылка на массив для передачи, size - длина массива */ /* Возвращает: если буфер передачи не полон: 1 */ /* если буфер передачи полон: 0 */ /*----------------------------------------------------------------------------------------------*/ unsigned char Write(void *buffer, unsigned char size) { SwitchToTxMode(); unsigned char fifoStatus = SPI_Read_Reg(ReadRegCmd | FifoStatusReg); if(!(fifoStatus & 0x20 )) { SPI_Write_Buf(WriteTxDataCmd, (unsigned char*)buffer, size); return 1; } return 0; } [/code] Переключение в режим приемника: [code]/*----------------------------------------------------------------------------------------------*/ /* Процедура переключения в режим приема */ /* Принимает: ничего */ /* Возвращает: ничего не возвращает */ /*----------------------------------------------------------------------------------------------*/ void SwitchToRxMode(void) { unsigned char value; CLR_SS(); // опускаем CSN, инициируем передачу SPI_RW(FlushRxCmd); // очищаем буфер приема SET_SS(); // поднимаем CSN, заканчиваем передачу value = SPI_Read_Reg(ReadRegCmd | StatusReg); // читаем StatusReg value = value & 0x70; // устанавливаем последний бит в '0' (PRIM_RX) SPI_Write_Reg(WriteRegCmd | StatusReg, value ); // clear RX_DR or TX_DS or MAX_RT interrupt flag CLR_CE(); delay_ms(200); value = SPI_Read_Reg(ReadRegCmd | ConfigReg); // читаем ConfigReg value = value | 0x01; // устанавливаем последний бит в '1' (PRIM_RX) SPI_Write_Reg(WriteRegCmd | ConfigReg, value ); // устанавливаем PRX SET_CE(); delay_ms(2000); } [/code] Переключение в режим передатчика: [code]/*----------------------------------------------------------------------------------------------*/ /* Процедура переключения в режим передачи */ /* Принимает: ничего */ /* Возвращает: ничего не возвращает */ /*----------------------------------------------------------------------------------------------*/ void SwitchToTxMode(void) { unsigned char value; CLR_SS(); // опускаем CSN, инициируем передачу SPI_RW(FlushTxCmd); // очищаем буфер передачи SET_SS(); // поднимаем CSN, заканчиваем передачу CLR_CE(); // очищаем линию CE delay_ms(200); value = SPI_Read_Reg(ReadRegCmd | ConfigReg); // читаем ConfigReg value = value & 0xfe; // устанавливаем последний бит в '0' (PRIM_RX) SPI_Write_Reg(WriteRegCmd | ConfigReg, value ); // устанавливаем PTX value = SPI_Read_Reg(ReadRegCmd | ConfigReg); // читаем ConfigReg SET_CE(); // поднимаем CE в '1' delay_ms(2000); } [/code] Переключение банков регистров: [code]/*----------------------------------------------------------------------------------------------*/ /* Процедура переключение между Bank1 и Bank0 */ /* Принимает: номер банка: */ /* 1:register bank1 */ /* 0:register bank0 */ /* Возвращает: ничего не возвращает */ /*----------------------------------------------------------------------------------------------*/ /* переключение банков должно осуществляться при линии CE (EnablePin) */ /* установленной в низкий уровень */ /*----------------------------------------------------------------------------------------------*/ void SwitchCFG(unsigned char cfg) { unsigned char tmp = 0; CLR_CE(); delay_ms(50); tmp = SPI_Read_Reg(ReadRegCmd | StatusReg); //читаем STATUS tmp = tmp & 0x80; //смотрим старший бит 'RBANK' tmp = (tmp >> 7); //сдвигаем полученный бит вправо, чтобы нормально сравнивать if (cfg != tmp) //если устанавливаемый и установленный биты различаются { SPI_Write_Reg(ActivateCmd, 0x53); //отправляем команду ActivateCmd с параметром 0x53 для переключения банка } tmp = SPI_Read_Reg(ReadRegCmd | StatusReg); //читаем STATUS SET_CE(); delay_ms(2000); } [/code]
  13. Есть круглая печатная плата. Как залить ее круглым полигоном (GND)?. Polygon Pour квадратный, по контуру платы не обрезается. UPDATE: сделал так - сделал круг по контуру платы в слое полигона. В итоге полигон не может пересечь замкнутую дорожку в своем слое, и остается круглым.
  14. Стоит задача перевести SIM900D с аккумулятора (подключен напрямую с конденсатором 1000мкФ) на работу от ИИП (5-6В). Причем не просто перевести, а аккумулятор оставить резевным. Резервирование хотел сделать сперва на транзисторных ключал, но потом остановился просто на двух диодах, т.к. напряжение на аккумуляторе в лучшие времена 4,2В, а напряжение ИИП в худшие времена 5В (простота - залог здоровья). SIM900D хочу питать от 4В, ставить буду ST1S10. И вот вопрос - когда 220В есть, все хорошо - ST1S10 будет снижать напряжение с 5 до 4В. Но когда будет питаться от аккумулятора, и вдруг аккумулятор окажется в это время подразряжен, например до 3,7В. Что будет на выходе ST1S10? Выдаст от мне мои 3,7В? Конечно можно снизить напряжение питания с 4В до 3,5В - конечно тут уже меньше шансов, что аккумулятор окажется настолько разряжен, тем более в программе заложена проверка заряда и зарядка через LTC4054. Но мало ли, раз в год и палка стреляет.
  15. можно тоже прошивку на SIM900D с DMTF alexsacha1984(собака)mail.ru