1) отправляю запрос 1 байт
2) принимаю посылку через DMA в 50 байт
Смотрю в анализаторе все нормально приходит, через 9-300 ms
А в программе почему то последний байт считывается как первый(остальные правильно, кроме последнего его нету) и из за этого вся посылка сдвигается, и контрольные байты (стартовый стоповый ) не правильные.
Работу с USART сделал через calback:
Код: Выделить всё
// Отправляю запрос
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; //Включаем
}
}
Такое чувство, что флаг RXNE перед включением DMA не сбрасывается и после того как DMA сразу отрабатывает запрос, и записывает в буфер то что было в регистре DR, а там как раз последний байт от предыдущей посылки.


