|
SIM900 и STM32F1xx, STM32F4xx, вопрос по железу. |
|
|
|
May 17 2012, 11:28
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 18-01-08
Из: Королев
Пользователь №: 34 196

|
Хочется подключить модуль по полному 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? Ткните носом пожалуйста
|
|
|
|
|
May 30 2012, 03:56
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 18-01-08
Из: Королев
Пользователь №: 34 196

|
Цитата(=F8= @ May 19 2012, 09:44)  Кстати у STM есть возможность все выходы, в том числе и используемые как USARTx_TX, сконфигурировать в режим ОК(открытый коллектов), что очень удобноо для согласования уровней и предотвращения паразитного питания. Можно запитать МК от 2.8 вольт.
|
|
|
|
|
May 31 2012, 07:04
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 18-01-08
Из: Королев
Пользователь №: 34 196

|
Цитата(=F8= @ May 30 2012, 09:40)  Это не решает проблемы с паразитным питанием. При любом питании придется следить за Status что бы вовремя перевести ножки в z состояние. Если использовать выход с ОК то этой проблемы не будет. Кроме того при питании 2.8В могут быть прблемы с 5В переферией. Спасибо. Есть мысль повесить входы SIM900 через преобразователи уровней SN74LVC2T45. Питание преобразователя (ту сторону, на которой стоит SIM900) давать с LDO 2.8вольта, управляя сигналом VDD_EXT. Или все таки управлять сигналом STATUS?
|
|
|
|
|
May 31 2012, 17:11
|
Участник

Группа: Участник
Сообщений: 64
Регистрация: 18-01-08
Из: Королев
Пользователь №: 34 196

|
Удалил весь бред, что написал. Переделываю)
Сообщение отредактировал Morze - Jun 1 2012, 05:13
|
|
|
|
|
Jun 1 2012, 09:31
|
Частый гость
 
Группа: Участник
Сообщений: 183
Регистрация: 12-01-10
Из: Минск
Пользователь №: 54 745

|
Цитата(=F8= @ May 19 2012, 08:44)  Кстати у STM есть возможность все выходы, в том числе и используемые как USARTx_TX, сконфигурировать в режим ОК(открытый коллектов), что очень удобноо для согласования уровней и предотвращения паразитного питания. И еще у STM-овского UART нет аппаратного буфера поэтому, если не хотите что-бы RTC дергалась после каждого принятого байта, этой тожкой лучше управлять программно. Сегодня прыгал по граблям с STM8S. Выползло неприятное свойство: при настройке GPIO в режим открытого коллектора - проблем не возникает - работает как открытый коллектор. А если на этом выводе включается периферия (в частности UART1) - он опять становится подтянут к питанию микроконтроллера. О как! То есть при работе с UART согласование уровней с помощью ОК не прокатит. Акцентирую внимание, это я проверял на STM8S103K.
|
|
|
|
|
Jun 1 2012, 11:45
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата(CADiLO @ Jun 1 2012, 14:23)  >>>После инициализации порта на ножке 0.
ноль или Z ? Z разумеется. 0 это то, что тестор показывает  Верхний транзастор закрыт т.к. ОК, нижний тоже. На тесторе тоже разрыв цепи. Для контроля на предмет не напутал ли чего переконфиурировал ножку из режима OD в режим PP на ножке, как и положено после инициализации появилась "1".
|
|
|
|
|
Jun 1 2012, 12:26
|
Частый гость
 
Группа: Участник
Сообщений: 183
Регистрация: 12-01-10
Из: Минск
Пользователь №: 54 745

|
Цитата(=F8= @ Jun 1 2012, 14:45)  Z разумеется. 0 это то, что тестор показывает  Верхний транзастор закрыт т.к. ОК, нижний тоже. На тесторе тоже разрыв цепи. Для контроля на предмет не напутал ли чего переконфиурировал ножку из режима OD в режим PP на ножке, как и положено после инициализации появилась "1". Ага! А вот теперь если на эту ножку выходит TxD UARTа попробуйте включить передатчик UART (обязательно включите ему и тактовую частоту) и вуаля! Порт опять в 1 (напряжение питания контроллера). Весь цимус в том, что если ножка работает как порт IO - то не вопрос - все конфигурируется как надо, а если на него выходит TxD - то уже обычный пуш-пул (или подтянут резистором). А у себя на плате я на всякий случай предусмотрел преобразователь уровня на одном биполярнике. Эх, видимо сработали прадедушкины гены из Израиля
Сообщение отредактировал Peps - Jun 1 2012, 12:28
|
|
|
|
|
Jun 1 2012, 12:46
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата(Peps @ Jun 1 2012, 15:26)  Ага! А вот теперь если на эту ножку выходит TxD UARTа попробуйте включить передатчик UART (обязательно включите ему и тактовую частоту) и вуаля! Порт опять в 1 (напряжение питания контроллера). Весь цимус в том, что если ножка работает как порт IO - то не вопрос - все конфигурируется как надо, а если на него выходит TxD - то уже обычный пуш-пул (или подтянут резистором). А у себя на плате я на всякий случай предусмотрел преобразователь уровня на одном биполярнике. Эх, видимо сработали прадедушкины гены из Израиля  Я же написал проверял после инициализации порта. Код 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; }
|
|
|
|
|
Jun 24 2012, 17:05
|
Знающий
   
Группа: Свой
Сообщений: 615
Регистрация: 14-02-08
Из: г. Рыбинск, Ярославская область
Пользователь №: 35 028

|
Цитата(=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 в монастырь загнать...
|
|
|
|
|
Jun 25 2012, 07:21
|
Знающий
   
Группа: Свой
Сообщений: 567
Регистрация: 7-07-07
Из: Донецк
Пользователь №: 28 954

|
Цитата Цитата(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. Если сомнения все-же остаются берем контроллер, инициализируем порт и проверяем. Цитата Вот, после того, как я обломался на железе, внимательно перечитав мануалку нашел то же самое. А я вот не обломался. Наверное что-то не так сделал...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|