我想用DAM做USRAT1 发送,在发送下一个数据包之前,首先应该判断上一个数据包是否发送完毕。或者一个DMA通道分时复用IIC和USART通信,需要对上次的传输是否完成进行判断。
使用了下面的判断语句: while (DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET); //等待上一个数据帧发送完毕 但是仿真的时候老是停留在这个地方,去掉这个语句就能使用,请问如何实现上述功能,完全的程序如下: ******************************************************************************** *函数原型: void RS232_SendData(uint8 comm,uint8 Len) *参数说明: comm : 命令字 * Len : 帧数据长度 *返回值: 无 *说明: 将待发送的数据发送出去 ********************************************************************************/ void RS232_SendData(u8 comm,u8 Len) //将待发送的数据发送出去 { DMA_InitTypeDef DMA_InitStructure; u8 i = 0;
struct DATA_BUF *send_pk = &TXD_BUF[0]; //初始化定义
//while (DMA_GetFlagStatus(DMA1_FLAG_TC4) == RESET); //等待上一个数据帧发送完毕 send_pk->IP_addr = IP_ADDR; //设置发送从机的IP地址 send_pk->command = comm; //设置反回发送命令, send_pk->length = Len & GET_LEN; //设置帧数据长度 send_pk->state &= ~GET_ERROR; //设置错误标志位,无
RS232_TxBuffer[0] = UART_START0; RS232_TxBuffer[1] = UART_START1; RS232_TxBuffer[2] = IP_ADDR; //设置发送从机的IP地址 RS232_TxBuffer[3] = comm; //设置反回发送命令, RS232_TxBuffer[4] = Len & GET_LEN; //设置帧数据长度 for(i=0;i<Len;i++) { RS232_TxBuffer[i+5] = send_pk->byte; }
RS232_TxBuffer[Len+5] = RS232_SetSum(send_pk); //计算校验和
DMA_DeInit(DMA1_Channel4); DMA_InitStructure.DMA_PeripheralBaseAddr = USART1_DR_Base; DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RS232_TxBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = Len+6; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel4, &DMA_InitStructure);
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE); //DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE); DMA_Cmd(DMA1_Channel4, ENABLE); } |