Привет! Помогите пожалуйста. Есть железо: сборная отладка с 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;
} |
Так вот ещё раз повторюсь, на экран выводится и запрос, а за ним ответ. А по идее должен просто ответ. Ибо в терминале если тестить, то всё нормально и в даташите написано, что ответ идёт как ответ.