Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SIM900 и STM32F1xx, STM32F4xx
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
Morze
Хочется подключить модуль по полному USART2. На стороне микроконтроллера имеем:
USART2_TX
USART2_RX
USART2_CTS
USART2_RTS
USART2_CK
На стороне SIM900:
TXD
RXD
RTS
CTS
DTR
DCD
RI
С TXD, RXD, RTS, CTS вся вполне понятно. А вот с линиями DTR, DCD и RI что-то не ясно.
Есть пользователи этих модемов, кто подключал их к STM? Ткните носом пожалуйста rolleyes.gif
CADiLO
DTR, DCD и RI подключаете просто к любым портам - их необходимость определяется уже требованиями под вашу задачу.
SIM900_Serial Port_Application Note_V1.02.pdf
Morze
Спасибо большое. Все понятно стало biggrin.gif
=F8=
Кстати у STM есть возможность все выходы, в том числе и используемые как USARTx_TX, сконфигурировать в режим ОК(открытый коллектов), что очень удобноо для согласования уровней и предотвращения паразитного питания. И еще у STM-овского UART нет аппаратного буфера поэтому, если не хотите что-бы RTC дергалась после каждого принятого байта, этой тожкой лучше управлять программно.
Morze
Цитата(=F8= @ May 19 2012, 09:44) *
Кстати у STM есть возможность все выходы, в том числе и используемые как USARTx_TX, сконфигурировать в режим ОК(открытый коллектов), что очень удобноо для согласования уровней и предотвращения паразитного питания.

Можно запитать МК от 2.8 вольт.
=F8=
Цитата(Morze @ May 30 2012, 06:56) *
Можно запитать МК от 2.8 вольт.http://electronix.ru/forum/style_images/1/folder_editor_images/rte-switch-editor.png

Это не решает проблемы с паразитным питанием. При любом питании придется следить за Status что бы вовремя перевести ножки в z состояние. Если использовать выход с ОК то этой проблемы не будет. Кроме того при питании 2.8В могут быть прблемы с 5В переферией.
Morze
Цитата(=F8= @ May 30 2012, 09:40) *
Это не решает проблемы с паразитным питанием. При любом питании придется следить за Status что бы вовремя перевести ножки в z состояние. Если использовать выход с ОК то этой проблемы не будет. Кроме того при питании 2.8В могут быть прблемы с 5В переферией.

Спасибо.
Есть мысль повесить входы SIM900 через преобразователи уровней SN74LVC2T45. Питание преобразователя (ту сторону, на которой стоит SIM900) давать с LDO 2.8вольта, управляя сигналом VDD_EXT. Или все таки управлять сигналом STATUS?
CADiLO
При включении контроллера все выводы до инициализации однозначно будут или входами или в 3 состоянии.
Значит при питании контроллера 2.8-3.0 вольта достаточно анализа STATUS и выводы соединяем без преобразователей уровня.
При 3.3 вольта на контроллере и выше - ставим преобразователь и далее как предлагали. Здесь Vext и STATUS будут равнозначны,
только учитывайте что STATUS имеет меньшую нагрузочную способность, так как это вывод чипсета.

Единственное место - POWERKEY - даже если контроллер умеет настраиваться в виртуальный открытый коллектор,
настоятельно рекомендую ставить в эту цепь ключик - как показано у SIMCOM. Были неприятные прецеденты.
На 1 транзисторе много не сэкономите, зато одну из причин возможных глюков гарантировано устраните.
Morze
Удалил весь бред, что написал. Переделываю)
Peps
Цитата(=F8= @ May 19 2012, 08:44) *
Кстати у STM есть возможность все выходы, в том числе и используемые как USARTx_TX, сконфигурировать в режим ОК(открытый коллектов), что очень удобноо для согласования уровней и предотвращения паразитного питания. И еще у STM-овского UART нет аппаратного буфера поэтому, если не хотите что-бы RTC дергалась после каждого принятого байта, этой тожкой лучше управлять программно.


Сегодня прыгал по граблям с STM8S. Выползло неприятное свойство: при настройке GPIO в режим открытого коллектора - проблем не возникает - работает как открытый коллектор. А если на этом выводе включается периферия (в частности UART1) - он опять становится подтянут к питанию микроконтроллера. О как! То есть при работе с UART согласование уровней с помощью ОК не прокатит. Акцентирую внимание, это я проверял на STM8S103K.
ssokol
Цитата(Peps @ Jun 1 2012, 13:31) *
Сегодня прыгал по граблям с STM8S. Выползло неприятное свойство: при настройке GPIO в режим открытого коллектора - проблем не возникает - работает как открытый коллектор. А если на этом выводе включается периферия (в частности UART1) - он опять становится подтянут к питанию микроконтроллера. О как! То есть при работе с UART согласование уровней с помощью ОК не прокатит. Акцентирую внимание, это я проверял на STM8S103K.

