Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Чтение регистра DR USART

Непрочитано 25.12.2016, 19:54  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Чтение регистра DR USART

Привет! Помогите пожалуйста. Есть железо: сборная отладка с stm32f100ret6b, gsm модем сименс тс35i, lcd дисплей 1602А, матричная клава. Всё это барахло собрано вместе. Плата и модем дружат по usart1. Замысел такой: у меня сделано меню, когда я перехожу на определённый пункт, на модем отправляется ат команда на чтение номера телефона смс центра сообщений. То есть при попадании на этот пункт задачи вывести забитый в модем номер - на экран. Фишка в том, что на экран у меня выводится и запрос и ответ. Код:

Это фрагмент кода, когда переходим на нужный пункт:
Код:
case 6:
LCD_Send_String(0, menu_text[index].text);
LCD_Go_To(1, 0);
GSM_COMM_SEND_SMS_SERVICE();
break;
Тут в верхней строчке пишем название пункта, потом прыгаем на нижнюю и вызываем функцию, которая должна организовать запрос на модем. Далее файл gsm.c
Код:
#include "gsm.h"
#include "lcd.h"

char Buffer[] = "AT+CSCA?\r\n";
uint8_t flag_receive;

void DMA1_Channel4_IRQHandler(void){ //Прерывание DMA
		if(DMA1-›ISR & DMA_ISR_TCIF4){ //Если прерывание вызвано завершением передачи...
				DMA1-›IFCR = DMA_IFCR_CTCIF4; //Сброс флага завершения передачи
				DMA1_Channel4-›CCR &= ~DMA_CCR4_EN; //Вырубаем DMA
		}
}

void USART1_IRQHandler(void){ //Прерывание USART1
		if(USART1-›SR & USART_SR_RXNE){ //Если прерывание вызвано по приёму USART1
				USART1-›SR &= ~USART_SR_RXNE; //Сбрасываем флаг приёма USART1
				flag_receive = 1;
		}
}

void GSM_INI(void){
		RCC-›APB2ENR |= RCC_APB2ENR_USART1EN;                           //USART1 clock
		RCC-›APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_AFIOEN;        //PortA & Alt clock
		GPIOA-›CRH &= ~GPIO_CRH_CNF9_0;
		GPIOA-›CRH |= GPIO_CRH_CNF9_1; 																	//Alternate function output Push-pull
		GPIOA-›CRH |= GPIO_CRH_MODE9_1; 																//Speed 2 MHz
	
//==USART===========================================  ============================================	
		USART1-›BRR = 0x9C4; //9600 бод скорость обмена
		USART1-›CR1 |= USART_CR1_RXNEIE; //Разрешаем локальные прерывания по приёму USART
		USART1-›CR1 |= USART_CR1_RE | USART_CR1_TE; //Включаем передатчик и приёмник
		USART1-›CR1 |= USART_CR1_UE; //Включаем USART
	  NVIC_EnableIRQ(USART1_IRQn); //Разрешаем глобальные прерывания для USART1
//==================================================  ============================================

//==DMA=============================================  ============================================
		RCC-›AHBENR |= RCC_AHBENR_DMA1EN;
		DMA1_Channel4-›CPAR = (uint32_t)&(USART1-›DR); //С какой периферией работаем
		DMA1_Channel4-›CMAR = (uint32_t)Buffer; //Указатель на нулевой элемент буфера откуда отправляем данные
		DMA1_Channel4-›CCR |= DMA_CCR4_DIR | DMA_CCR4_MINC; //Читаем ИЗ памяти в периферию | при считывании увеличиваем на 1 адрес буфера Buffer, что бы при следующем считывани перейти на след ячейку памяти.
		DMA1_Channel4-›CCR &= ~DMA_CCR4_PINC; //Увеличение на 1 адрема периферии выкл. Если вкл, то счётчик увеличится при след. чтении и тогда работа будет уже не с юсарт а с другой периферией
		DMA1_Channel4-›CCR |= DMA_CCR4_TCIE;
		//DMA1_Channel4-›CNDTR = sizeof(Buffer); //Размер буфера данных
		DMA1_Channel4-›CCR &= ~(DMA_CCR4_MSIZE | DMA_CCR4_PSIZE | DMA_CCR4_CIRC); //Память - 8 бит | Периферия - 8 бит | Не циклическая передача.
		DMA1_Channel4-›CCR |= DMA_CCR4_PL_0; //Приоритет - средний (Medium)
		USART1-›CR3 |= USART_CR3_DMAT; // Разрешаем USART использовать DMA
		NVIC_EnableIRQ(DMA1_Channel4_IRQn); //Разрешаем глобально прерывания по DMA1 канал 4
		DMA1_Channel4-›CCR |= DMA_IT_TC; //Разрешаем локальнве прерывания по завершению передачи DMA1 канал 4
	
//==================================================  ============================================	
}

void GSM_COMM_SEND_SMS_SERVICE(){
		DMA1_Channel4-›CNDTR = sizeof(Buffer); //Размер данных, которые будем передавать
		DMA1_Channel4-›CCR |= DMA_CCR4_EN; //Запускаем DMA (процесс передачи)
}

void GSM_COMM_GET_SMS_SERVICE(){
		uint8_t buf;
		buf = USART1-›DR;
		LCD_Send_Data(buf);
}
//---------------------------------------------------------------
тут вверху строчка команды, настройка юсарта и дма. Передаю я через дма. Функции отправки команды и вывода на экран

А это вставляется в main в цикл while:
Код:
if(flag_receive){
GSM_COMM_GET_SMS_SERVICE();
flag_receive = 0;
}
Так вот ещё раз повторюсь, на экран выводится и запрос, а за ним ответ. А по идее должен просто ответ. Ибо в терминале если тестить, то всё нормально и в даташите написано, что ответ идёт как ответ.
Реклама:
supercelt вне форума  
Непрочитано 25.12.2016, 20:03  
mtit
Почётный гражданин KAZUS.RUN
 
Аватар для mtit
 
Регистрация: 21.03.2007
Адрес: М.(осква)
Сообщений: 4,398
Сказал спасибо: 2,192
Сказали Спасибо 1,780 раз(а) в 1,012 сообщении(ях)
mtit на пути к лучшему
По умолчанию Re: Чтение регистра DR USART

Эхо AT-команд у модема отключено?
__________________
+ 7 903 641 87 25// 1. Иногда отвечаю "по памяти" 2. Часто заблуждаюсь >> Критикуйте, не обижусь.
mtit вне форума  
Сказали "Спасибо" mtit
supercelt (25.12.2016)
Непрочитано 25.12.2016, 20:13  
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию Re: Чтение регистра DR USART

Сообщение от mtit Посмотреть сообщение
Эхо AT-команд у модема отключено?
Благодарствую)
supercelt вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пропадает байт 0x55 при передачи USART vavan1983 PIC 2 12.02.2015 23:19
USART MEGA8 yuta_86 Микроконтроллеры, АЦП, память и т.д 23 12.02.2012 04:30
Proteus и ошибка кадра USART (FERR) в PIC16F873 finiki Микроконтроллеры, АЦП, память и т.д 0 08.03.2009 13:24
Помогите разобраться с USART в CodeVisionAVR vendim Микроконтроллеры, АЦП, память и т.д 20 26.07.2007 16:42
Вопрос по мультипроцессорному обмену USART MEGA8 vikont-s Микроконтроллеры, АЦП, память и т.д 0 10.08.2006 14:55


Часовой пояс GMT +4, время: 19:06.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.