Пн ноя 19, 2018 11:23:26
// Отправляю запрос
static void Send_responce(uint8_t data){
if(RS485_USART->SR&USART_SR_TXE){
RS485_USART->DR=0x11; //запрос на пакет
DEBUG_USART_1
USART_CallBack(0,wait_send_responce);
}
}
// Ожидания отправка + настройка DMA
static void wait_send_responce(uint8_t data){
if(RS485_USART->SR&USART_SR_TC){
//----------
RS485_IN //настраиваем на выход
delay_ms(10); //задержка на переключение
Debug2_1 // отладочный строб
Debug2_0
//
(void)RS485_USART->DR; // Сбрасываем флаг RXNE
RS485_USART->SR=0; // Сбрасываем флаг RXNE
//---------- DMA на прием ----------
SetDmaUsartData(RS485_USART,0,Receive_pack,(sizeof(Resp_pack_t)));
DMA1->IFCR|=DMA_IFCR_CGIF6;
USART_CallBack(0,wait_start_pack);
}
}
void SetDmaUsartData(USART_TypeDef* USARTx,uint8_t* Buf,uint8_t* receive,uint32_t len){
if(USARTx==USART3){
//----------
NVIC_DisableIRQ (DMA1_Channel2_IRQn);
//==================
//DMA1->IFCR |= DMA_ISR_TCIF5;//очистить флаг окончания обмена.
//==================
BIT_BAND_PER(DMA1_Channel2->CCR, DMA_CCR1_EN) = 0; //Отключили DMA
BIT_BAND_PER(DMA1_Channel3->CCR, DMA_CCR1_EN) = 0; //Отключили DMA
//----------
DMA1_Channel3->CNDTR=3; //Принимать по максимум, сколько есть
DMA1_Channel3->CMAR = (unsigned int)&receive[0];
BIT_BAND_PER(DMA1_Channel3->CCR, DMA_CCR1_EN) = 1; //Включаем
//----------
DMA1_Channel2->CNDTR= len;
DMA1_Channel2->CMAR = (unsigned int)&Buf[0];
BIT_BAND_PER(DMA1_Channel2->CCR, DMA_CCR1_EN) = 1; //Включаем
//----------
}
if(USARTx==USART2){
//----------
//NVIC_DisableIRQ (DMA1_Channel2_IRQn);
//==================
//DMA1->IFCR |= DMA_ISR_TCIF5;//очистить флаг окончания обмена.
//==================
BIT_BAND_PER(DMA1_Channel6->CCR, DMA_CCR1_EN) = 0; //Отключили DMA
//----------
DMA1_Channel6->CNDTR=len;
DMA1_Channel6->CMAR = (unsigned int)&receive[0];
BIT_BAND_PER(DMA1_Channel6->CCR, DMA_CCR1_EN) = 1; //Включаем
}
}
Пн ноя 19, 2018 11:38:04
DMA1->IFCR |= DMA_ISR_TCIF5;
(void)RS485_USART->DR; // Сбрасываем флаг RXNE
RS485_USART->SR=0; // Сбрасываем флаг RXNE
Пн ноя 19, 2018 12:14:40
void Send_USART2_DMA(uint8_t *tx_buf, uint32_t cnt)
{
GPIOA->BSRR = (1<<1); //RW=1
DMA1_Channel7->CMAR = (uint32_t) tx_buf;
USART2->DR; USART2->SR;
USART2->CR3 = USART_CR3_DMAT;
DMA1_Channel7->CNDTR = cnt;
DMA1_Channel7->CCR = DMA_CCR_MSIZE_8 | DMA_CCR_PSIZE_8 | DMA_CCR_DIR | DMA_CCR_MINC| DMA_CCR_TCIE | DMA_CCR_EN;
};
void Read_USART2_DMA(uint8_t *rx_buf, uint32_t cnt)
{
DMA1_Channel6->CMAR = (uint32_t) rx_buf;
while(!(USART2->SR & USART_SR_TC));
USART2->DR; USART2->DR;
USART2->CR3 = USART_CR3_DMAR;
DMA1_Channel6->CNDTR = cnt;
DMA1_Channel6->CCR = DMA_CCR_MSIZE_8 | DMA_CCR_PSIZE_8 | DMA_CCR_MINC| DMA_CCR_TCIE | DMA_CCR_EN;
}
extern "C" void USART2_IRQHandler(void)
{
USART2->CR1 &= ~USART_CR1_TCIE;
GPIOA->BRR = (1<<1); //RW=0
}
extern "C" void DMA1_Channel7_IRQHandler(void)
{
DMA1->IFCR = DMA_IFCR_CTCIF7;
USART2->SR = 0;
USART2->CR1 |= USART_CR1_TCIE;
USART2->CR3 = 0;
DMA1_Channel7->CCR = DMA_CCR_MSIZE_8 | DMA_CCR_PSIZE_8 | DMA_CCR_DIR | DMA_CCR_MINC;
}
extern "C" void DMA1_Channel6_IRQHandler(void)
{
DMA1->IFCR = DMA_IFCR_CTCIF6;
USART2->CR3 = 0;
DMA1_Channel6->CCR = DMA_CCR_MSIZE_8 | DMA_CCR_PSIZE_8 | DMA_CCR_MINC;
// Тут данные получены и лежат в приёмном буфере
}
Пн ноя 19, 2018 17:43:36
Если известна длина пакета - настраиваем дма и в прерывании по окончанию трансфера имеем весь пакет в буфере.
USART2->DR; USART2->DR;
Пн ноя 19, 2018 19:20:50
Пн ноя 19, 2018 20:12:20
Вт ноя 20, 2018 05:36:50
while(1){
USART2->CR1 &=~USART_CR1_UE;
USART2->CR1 |= USART_CR1_UE; // USart Enable
//----------
RS485_OUT //Переключил на выход
while(!(USART2->SR&USART_SR_TXE)){}
USART2->DR=0x11;
while(!(USART2->SR&USART_SR_TC)){}
//----------
RS485_IN //настраиваем на выход
Debug2_1
Debug2_0
//----------
DMA1_Channel6->CCR=0;
//----------
USART2->SR=0;
USART2->CR3=USART_CR3_DMAR;
(void)USART2->DR;
(void)USART2->DR;
DMA1_Channel6->CNDTR=sizeof(Resp_pack_t); //Принимать по максимум, сколько есть
DMA1_Channel6->CMAR = (uint32_t)&Receive_pack[0];
DMA1_Channel6->CCR=DMA_CCR1_TCIE|DMA_CCR6_MINC|DMA_CCR1_EN;
DMA1->IFCR=DMA_IFCR_CGIF6;
//----------
while(Receive==0){}
Receive=0;
//while(!(DMA1->ISR & DMA_ISR_TCIF6)){}
//while(!(RS485_USART->SR&USART_SR_RXNE)){}
Debug2_1
Debug2_0
//----------
if(Receive_pack[0]==0x11){
if(Receive_pack[49]==0x13){ //пакет принят правильно
NOP;
//----------
}
}else{
NOP; //!!!!!!!!!!!!!! Тут смотрю как принялся пакет
}
}
}
//==========================
/*
* @Описание: Описание функции.
* @Параметр:
* @Возврат: Нету
*/
void DMA1_Channel6_IRQHandler(void)
{
DMA1->IFCR = DMA_IFCR_CGIF6;
Receive=1;
//DMA1_Channel6->CCR =DMA_CCR6_MINC;
USART2->CR3=0;
}
USART2->CR1 &=~USART_CR1_UE;
USART2->CR1 |= USART_CR1_UE; // USart Enable
Вт ноя 20, 2018 06:59:10
Вт ноя 20, 2018 08:27:36
DMA1_Channel6->CCR=0;
(void)USART2->DR;(void)USART2->DR;
DMA1_Channel6->CNDTR=sizeof(Resp_pack_t);
DMA1_Channel6->CMAR = (uint32_t)&Receive_pack[0];
DMA1_Channel6->CCR=DMA_CCR1_TCIE|DMA_CCR6_MINC|DMA_CCR1_EN;
DMA1->IFCR = DMA_IFCR_CGIF6;
USART2->SR=0;
USART2->CR3=USART_CR3_DMAR;
//----------
while(!(DMA1->ISR & DMA_ISR_TCIF6)){}
DMA1_Channel6->CCR=0;
USART2->CR3=0;
Вт ноя 20, 2018 10:27:19
Вт ноя 20, 2018 10:35:42