Точно так же и у stm32 cortex m3 ... да не отсохнет язык у CADiLO в очередной раз повторять одно и то же Ж:-)))
CADiLO
пора уже мантру писать..... sm.gif
=F8=
Цитата(ssokol @ Jun 1 2012, 13:51) *
Точно так же и у stm32 cortex m3 ... да не отсохнет язык у CADiLO в очередной раз повторять одно и то же Ж:-)))

Нету там подтяжки. Только-что специально перерезал дорожку и убрал подтягивающий резистор. После инициализации порта на ножке 0. Контроллер STM32F103RCT. Если кому интересно могу и на STM32F207 проверить.
CADiLO
>>>После инициализации порта на ножке 0.

ноль или Z ?

=F8=
Цитата(CADiLO @ Jun 1 2012, 14:23) *
>>>После инициализации порта на ножке 0.

ноль или Z ?

Z разумеется. 0 это то, что тестор показывает sm.gif Верхний транзастор закрыт т.к. ОК, нижний тоже. На тесторе тоже разрыв цепи.
Для контроля на предмет не напутал ли чего переконфиурировал ножку из режима OD в режим PP на ножке, как и положено после инициализации появилась "1".
Peps
Цитата(=F8= @ Jun 1 2012, 14:45) *
Z разумеется. 0 это то, что тестор показывает sm.gif Верхний транзастор закрыт т.к. ОК, нижний тоже. На тесторе тоже разрыв цепи.
Для контроля на предмет не напутал ли чего переконфиурировал ножку из режима OD в режим PP на ножке, как и положено после инициализации появилась "1".


Ага! А вот теперь если на эту ножку выходит TxD UARTа попробуйте включить передатчик UART (обязательно включите ему и тактовую частоту) и вуаля! Порт опять в 1 (напряжение питания контроллера). Весь цимус в том, что если ножка работает как порт IO - то не вопрос - все конфигурируется как надо, а если на него выходит TxD - то уже обычный пуш-пул (или подтянут резистором).
А у себя на плате я на всякий случай предусмотрел преобразователь уровня на одном биполярнике. Эх, видимо сработали прадедушкины гены из Израиля sm.gif
=F8=
Цитата(Peps @ Jun 1 2012, 15:26) *
Ага! А вот теперь если на эту ножку выходит TxD UARTа попробуйте включить передатчик UART (обязательно включите ему и тактовую частоту) и вуаля! Порт опять в 1 (напряжение питания контроллера). Весь цимус в том, что если ножка работает как порт IO - то не вопрос - все конфигурируется как надо, а если на него выходит TxD - то уже обычный пуш-пул (или подтянут резистором).
А у себя на плате я на всякий случай предусмотрел преобразователь уровня на одном биполярнике. Эх, видимо сработали прадедушкины гены из Израиля sm.gif


Я же написал проверял после инициализации порта.
Код
bool UartT::Open()
{
  if(!OpenFlag)
  {
    TxCounter  = TxRdIndex = 0;
    TxStopped  = 0;
    TxComplete = 1;
    RxRdIndex  = 0;
    
    USART_DeInit(UART);
    
    {
      USART_InitTypeDef  UART_InitStructure;
      
      UART_InitStructure.USART_BaudRate   = UartLineCoding.dwDTERate;
      UART_InitStructure.USART_WordLength = USART_WordLength_8b;
      UART_InitStructure.USART_StopBits   = USART_StopBits_1;
      UART_InitStructure.USART_Parity     = USART_Parity_No;
      UART_InitStructure.USART_Mode       = USART_Mode_Rx|USART_Mode_Tx;
      UART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        
      USART_Init(UART,&UART_InitStructure);
      
      USART_ClearFlag(UART, USART_FLAG_CTS | USART_FLAG_LBD  |
                               USART_FLAG_TC  | USART_FLAG_RXNE );
    }
    
    {
      DMA_InitTypeDef DMA_InitStruct;
      
      DMA_DeInit(RxDMA_Channel);
      
      DMA_InitStruct.DMA_PeripheralBaseAddr = (U32)&UART->DR;
      DMA_InitStruct.DMA_MemoryBaseAddr     = (U32)&RxBuffer[0];
      DMA_InitStruct.DMA_DIR                = DMA_DIR_PeripheralSRC;  
      DMA_InitStruct.DMA_BufferSize         = RX_BUFFER_SIZE;
      DMA_InitStruct.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
      DMA_InitStruct.DMA_MemoryInc          = DMA_MemoryInc_Enable;
      DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
      DMA_InitStruct.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
      DMA_InitStruct.DMA_Mode               = DMA_Mode_Circular;
      DMA_InitStruct.DMA_Priority           = DMA_Priority_Low;
      DMA_InitStruct.DMA_M2M                = DMA_M2M_Disable;
      
      DMA_Init(RxDMA_Channel, &DMA_InitStruct);
      DMA_Cmd(RxDMA_Channel, ENABLE);
      
      DMA_DeInit(TxDMA_Channel);
      
      DMA_InitStruct.DMA_PeripheralBaseAddr = (U32)&UART->DR;
      DMA_InitStruct.DMA_MemoryBaseAddr     = (U32)&TxTmpBuffer[0];
      DMA_InitStruct.DMA_DIR                = DMA_DIR_PeripheralDST;  
      DMA_InitStruct.DMA_BufferSize         = 16;
      DMA_InitStruct.DMA_PeripheralInc      = DMA_PeripheralInc_Disable;
      DMA_InitStruct.DMA_MemoryInc          = DMA_MemoryInc_Enable;
      DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
      DMA_InitStruct.DMA_MemoryDataSize     = DMA_MemoryDataSize_Byte;
      DMA_InitStruct.DMA_Mode               = DMA_Mode_Normal;
      DMA_InitStruct.DMA_Priority           = DMA_Priority_Low;
      DMA_InitStruct.DMA_M2M                = DMA_M2M_Disable;
      
      DMA_Init(TxDMA_Channel, &DMA_InitStruct);
      DMA_ITConfig(TxDMA_Channel, DMA_IT_TC, ENABLE);
      OpenFlag = true;
    }
  

    // Enable UART
    USART_DMACmd(UART, USART_DMAReq_Rx|USART_DMAReq_Tx, ENABLE);  
    USART_Cmd(UART, ENABLE);
  
  }
  return true;
}


