Esempio n. 1
0
// =============================================================================
// 功能: 打印函数,直接写串口方式,目前主要由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;
}
Esempio n. 2
0
// =============================================================================
// 功能: 串口设备的控制函数,与具体的硬件寄存器设置相关
// 参数: 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;
}
Esempio n. 3
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;
}
Esempio n. 4
0
// =============================================================================
// 功能: 这个是直接写串口函数,不会经过事件弹出
// 参数: 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;
}