Apik
Участник-
Постов
44 -
Зарегистрирован
-
Посещение
Репутация
0 ОбычныйИнформация о Apik
-
Звание
Участник
-
Думал в динамике будет лучше, с нулем просто не угадал. Запись идет всего 100 кадров, и надо было успеть включить в нужный момент запись. Второй раз сделал скриншот, только небольшая просадка. Попробовать сейчас попробую, но, как я писал выше, минимальное значение напряжения во время просадки уже на пине VBAT, т.е. на самом модуле - это 3,66В (+/- 0,1В как погрешность осциллографа), и это вместе с диодом. Ток там небольшой совсем, это не GPRS, и сеть в это время найдена, модуль уже зарегистрирован в сети. П.С. просадки смотрю не вручную, осцилл сам регистрирует минимальное, максимальное и среднее напряжение. Добавлено: Снял диод. Как это по-моему мнению ни странно, но проблема исчезла. Хоть критических просадок с диодом я не заметил, но видимо все-таки "как-то так". Falkon_99 - большое спасибо!
-
Осциллограма с пинов VBAT в критический момент. Видны скачки напряжения, но минимальное пиковое падение - до 3,66В - т.е. в пределах нормы.
-
Вообще будет MBR0520 (шоттки), но на данный момент из-за обрыва дорожки повесил навесной 1N5819 (тоже шоттки). Требуется только отсылание смс, даже без голосовой связи, поэтому больших токов там нет.
-
Дошли руки до тестирования. При выпадании ошибки полностью пропадает питание SIM_VDD и больше не появляется. Т.е. походу его сбрасывает сам SIM900D. Кусочек печатной платы разводки sim-карты до SIM900D. Дорожка питания выделена более ярким. Плату промыл, чистая. SIM900D питается непосредственно от аккумулятора через диод (защита от заряда при питании от сети) и транзистор IRLML6402 (подача питания). Напряжение непосредственно на VBAT 3,8В. Напряжение Usim=2,9В С этим гогна хлебнул в первой версии платы, сейчас RX и TX подключены через одну из схем согласования, найденную на этом форуме: Тут даже не знаю, что и сказать.. Вообще антенна на данный момент - обыкновенный проводок 8 см. Отогнул его в противоположную сторону, т.е. он вообще над платой не идет - все равно симка отваливается.
-
Но на "старых" симка все отлично работает... И ладно бы в любой момент времени, но нет, на 4 минуте 20 секунде. Закономерность какая-то...
-
Прошивка 1137B08SIM900D64_ST_DTMF_JD_MMS Оператор: МТС Беларусь
-
SIM900D+новая симка=+CPIN: NOT READY
Apik опубликовал тема в Сотовая связь и ее приложения
Для краш-теста (установка на дачу на долгое время) устройства была куплена новая сим-карта. По истечении примерно 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 раза) -
Вопросы начинающих
Apik ответил KA_ru тема в Altium Designer, DXP, Protel
Поставил Windows 8. На нем 9 и 10 версии не показывают Display Name и Desintegrator в Библиотеках. Крайне неудобно, когда на микросхемы нету ни номеров выводов, ни подписей. На Windows 7 все отображается нормально. Галочки VISIBLE в свойства пинов стоят. В чем проблема? -
AT команды
Apik ответил Anthoni тема в Сотовая связь и ее приложения
Как можно отослать несколько команд одной строкой? Для составных команд понятно (AT+IPR=19200;+CREG=1;+CMGF=1\x0d) А как быть, когда среди них есть простая команда, вроде ATE0 или ATV0? -
Автономное питание SIM900D без аккумулятора?
Apik опубликовал тема в Сотовая связь и ее приложения
Есть устройство на SIM900D. В качестве резервного источника питания стоит аккумулятор. Но место в корпусе ограничено, от аккумулятора нужно избавиться. Ставил на вход конденсаторы по 5000 мкФ, потом ионистор 47 000 мкФ - не помогает - энергия быстро иссякает. По идее нужен минимум - успеть отправить СМС-ку с уведомлением, что пропала эл. сеть, и все. Как можно реализовать? -
SIM900D отключается при регистрации в сети
Apik опубликовал тема в Сотовая связь и ее приложения
Есть рабочая схема, работала в стадии отладки долгое время, пришло время собрать все в корпус. И тут внезапно выискался глюк - при получении CREG: 1 модуль вдруг отключается. Просадки по питанию нету, все работало... Если не вставлять симку - работает. Вставил - и снова отключается. Схему приводить не буду, подключено все по правилам (много читал форум, да и отладочная плата уже не первая, все условия соблюдены) В чем может быть дело? Перепрошивка на 1137B08SIM900D64 не помогла UPDATE: помогла замена конденсатора на выводах питания SIM900D. Видимо поизносился изрядно старый. -
Радиомодули RF-2400 - не получается настроить прием
Apik опубликовал тема в RF & Microwave Design
Здравствуйте. Купил на 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] -
Вопросы начинающих
Apik ответил Uladzimir тема в Altium Designer, DXP, Protel
Есть круглая печатная плата. Как залить ее круглым полигоном (GND)?. Polygon Pour квадратный, по контуру платы не обрезается. UPDATE: сделал так - сделал круг по контуру платы в слое полигона. В итоге полигон не может пересечь замкнутую дорожку в своем слое, и остается круглым. -
Примеры схем питания SIM900
Apik ответил terry тема в Сотовая связь и ее приложения
Стоит задача перевести SIM900D с аккумулятора (подключен напрямую с конденсатором 1000мкФ) на работу от ИИП (5-6В). Причем не просто перевести, а аккумулятор оставить резевным. Резервирование хотел сделать сперва на транзисторных ключал, но потом остановился просто на двух диодах, т.к. напряжение на аккумуляторе в лучшие времена 4,2В, а напряжение ИИП в худшие времена 5В (простота - залог здоровья). SIM900D хочу питать от 4В, ставить буду ST1S10. И вот вопрос - когда 220В есть, все хорошо - ST1S10 будет снижать напряжение с 5 до 4В. Но когда будет питаться от аккумулятора, и вдруг аккумулятор окажется в это время подразряжен, например до 3,7В. Что будет на выходе ST1S10? Выдаст от мне мои 3,7В? Конечно можно снизить напряжение питания с 4В до 3,5В - конечно тут уже меньше шансов, что аккумулятор окажется настолько разряжен, тем более в программе заложена проверка заряда и зарядка через LTC4054. Но мало ли, раз в год и палка стреляет. -
SIM900D
Apik ответил NSA тема в Сотовая связь и ее приложения
можно тоже прошивку на SIM900D с DMTF alexsacha1984(собака)mail.ru