// ============================================================================= // 功能: 打印函数,直接写串口方式,目前主要由djy_printk独享,用于调试关键代码段 // 参数: 所需要发送的字符串,当然,前提是你提供的一定是字符串'\0'结束 // 返回: 发送的字节个数 // ============================================================================= u32 Uart_SendServiceDirectly(char *str) { u32 result=0,len,timeout=100*mS; tagUartReg *Reg; u32 BaseAddr,Port; if(!strcmp(gc_pCfgStddevName,"UART0") && (sUartInited & (0x01 << CN_UART0))) { BaseAddr = CN_UART0_BASE; Port = CN_UART0; } else if(!strcmp(gc_pCfgStddevName,"UART1")&& (sUartInited & (0x01 << CN_UART1))) { BaseAddr = CN_UART1_BASE; Port = CN_UART1; } else if(!strcmp(gc_pCfgStddevName,"USART0")&& (sUartInited & (0x01 << CN_USART0))) { BaseAddr = CN_USART0_BASE; Port = CN_USART0; } else if(!strcmp(gc_pCfgStddevName,"USART1")&& (sUartInited & (0x01 << CN_USART1))) { BaseAddr = CN_USART1_BASE; Port = CN_USART1; } else return 0; len = strlen(str); Reg = (tagUartReg *)BaseAddr; __UART_SendIntDisable(Reg,s_UART_DmaUsed[Port]); //disable send INT for(result=0; result < len; result ++) { // 超时或者发送缓冲为空时退出 while((false == __UART_TxTranEmpty(Reg))&& (timeout > 0)) { timeout--; Djy_DelayUs(1); } if(timeout == 0) break; Reg->UART_THR = str[result]; } __UART_SendIntEnable(Reg,s_UART_DmaUsed[Port]); //enable send INT return result; }
// ============================================================================= // 功能: 串口设备的控制函数,与具体的硬件寄存器设置相关 // 参数: Reg,UART的寄存器基址. // cmd,操作类型 // data,含义依cmd而定 // 返回: 无意义. // ============================================================================= ptu32_t __UART_Ctrl(tagUartReg *Reg,u32 cmd, u32 data1,u32 data2) { u8 Port; switch((u32)Reg) { case CN_UART0_BASE: Port = CN_UART0;break; case CN_UART1_BASE: Port = CN_UART1;break; case CN_USART0_BASE: Port = CN_USART0;break; case CN_USART1_BASE: Port = CN_USART1;break; default:return 0; } switch(cmd) { case CN_UART_START: __UART_RecvIntEnable(Reg,s_UART_DmaUsed[Port]); __UART_SendIntEnable(Reg,s_UART_DmaUsed[Port]); break; case CN_UART_STOP: __UART_RecvIntDisable(Reg,s_UART_DmaUsed[Port]); __UART_SendIntDisable(Reg,s_UART_DmaUsed[Port]); break; case CN_UART_SET_BAUD: //设置Baud __UART_SetBaud(Reg,data1); break; case CN_UART_RX_PAUSE: //暂停接收 __UART_RecvIntEnable(Reg,s_UART_DmaUsed[Port]); break; case CN_UART_RX_RESUME: //恢复接收 __UART_RecvIntDisable(Reg,s_UART_DmaUsed[Port]); break; case CN_UART_RECV_HARD_LEVEL: //因为UART没有FIFO,因此配置DMA接收 __UART_dma_recv_config(Reg,Port,data1); break; case CN_UART_HALF_DUPLEX_SEND: __UART_half_duplex_send(Port); break; case CN_UART_HALF_DUPLEX_RECV: __UART_half_duplex_recv(Port); break; case CN_UART_DMA_USED: case CN_UART_DMA_UNUSED: __UART_DMA_Config(Reg,cmd,Port); break; default: break; } return 0; }
// ============================================================================= // 功能: 启动串口发送,直接发送FIFO大小的数据,并产生发送空中断,在中断中将缓冲区中的 // 数据完成所有数据的发送,相当于启动了一次发送功能;分为DMA方式和非DMA方式 // 参数: Reg,被操作的串口寄存器基址 // timeout,超时时间,微秒 // 返回: 发送的字节数 // ============================================================================= u32 __UART_SendStart(tagUartReg *Reg,u32 timeout) { u8 Port; switch((u32)Reg) { //UART0和UART1的FIFO深度为8,而其他的为1 case CN_UART0_BASE: Port = CN_UART0; break; case CN_UART1_BASE:Port = CN_UART1;break; case CN_USART0_BASE:Port = CN_USART0;break; case CN_USART1_BASE:Port = CN_USART1; break; default:return 0; } __UART_SendIntEnable(Reg,s_UART_DmaUsed[Port]); return 1; }
// ============================================================================= // 功能: 这个是直接写串口函数,不会经过事件弹出 // 参数: Reg,UART的寄存器基址. // send_buf,被发送的缓冲数据 // len,发送的数据字节数 // timeout,超时时间,微秒 // 返回: 发送的个数 // ============================================================================= u32 __UART_SendDirectly(tagUartReg* Reg,u8 *send_buf,u32 len,u32 timeout) { u32 result,Port; switch((u32)Reg) { //UART0和UART1的FIFO深度为8,而其他的为1 case CN_UART0_BASE:Port = CN_UART0; break; case CN_UART1_BASE:Port = CN_UART1;break; case CN_USART0_BASE:Port = CN_USART0;break; case CN_USART1_BASE:Port = CN_USART1; break; default:return 0; } __UART_SendIntDisable(Reg,s_UART_DmaUsed[Port]); // __UART_half_duplex_send(Port);//硬件使能发送 if(s_UART_DmaUsed[Port] == false) { for(result=0; result < len; result ++) { while((0 == __UART_TxTranEmpty(Reg)) && (timeout > 0))//超时或者发送缓冲为空时退出 { timeout--; Djy_DelayUs(1); } if(timeout == 0) break; Reg->UART_THR = send_buf[result]; } // //等待发送完再将485通信转为接收 // while((0 == __UART_TxTranEmpty(Reg)) // && (timeout > 0))//超时或者发送缓冲为空时退出 // { // timeout--; // Djy_DelayUs(1); // } // if(timeout == 0) // result = 0; } else { Reg->UART_PTCR = (1<<9);//disable dma send first if((Reg->UART_TCR==0)&&(Reg->UART_TNCR==0)) { Reg->UART_TPR = (uint32_t)send_buf; Reg->UART_TCR = len; Reg->UART_PTCR = (1<<8);//dma tx enbale } else result = 0; //直接发送方式,采用阻塞的DMA发送 while((!__UART_TxTranEmpty(Reg)) && (timeout > 0)) { timeout--; Djy_DelayUs(1); } if(timeout == 0) result = 0; } __UART_SendIntEnable(Reg,s_UART_DmaUsed[Port]); // __UART_half_duplex_recv(Port);//硬件使能接收 return result; }