124 lines
4.0 KiB
C
124 lines
4.0 KiB
C
#include "../main/SystemInclude.h"
|
||
|
||
const u32 baudRateVaule[6] ={4800, 9600, 19200, 38400, 57600, 115200};
|
||
|
||
COM_DATA_TypeDef comState;
|
||
|
||
void StartDMAForRxdMainUartData(void)
|
||
{
|
||
#ifndef ENABLE_TURN_OFF_RS485
|
||
#pragma message("[undefined] ENABLE_TURN_OFF_RS485")
|
||
#elif(ENABLE_TURN_OFF_RS485)
|
||
RS485_Enable_RX();
|
||
#endif
|
||
comState.state.ReceivedData = 0 ; //重置接收完成标志
|
||
comState.state.SendingData = 0 ; //重置发送中标志
|
||
DMA_UART_AnyLength_Rx_Init(baudRateVaule[baudRate]);//初始化UART DMA接收并开始接收
|
||
//接收指针指向接收数组
|
||
comState.state.ReceivedData = 0 ;//接收完成标志位
|
||
}
|
||
|
||
|
||
void DMAForUART_Tx_Callback(void)
|
||
{
|
||
comState.state.SendingData = 0 ; //UART DMA发送完成
|
||
LHL_DMA_Stop(&DMA_Handle_UartTx); //关闭DMA发送数据
|
||
RestartDMAForRxdMainUartData(); //切换回接收
|
||
}
|
||
|
||
void StartDMAForTxdMainUartData(void)
|
||
{
|
||
LHL_DMA_Stop(&DMA_Handle_UartRx);//关闭DMA接收数据
|
||
|
||
#ifndef ENABLE_TURN_OFF_RS485
|
||
#pragma message("[undefined] ENABLE_TURN_OFF_RS485")
|
||
#elif(ENABLE_TURN_OFF_RS485)
|
||
RS485_Enable_TX();
|
||
#endif
|
||
|
||
comState.state.SendingData = 1 ;
|
||
comState.TxLenth = MBBuf.TxdLen;
|
||
// memcpy(comState.TxdData, MBBuf.TxPointer, comState.TxLenth );
|
||
|
||
// for (u8 i=0;i<comState.TxLenth;i++) printf("%c",comState.TxdData[i]);
|
||
DMA_UART_Tx_Init();//初始化DMA 并开始传输
|
||
DMA_register_irq_callback(DMA_CHANNEL_UART_Tx,NULL,DMAForUART_Tx_Callback);//注册传输完成中断
|
||
}
|
||
|
||
|
||
void RestartDMAForRxdMainUartData(void)
|
||
{
|
||
#ifndef ENABLE_TURN_OFF_RS485
|
||
#pragma message("[undefined] ENABLE_TURN_OFF_RS485")
|
||
#elif(ENABLE_TURN_OFF_RS485)
|
||
RS485_Enable_RX();
|
||
#endif
|
||
|
||
comState.state.ReceivedData = 0 ;//接收完成标志位
|
||
|
||
DMA_DMAMUX_CFG(DMA_CHANNEL_UART_Rx,REQUEST_SOURCE_UART_RX);//将DMAMUX链接回到串口接收通道
|
||
DMA_Handle_UartRx.Init.Dest_Address = (uint32_t)comState.RxdData;//重置DMA目标地址到接收数组起始地址
|
||
LHL_DMA_GenerateTCD(&DMA_Handle_UartRx, &DMA_Handle_UartRx.Init, (DMA_DES_N_TypeDef *)(DMA_DES_N_BASE + 32u * DMA_Handle_UartRx.Channel)); /* 写入DMA寄存器 */
|
||
|
||
LHL_DMA_Start(&DMA_Handle_UartRx); /*开始接收*/
|
||
}
|
||
|
||
//void RestartDMAForTxdMainUartData(void)
|
||
//{
|
||
// LHL_DMA_Stop(&DMA_Handle_UartRx);//关闭DMA接收数据
|
||
|
||
// comState.state.SendingData = 1 ;
|
||
// comState.TxLenth = MBBuf.TxdLen;
|
||
// memcpy(comState.TxdData, MBBuf.TxPointer, comState.TxLenth );
|
||
//
|
||
// DMA_Handle_UartTx.Init.Src_Address = (uint32_t)&comState.TxdData; // 源:缓存区
|
||
// DMA_Handle_UartTx.Init.Repetition = comState.TxLenth ;
|
||
// LHL_DMA_GenerateTCD(&DMA_Handle_UartTx, &DMA_Handle_UartTx.Init, (DMA_DES_N_TypeDef *)(DMA_DES_N_BASE + 32u * DMA_Handle_UartTx.Channel)); /* 写入DMA寄存器 */
|
||
// LHL_DMA_Start(&DMA_Handle_UartTx);
|
||
// DMA_register_irq_callback(DMA_CHANNEL_UART_Tx,NULL,DMAForUART_Tx_Callback);//注册传输完成中断
|
||
//}
|
||
|
||
void ReceivedDataProcessing(void)
|
||
{
|
||
comState.state.ReceivedData = 0 ; //重置接收完成标志
|
||
Get_UART_Rx_ActualLength();//更新接收长度
|
||
MBBuf.RxdLen = comState.RxLenth; //接收数据长度
|
||
MBBuf.RxPointer = comState.RxdData; //接收数据
|
||
MBBuf.TxPointer = comState.TxdData; //发送数据
|
||
|
||
if(ModBusProtocolDetection()) //检测到Modbus协议
|
||
{
|
||
ModBusDataProcessing(); //协议处理函数 协议处理后回复数据在MBBuf.RxPointer处move到MBBuf.TxPointer,也就是实际comState.TxdData存储区域
|
||
|
||
StartDMAForTxdMainUartData();//回复帧
|
||
}
|
||
else RestartDMAForRxdMainUartData();//继续重新接收(能够使通信失败时重新复位)
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*********************************************************************************************************************************************/
|
||
/* 带RS485的控制 */
|
||
/*********************************************************************************************************************************************/
|
||
#ifndef ENABLE_TURN_OFF_RS485
|
||
#pragma message("[undefined] ENABLE_TURN_OFF_RS485")
|
||
#elif(ENABLE_TURN_OFF_RS485)
|
||
void RS485_Enable_TX(void)
|
||
{
|
||
RS485DE_OUTPUT();
|
||
ENABLE_TXD();
|
||
}
|
||
|
||
void RS485_Enable_RX(void)
|
||
{
|
||
RS485DE_OUTPUT();
|
||
ENABLE_RXD();
|
||
}
|
||
#endif
|