bool GSM_UartT::Open()
{
    UART = USART3;
    TxDMA_Channel = DMA1_Channel2;
    RxDMA_Channel = DMA1_Channel3;
    
    if(OpenFlag)return true;
    
    portENTER_CRITICAL();
    
    Config(&GsmLineCoding);
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, ENABLE);
    RCC_APB1PeriphResetCmd(RCC_APB1Periph_USART3, DISABLE);
    
    GPIO_PinRemapConfig(GPIO_PartialRemap_USART3, ENABLE);

    {
      GPIO_InitTypeDef GPIO_InitStructure;
      // Assign PC10 to UART4 (Tx)
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
      GPIO_Init(GPIOC, &GPIO_InitStructure);

      // Assign PC11 to UART4 (Rx)
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
      GPIO_Init(GPIOC, &GPIO_InitStructure);
    }
    // Init UART4
    
    UartT::Open();
    
    {
      NVIC_InitTypeDef NVIC_InitStructure;
      
      NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel2_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configMAX_SYSCALL_INTERRUPT_PRIORITY;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
    }
    portEXIT_CRITICAL(); //ПРОВЕРЯЛ В ЭТОЙ ТОЧКЕ.
    return true;
}
Peps
Ну в таком случае реализация портов в Cortex-ах отличается от STM8
ssokol
Цитата(=F8= @ Jun 1 2012, 16:46) *
Я же написал проверял после инициализации порта.

читаем RM0041
TX: Transmit Data Output. When the transmitter is disabled, the output pin returns to its IO
port configuration. When the transmitter is enabled and nothing is to be transmitted, the TX
pin is at high level. In single-wire and smartcard modes, this IO is used to transmit and
receive the data (at USART level, data are then received on SW_RX).
... уж так хотим CADiLO в монастырь загнать...
Peps
Вот, после того, как я обломался на железе, внимательно перечитав мануалку нашел то же самое.
=F8=
Цитата
Цитата(ssokol @ Jun 24 2012, 21:05) *
читаем RM0041
TX: Transmit Data Output. When the transmitter is disabled, the output pin returns to its IO
port configuration. When the transmitter is enabled and nothing is to be transmitted, the TX
pin is at high level. In single-wire and smartcard modes, this IO is used to transmit and
receive the data (at USART level, data are then received on SW_RX).
... уж так хотим CADiLO в монастырь загнать...

А теперь еще раз перечитываем и задаем себе вопрос что представляет собой high level в режиме открытый сток? Если возникают сомнения может ли выход одновременно работать в режиме AF и OD (сомнения обоснованные т.к. не каждый контроллер позволяет такой финт ушами) смотрим таблицу 20 RM0008 для STM101-107 и таблицу 14 RM0033 для STM205-215. Если сомнения все-же остаются берем контроллер, инициализируем порт и проверяем.
Цитата
Вот, после того, как я обломался на железе, внимательно перечитав мануалку нашел то же самое.

А я вот не обломался. Наверное что-то не так сделал...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.