Добрый день.
Имеется китайская платка с обвесом sim800l.
В целом, все, что хотел получить от модуля через stm32f1x, получил.
Осталось заставить модуль уходить в сон когда ему нечего делать.
Судя по амперметру, модуль вполне уменьшает потреблние вдвойку через 5 сек неактивности в режиме "AT+CSCLK=2".
Но! Модуль непрерывно мечет байты 0x11, 0x13 на вход контроллера по USART.
Без сна все работает идеально, никакой левоты, после вывода из сна все также работает корректно.
Что за мусор идет в порт во сне? Наводки от отключенного передатчика? Пробовал подсунуть резистор 10к с RX контроллера на землю. Никого не впечатлил
Есть ли ответ/идеи по подавлению мусора?
Спасибо.
PS. Мусор не дает перевести контроллер в сон. Работе, в принципе, не мешает.
11h - 13h это XON - XOFF.
Откуда они берутся по-прежнему не понятно. Флагов ошибок нет.
Отключить управление потоком на stm32, насколько я понимаю, нельзя.
Mysteo
Aug 22 2017, 12:01
Пробуждайте МК через линию uart_RI, а от uart отвяжите пробуждение. Или на stm это нельзя сделать?
Можно.
Но. Чтение все равно придется сделать по прерыванию. А это будет будить контроллер.
По опросу, как оказалось, не успеваю вычитывать. Да и безобразно это по логике.
Через dma буду постоянно забивать буфер этими xon'ами.
Попробую уводить в сон sim800 по первому варианту - через dtr. Там прозрачнее пробуждение и, судя по описанию, другой вариант мониторинга порта для сна. Может он совсем заснет...
Подключил DTR. SIM800 стала адекватнее просыпаться. Все необходимое работает.
Ксоны-ксофы так и сыпятся.
Забил. При извлечении множу на ноль. Получилось не увеличить заметно потребление.
Цырен.
Aug 24 2017, 09:32
Цитата(Bil @ Aug 23 2017, 21:11)
Подключил DTR. SIM800 стала адекватнее просыпаться. Все необходимое работает.
Ксоны-ксофы так и сыпятся.
Забил. При извлечении множу на ноль. Получилось не увеличить заметно потребление.
Странно, все это. А у вас включен CMUX? И какая у вас прошивка? Можете привести весь АТ лог, чтобы я воспроизвел у себя на отладке (на SIM800H)? Я себя я этого не вижу, и это ненормально.
Настройка модуля. Условно. Контроль удален. Все выполняется без ошибок
Put_Modem ( "AT+IFC=1,1", 0, TRUE );
Put_Modem ( "AT+IPR=4800", 0, TRUE );
Put_Modem ( "ATE0", 0, TRUE );
Put_Modem ( "ATV1", 0, TRUE );
Put_Modem ( "AT+CMEE=1", 0, TRUE );
Put_Modem ( "AT+CLIP=1", 0, TRUE );
Put_Modem ( "AT+CMGF=0", 0, TRUE );
Put_Modem ( "AT+CSCS=\"UCS2\"", 0, TRUE );
Put_Modem ( "AT+CSCB=1", 0, TRUE );
Put_Modem ( "AT+CPMS=\"ME_P\",\"ME_P\",\"ME_P\"", 0, TRUE );
Put_Modem ( "AT+CMGDA=6", 0, TRUE );
Put_Modem ( "AT+CNMI=3,2", 0, TRUE );
Put_Modem ( "AT+DDET=1,100,0,0", 0, TRUE );
Put_Modem ( "AT+CSGS=0", 0, TRUE );
Put_Modem ( "AT+CNETLIGHT=0", 0, TRUE );
Put_Modem ( "AT+CSCLK=1", 0, TRUE );
Перевод модуля в спать
void Set_Modem_Low_Power ( void ) {
GPIO_WriteBit ( GPIOA, GPIO_Pin_5, Bit_SET );
}
Вывод модуля из спать
void Set_Modem_Std_еPower ( void ) {
uint32_t Time = RTC_GetCounter ();
GPIO_WriteBit ( GPIOA, GPIO_Pin_5, Bit_RESET );
while ( ( RTC_GetCounter () - Time ) < 2 );
}
Извлечение байта
void USART1_IRQHandler ( void ) {
if ( USART_GetFlagStatus ( USART1, USART_FLAG_RXNE ) != RESET ) {
uint8_t Byte = USART_ReceiveData ( USART1 );
if ( ( Byte != 0x11 ) && ( Byte != 0x13 ) ) {
*USART_Write_Pointer++ = Byte;
if ( USART_Write_Pointer == ( USART_Buffer + USART_BUFFER_SIZE ) )
USART_Write_Pointer = USART_Buffer;
}
}
}
Настройка околомодульного железа
GPIO_StructInit ( &GPIO_InitStruct );
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init ( GPIOA, &GPIO_InitStruct );
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_Init ( GPIOA, &GPIO_InitStruct );
USART_StructInit ( &USART_InitStruct );
USART_InitStruct.USART_BaudRate = 4800;
USART_InitStruct.USART_WordLength = USART_WordLength_8b;
USART_InitStruct.USART_StopBits = USART_StopBits_1;
USART_InitStruct.USART_Parity = USART_Parity_No;
USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_Init ( USART1, &USART_InitStruct );
USART_Cmd ( USART1, ENABLE );
USART_ITConfig ( USART1, USART_IT_RXNE, ENABLE );
Сейчас не могу сказать версию, забыл посмотреть. Но. Заменил позапрошлогодний модуль 800l на модуль, купленный в этом году. Никакой разницы.
Сейчас подключил RI от модуля.
Перед переводом в сон контроллера перевожу ноги rx и tx в вывод и верхнее состояние. Чтобы не прерываться от этих ксонов.
По прерыванию от RI перенастраиваю ноги в правильный режим и включаю тактирование usart контроллера. С удивлением вижу, что ничего не теряю. Для этого, на всякий, максимально понизил скорость порта.
Задачу решил. От ксонов не избавился. Что-то я с портом контроллера или модулем не доделал.
serglg
Aug 26 2017, 03:52
XON/XOFF - это ведь программное управление потоком?
Модуль настроен так, что регулярно сообщает - "я готов к приему".
Ну так надо в настройках его порта сказать - "без контроля потока".
Или таких настроек нет?
Зачем он сообщает при "отключенном" по даташиту порте?
Модуль кастрат. Аппаратного управления сделать не могу.
Без контроля модуль может, контроллер - нет. Да и не знаю что из этого вышло бы.
С другой стороны, почему контроллер не режет управляющие символы?..
Revision:1418B04SIM800L24
vit496
Aug 28 2017, 08:07
Цитата(Bil @ Aug 20 2017, 12:39)
Отключить управление потоком на stm32, насколько я понимаю, нельзя.
Не понимаю этой фразы. Как можно включить или выключить в самом контроллере программное управление потоком (software flow)? Оно же ведь в программе (пользователя)?
Попробуйте AT+IFC=0,0 или 2,2 (при 2,2 нужно на RTS подать 0).
CADiLO
Aug 28 2017, 13:34
Мыши плакали, кололись, но продолжали жрать кактус.
Не надоело еще возиться с SIM800L который был предназначен неизвестно кому на китайском рынке и неизвестно с чем внутри.
Почему у меня на SIM800H и SIM800С все нормально со сном?
Ничего в порт не плюет и потребление меньше миллиампера.
Специально поставил модули на отладку и перепроверил.
Mysteo
Aug 28 2017, 14:29
Я тоже на трех модемах 900 серии D и R проверил, проблем таких не было )
Цитата(vit496 @ Aug 28 2017, 11:07)
Не понимаю этой фразы. Как можно включить или выключить в самом контроллере программное управление потоком (software flow)? Оно же ведь в программе (пользователя)?
В программе оно когда от порта используется только приемо/передатчик.
Цитата
Попробуйте AT+IFC=0,0 или 2,2 (при 2,2 нужно на RTS подать 0).
2.2 нельзя, китайский модуль sim800l не имеет соответствующих дырок, иначе вопрос и не появился бы.
А вот 0, 0 ЕЩЕ раз попробовал. И офигел, и контроллер все понимал, и ксоны кончились...
С этого, от безысходности, начинал. Похоже, я настраивал поток в начальный затуп, так как из последних изменений только начальная пауза. Ибо положенных мне после старта RDY и других URC я в отладчике так и не увидел. Слишком медлеено он стартует, походу. Натолкнула на паузу странная работа с оповещением о смс. Под отладчиком приходят ожидаемые +CMT. А без отладчика (в реале) присовывал мне +CMTI. В листинге видно сколько всего надо сделать до управления форматом оповещения. Только с большой паузой на старте модем адекватно съел команды когда они ему приходили без паузы отладчика.
Кстати, про сон. Общее потребление приблуды в работе 27мА. При засыпании sim потребление падает до 18мА. При засыпании контроллера - до 13мА. Питая контроллер отлельно, определил, что он жрет в работе около 8мА. То есть, засыпает до 3мА. А вот sim никак на заявленный 1мА близко не выходит. Кроме них есть два dc-dc и два делителя на пол мА в сумме.
Всем спасибо, все , что хотел, получил.
CADiLO
Aug 28 2017, 19:46
>>>А вот sim никак на заявленный 1мА близко не выходит.
прекрасно выходит, приезжайте в гости - покажу.
дергаем DTR - спать!
UART контроллера в третье состояние чтобы стоповый бит не висел на приеме - порт модуля должен быть в это время вообще отключен и не иметь вытекающего тока.
и контролируем RI
по прерыванию выжидаем положеные 50 миллисекунд, просыпаемся и начинаем общение
читайте доки и используйте нормальные модули и прошивки
кстати есть хитрости которые позволяют на SIM800C получить 0.8 мА без потери сети, а на SIM868 - 0.45 мА
но это для тех кто не только доки на модуль прочел, а и апнотесы и даташит на чипсет
проверено на штатных релизных прошивках - таки работает.
проверялось на EVB KIT и потом на PIC24 и NUC472 и NUC240
ArtemKAD
Aug 29 2017, 05:37
Цитата(CADiLO @ Aug 28 2017, 22:46)
UART контроллера в третье состояние чтобы стоповый бит не висел на приеме - порт модуля должен быть в это время вообще отключен и не иметь вытекающего тока.
Можно так не извращаться. Даже если использована подтяжка на стороне МК выход модуля по любому в единице. Т.е. токов там или нет или малозаметны на уровне единиц-десятков мкА. Больше вопросов возникает если используется 5В МК и какой нибудь веселый преобразователь уровня который может жрать на уровне модуля...
Цитата(CADiLO @ Aug 28 2017, 22:46)
и контролируем RI
по прерыванию выжидаем положеные 500 миллисекунд, просыпаемся и начинаем общение
0,5с по прерыванию? Точно со временем не ошиблись? Это откуда такая величина?
CADiLO
Aug 29 2017, 06:24
>>>0,5с по прерыванию? Точно со временем не ошиблись? Это откуда такая величина?
Опечатался. Исправил - должно быть 50 миллисекунд.
4.3.3. Wake Up SIM800C from Sleep Mode 1
When SIM800C is in sleep mode 1(AT+CSCLK=1), the following methods can wake up the module:
Pull down DTR pin.
The serial port will be active after DTR pin is pulled to low level for about 50ms.
Receive a voice or data call from network.
Receive a SMS from network.
Receive external interrupt.
Note: After module has received incoming call or new SMS, serial port can report URC, but the serial port can not input AT command.
Only after the DTR pin is pulled to low level for 50ms, the serial port can input AT command.
>>>Можно так не извращаться. Даже если использована подтяжка на стороне МК выход модуля по любому в единице.
Если нужно выжать минимальное потребление, то лучше поизвращаться. Иногда и десяток микроампер имеет значение.
ArtemKAD
Aug 29 2017, 06:58
Цитата(CADiLO @ Aug 29 2017, 09:24)
Only after the DTR pin is pulled to low level for 50ms, the serial port can input AT command.
А, это та зараза которая всю малину портит. Из-за неё пришлось лишний буфер городить в не резиновой оперативке.
Цитата(CADiLO @ Aug 29 2017, 09:24)
Если нужно выжать минимальное потребление, то лучше поизвращаться. Иногда и десяток микроампер имеет значение.
Тут человеку хотя-бы приблизительно удалось попасть. А то он похоже в трех соснах и двух dc/dc заплутал... Если он еще и с включением/выключением портов и uart-а будет извращаться, глупых вопросов только прибавится.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.